Android进程间通讯——多进程共用SharedPreferences
2016-02-22 17:41
477 查看
上一篇文章我们用的是广播在进程之间通讯并传递信息,在上一篇我们也说了四大组件都支持进程间通讯。
(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中代码:
以下是SharedPrefencesImp的代码:
与传统的本进程中使用的shareprefence不同的地方在于,我们使用了MODE_WORLD_READABLE(传统本进程使用,一般使用MODE_PRIVATE):
那么在另一个app中(B),该如何调用A中设置到shareprefence中的数据呢?
B的主程序代码如下:
SharePrefencesImp的代码如下:
综上,我们可以看到,进程间共用shareprefence是可以实现的。只是有个特别的地方,需要把第一个app的包名对应的context传入到第二个app中,否则是取不到数据的。
源码:多进程共用shareprefence
(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; @Override protected 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() { @Override public void onClick(View v) { // TODO Auto-generated method stub imp.SetSharedPrefences("info", editText.getText().toString()); } }); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String 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();
那么在另一个app中(B),该如何调用A中设置到shareprefence中的数据呢?
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; @Override protected 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() { @Override public void onClick(View v) { // TODO Auto-generated method stub String 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
相关文章推荐
- Android实现不同apk间共享数据的方法(2种方法)
- 内存映射文件 进程间通讯
- java之辨析Session Cookie Servletcontext
- VC++实现Vista和Win7系统低权限程序向高权限程序发消息
- Linux进程间通信——使用共享内存
- 进程同步的机制以及通讯方法
- WatchKit App结构
- Android fragment onHiddenChanged方法详解
- 多个线程访问共享对象和数据的方式
- 云中共享数据的公开校验——1.基于环签名的身份隐私保护
- 云中共享数据的公开校验——2.基于组签名的身份隐私保护+有效支持动态组管理
- 云中共享数据的公开校验——3.基于代理盲签名的身份隐私保护
- Linux笔记 8 -- 进程通讯
- 共享内存实现进程间大数据的交换
- Linux进程间通信方式简介
- 组件间的数据传递
- Linux笔记_进程通讯——概述
- iOS app之间共享数据的几种方法
- iOS app之间共享数据的几种方法
- JSP内置对象---application