Android进程间通讯——多进程共用SharedPreferences
来源:互联网 发布:2016年7月经济数据 编辑:程序博客网 时间:2024/06/05 17:40
上一篇文章我们用的是广播在进程之间通讯并传递信息,在上一篇我们也说了四大组件都支持进程间通讯。
(1)ContentProvider,这个我们在前面文章中有做过系统ContentProvider以及自定义ContentProvider在进程间通讯;
(2)Service,在前面我们介绍的AIDL进程间通讯,就是涉及该组件。
(3)BroadcastReceiver,广播,在上一篇也介绍了。
那么,SharedPreferences是否支持并且可以用作进程间通讯呢?
理论上是可以的。在使用SharedPreferences的时候,大家都可以看到它有几个读写的标志位,比如 PRIVATE、READABLE、WRITEABLE等。
在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。
只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。
怎么实现呢?
先新建两个android工程,分别命名为:ShareprefenceShareA(后文称为A)、ShareprefenceShareB(后文称为B)。
我们想要实现的目标是,在A中写入到Shareprefence中的内容,在B中可以读到。
先贴出A中代码:
package com.example.shareprefencesharea;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {Button btn,btn1;EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=(Button)findViewById(R.id.btn);btn1=(Button)findViewById(R.id.btn1);editText=(EditText)findViewById(R.id.text);final SharedPrefencesImp imp=new SharedPrefencesImp(MainActivity.this);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubimp.SetSharedPrefences("info", editText.getText().toString());}});btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString result= imp.GetSharedPrefences("info");Toast.makeText(getApplicationContext(), result, 0).show();}});}}以上代码做的是set、get操作。
以下是SharedPrefencesImp的代码:
package com.example.shareprefencesharea;import android.content.Context;import android.content.SharedPreferences;public class SharedPrefencesImp { private Context context; private String settingString="SharedPrefencesXml"; public SharedPrefencesImp(Context context) { this.context=context; } /** * 设置sharedprefences * @param keyname * @param keyvalue */ public void SetSharedPrefences(String keyname,String keyvalue) { //SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(context).edit();写法也可以如此,默认名称为包名 SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit(); editor.putString(keyname, keyvalue); editor.commit(); } /** * 获取sharedprefences中key为keyname的值 * @param keyname * @return */ public String GetSharedPrefences(String keyname) { SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE); String resultString= sharedPreferences.getString(keyname, ""); return resultString; }}
与传统的本进程中使用的shareprefence不同的地方在于,我们使用了MODE_WORLD_READABLE(传统本进程使用,一般使用MODE_PRIVATE):
SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();
B的主程序代码如下:
package com.example.shareprefenceshareb;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {Button btn,btn1;EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=(Button)findViewById(R.id.btn);btn1=(Button)findViewById(R.id.btn1);editText=(EditText)findViewById(R.id.text);Context c=null; try { //com.example.shareprefencesharea 是A的包名 //Context.CONTEXT_IGNORE_SECURITY 忽略安全检查标志 c = createPackageContext("com.example.shareprefencesharea", Context.CONTEXT_IGNORE_SECURITY); } catch (SecurityException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }final SharedPrefencesImp imp=new SharedPrefencesImp(c);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString result= imp.GetSharedPrefences("info");Toast.makeText(MainActivity.this, result, 0).show();}});}}重点在做了注释的这一行。
SharePrefencesImp的代码如下:
package com.example.shareprefenceshareb;import android.content.Context;import android.content.SharedPreferences;import android.content.pm.PackageManager.NameNotFoundException;public class SharedPrefencesImp { private Context context; private String settingString="SharedPrefencesXml"; public SharedPrefencesImp(Context context) { this.context=context; } /** * 获取sharedprefences中key为keyname的值 * @param keyname * @return */ public String GetSharedPrefences(String keyname) { SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, context.MODE_PRIVATE); String resultString= sharedPreferences.getString(keyname, ""); return resultString; }}
综上,我们可以看到,进程间共用shareprefence是可以实现的。只是有个特别的地方,需要把第一个app的包名对应的context传入到第二个app中,否则是取不到数据的。
源码:多进程共用shareprefence
0 0
- Android进程间通讯——多进程共用SharedPreferences
- Android进程间通讯——多进程共用SharedPreferences
- Android进程间通讯——多进程共用SharedPreferences
- Android进程间通讯——AIDL
- Android进程间通讯——ContentProvider
- 进程间通讯[android]
- Android进程间通讯
- Android进程间通讯
- android SharedPreferences 多进程间数据共享
- 进程间通讯—管道
- Android之进程通讯——广播
- Android之进程通讯——广播
- Android进程间通讯——Messager(信使)
- Android进程间通讯——Clipboard(剪切板)
- android—binder进程间通讯流程分析
- android aidl 进程间通讯
- android进程间通讯方式
- android IPC 进程间通讯
- Pillow的安装和使用
- Pillow不支持color emoji font!
- 在xcode中设置include和lib路径
- form表单(h5)
- wxpython实现文件拖拽
- Android进程间通讯——多进程共用SharedPreferences
- iOS模拟器的应用沙盒在MAC中的位置
- iOS Programming GitHub
- Git入门操作
- 关于Logger
- EL表达式调用错误及获取List长度
- 内容可循环重用的ScrollView
- iOS海哥开发笔记(MapKit的使用)
- UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)