当前位置:   article > 正文

Android进程间通讯——多进程共用SharedPreferences_android sharedpreferences多进程

android sharedpreferences多进程

Android进程间通讯——多进程共用SharedPreferences

600人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:

转自:http://blog.csdn.net/yangzhaomuma/article/details/50718191

在使用SharedPreferences的时候,大家都可以看到它有几个读写的标志位,比如 PRIVATE、READABLE、WRITEABLE等。

在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。

只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。


怎么实现呢?

先新建两个Android工程,分别命名为:ShareprefenceShareA(后文称为A)、ShareprefenceShareB(后文称为B)。

我们想要实现的目标是,在A中写入到Shareprefence中的内容,在B中可以读到。

先贴出A中代码:

  1. package com.example.shareprefencesharea;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     Button btn,btn1;  
  15.     EditText editText;  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.         btn=(Button)findViewById(R.id.btn);  
  21.         btn1=(Button)findViewById(R.id.btn1);  
  22.         editText=(EditText)findViewById(R.id.text);  
  23.           
  24.         final SharedPrefencesImp imp=new SharedPrefencesImp(MainActivity.this);  
  25.           
  26.         btn.setOnClickListener(new OnClickListener() {  
  27.               
  28.             @Override  
  29.             public void onClick(View v) {  
  30.                 // TODO Auto-generated method stub  
  31.                 imp.SetSharedPrefences("info", editText.getText().toString());  
  32.             }  
  33.         });  
  34.           
  35.         btn1.setOnClickListener(new OnClickListener() {  
  36.               
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 // TODO Auto-generated method stub  
  40.                 String resultimp.GetSharedPrefences("info");  
  41.                 Toast.makeText(getApplicationContext(), result, 0).show();  
  42.             }  
  43.         });  
  44.     }  
  45.   
  46.   
  47. }  
  1. package com.example.shareprefencesharea;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.Menu;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.Toast;
  10. public class MainActivity extends Activity {
  11. Button btn,btn1;
  12. EditText editText;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. btn=(Button)findViewById(R.id.btn);
  18. btn1=(Button)findViewById(R.id.btn1);
  19. editText=(EditText)findViewById(R.id.text);
  20. final SharedPrefencesImp imp=new SharedPrefencesImp(MainActivity.this);
  21. btn.setOnClickListener(new OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. // TODO Auto-generated method stub
  25. imp.SetSharedPrefences("info", editText.getText().toString());
  26. }
  27. });
  28. btn1.setOnClickListener(new OnClickListener() {
  29. @Override
  30. public void onClick(View v) {
  31. // TODO Auto-generated method stub
  32. String result= imp.GetSharedPrefences("info");
  33. Toast.makeText(getApplicationContext(), result, 0).show();
  34. }
  35. });
  36. }
  37. }
以上代码做的是set、get操作。

以下是SharedPrefencesImp的代码:

  1. package com.example.shareprefencesharea;  
  2.   
  3. import android.content.Context;  
  4. import android.content.SharedPreferences;  
  5.   
  6. public class SharedPrefencesImp {  
  7.   
  8.      private Context context;  
  9.         private String settingString="SharedPrefencesXml";  
  10.         public SharedPrefencesImp(Context context)  
  11.         {  
  12.             this.context=context;  
  13.         }  
  14.         /**  
  15.          * 设置sharedprefences   
  16.          * @param keyname     
  17.          * @param keyvalue  
  18.          */  
  19.         public void  SetSharedPrefences(String keyname,String keyvalue)  
  20.         {  
  21.             //SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(context).edit();写法也可以如此,默认名称为包名  
  22.             SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();  
  23.             editor.putString(keyname, keyvalue);  
  24.             editor.commit();  
  25.   
  26.         }  
  27.         /**  
  28.          * 获取sharedprefences中key为keyname的值  
  29.          * @param keyname  
  30.          * @return  
  31.          */  
  32.         public String GetSharedPrefences(String keyname)  
  33.         {  
  34.             SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE);  
  35.             String resultStringsharedPreferences.getString(keyname, "");  
  36.             return resultString;  
  37.         }  
  38. }  
  1. package com.example.shareprefencesharea;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. public class SharedPrefencesImp {
  5. private Context context;
  6. private String settingString="SharedPrefencesXml";
  7. public SharedPrefencesImp(Context context)
  8. {
  9. this.context=context;
  10. }
  11. /**
  12. * 设置sharedprefences
  13. * @param keyname
  14. * @param keyvalue
  15. */
  16. public void SetSharedPrefences(String keyname,String keyvalue)
  17. {
  18. //SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(context).edit();写法也可以如此,默认名称为包名
  19. SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();
  20. editor.putString(keyname, keyvalue);
  21. editor.commit();
  22. }
  23. /**
  24. * 获取sharedprefences中key为keyname的值
  25. * @param keyname
  26. * @return
  27. */
  28. public String GetSharedPrefences(String keyname)
  29. {
  30. SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE);
  31. String resultString= sharedPreferences.getString(keyname, "");
  32. return resultString;
  33. }
  34. }

