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();


那么在另一个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;@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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 剑网3重置版删除后有残留怎么办 在超市买到变质的水果怎么办 微信官方电话一直打不通怎么办 对方欠货款股东换了不还怎么办 闲鱼买的东西确认收货有问题怎么办 不让微信好友看到吃鸡的名字怎么办 金鹰贵宾积分卡过期了怎么办 小宝机器人一直停在联网界面怎么办 手机版的有道云笔记忘记邮箱怎么办 钡灌肠复查钡剂排空不良怎么办 两个月宝宝灌肠后不排便怎么办 一岁宝宝肠套叠灌肠后拉肚子怎么办 苹果手机自带的天气没有了怎么办? 衣服在洗衣机里忘记拿出来怎么办 苹果se手机系统占内存太大怎么办 客人把饭店老板打了民警怎么办 商场嫌品牌低端不让入驻怎么办 带着孩子坐飞机座位不在一起怎么办 公司老板跑路了员工该怎么办 超市买的衣服防盗扣忘记取了怎么办 在超市买的衣服那个扣没取怎么办啊 超市散称商品条码老记不住怎么办 app账号密码忘记了怎么办注销难 幼儿老师遇到家长比较孩子该怎么办 发的微信公众号内容重复了怎么办 招嫖诈骗微信转账被骗怎么办 朋友在深圳龙岗被传销骗了要怎么办 怀疑家里人被传销组织骗去了怎么办 怀疑家人被骗进传销了该怎么办 b本扣3分了怎么办2018 抖音里面就剩人头的视频怎么办 自学参加普通高考那小高考怎么办 如果小学生长胸只长了一个该怎么办 脸上毛多导致的毛孔粗怎么办 吃了激素药头发掉的厉害怎么办 剪发的剪子中间的螺丝扣总掉怎么办 染完头发后一段时间长新头发怎么办 睡觉头发老被老公压着怎么办 漆盖关节不自在怎么办?吃什么好 摆床头的位置后面是弧形位怎么办 君子兰的根全烂掉了只剩茎怎么办