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

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

在使用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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值