与传统的本进程中使用的shareprefence不同的地方在于,我们使用了MODE_WORLD_READABLE(传统本进程使用,一般使用MODE_PRIVATE):

  1. SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();  
 SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();


那么在另一个app中(B),该如何调用A中设置到shareprefence中的数据呢?

B的主程序代码如下:

  1. package com.example.shareprefenceshareb;  
  2.   
  3.   
  4. import android.os.Bundle;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     Button btn,btn1;  
  16.     EditText editText;  
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         btn=(Button)findViewById(R.id.btn);  
  22.         btn1=(Button)findViewById(R.id.btn1);  
  23.         editText=(EditText)findViewById(R.id.text);  
  24.           
  25.         Context c=null;  
  26.           try {    
  27.               //com.example.shareprefencesharea 是A的包名  
  28.               //Context.CONTEXT_IGNORE_SECURITY 忽略安全检查标志  
  29.              c = createPackageContext("com.example.shareprefencesharea", Context.CONTEXT_IGNORE_SECURITY);    
  30.         } catch (SecurityException e) {    
  31.             e.printStackTrace();    
  32.         } catch (Exception e) {    
  33.             e.printStackTrace();    
  34.         }  
  35.           
  36.         final SharedPrefencesImp imp=new SharedPrefencesImp(c);  
  37.         btn1.setOnClickListener(new OnClickListener() {  
  38.               
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 String resultimp.GetSharedPrefences("info");  
  43.                 Toast.makeText(MainActivity.this, result, 0).show();  
  44.             }  
  45.         });  
  46.     }  
  47.   
  48. }  
  1. package com.example.shareprefenceshareb;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.Toast;
  10. public class MainActivity extends Activity {
  11. Button btn,btn1;
  12. EditText editText;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. btn=(Button)findViewById(R.id.btn);
  18. btn1=(Button)findViewById(R.id.btn1);
  19. editText=(EditText)findViewById(R.id.text);
  20. Context c=null;
  21. try {
  22. //com.example.shareprefencesharea 是A的包名
  23. //Context.CONTEXT_IGNORE_SECURITY 忽略安全检查标志
  24. c = createPackageContext("com.example.shareprefencesharea", Context.CONTEXT_IGNORE_SECURITY);
  25. } catch (SecurityException e) {
  26. e.printStackTrace();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. final SharedPrefencesImp imp=new SharedPrefencesImp(c);
  31. btn1.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. // TODO Auto-generated method stub
  35. String result= imp.GetSharedPrefences("info");
  36. Toast.makeText(MainActivity.this, result, 0).show();
  37. }
  38. });
  39. }
  40. }
重点在做了注释的这一行。

SharePrefencesImp的代码如下:

  1. package com.example.shareprefenceshareb;  
  2.   
  3. import android.content.Context;  
  4. import android.content.SharedPreferences;  
  5. import android.content.pm.PackageManager.NameNotFoundException;  
  6.   
  7. public class SharedPrefencesImp {  
  8.   
  9.      private Context context;  
  10.         private String settingString="SharedPrefencesXml";  
  11.         public SharedPrefencesImp(Context context)  
  12.         {  
  13.                
  14.             this.context=context;  
  15.         }  
  16.         /**  
  17.          * 获取sharedprefences中key为keyname的值  
  18.          * @param keyname  
  19.          * @return  
  20.          */  
  21.         public String GetSharedPrefences(String keyname)  
  22.         {  
  23.             SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, context.MODE_PRIVATE);  
  24.             String resultStringsharedPreferences.getString(keyname, "");  
  25.             return resultString;  
  26.         }  
  27. }  
  1. package com.example.shareprefenceshareb;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import android.content.pm.PackageManager.NameNotFoundException;
  5. public class SharedPrefencesImp {
  6. private Context context;
  7. private String settingString="SharedPrefencesXml";
  8. public SharedPrefencesImp(Context context)
  9. {
  10. this.context=context;
  11. }
  12. /**
  13. * 获取sharedprefences中key为keyname的值
  14. * @param keyname
  15. * @return
  16. */
  17. public String GetSharedPrefences(String keyname)
  18. {
  19. SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, context.MODE_PRIVATE);
  20. String resultString= sharedPreferences.getString(keyname, "");
  21. return resultString;
  22. }
  23. }


综上,我们可以看到,进程间共用shareprefence是可以实现的。只是有个特别的地方,需要把第一个app的包名对应的context传入到第二个app中,否则是取不到数据的。


源码:多进程共用shareprefence

0
0
 
 
我的同类文章
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程挑战者/article/detail/60752
推荐阅读
相关标签
  

闽ICP备14008679号