您的位置:首页 > 移动开发 > Android开发

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

2016-07-21 19:18 465 查看

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

2016-07-21 19:18
600人阅读 评论(0)
收藏
举报

本文章已收录于:


分类:
android数据共享(3)




作者同类文章X

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

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

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

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

怎么实现呢?

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

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

先贴出A中代码:

[html]
view plain
copy

print?





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



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的代码:

[html]
view plain
copy

print?





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;  
        }  
}  



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):

[html]
view plain
copy

print?





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的主程序代码如下:

[html]
view plain
copy

print?





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



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的代码如下:

[html]
view plain
copy

print?





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;  
        }  
}  



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权限之sharedUserId和签名 .

下一篇Android 获取全局Context的技巧

我的同类文章

android数据共享(3)

http://blog.csdn.net
Android权限之sharedUserId和签名 .2016-07-21阅读291

Android 不同应用通过SharedPreference实现共享数据2016-07-21阅读91

Android-sharedUserId数据权限2016-07-21阅读84
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息