Android進程間通訊——多進程共用SharedPreferences

Android進程間通訊——多進程共用SharedPreferences

600人閱讀 評論(0) 收藏 舉報
本文章已收錄於:
category_icon.jpg分類:

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

在使用SharedPreferences的時候,大家都可以看到它有幾個讀寫的標誌位,比如 PRIVATE、READABLE、WRITEABLE等。

在使用SharedPreferences進行進程數據共享時,我們發現,有些雖然過時了,但是實際上還是可以用的。

只是Google不建議大家這麼幹了。所以這篇文章只是一個介紹實現,科普。


怎麼實現呢?

先新建兩個Android工程,分別命名爲:ShareprefenceShareA(後文稱爲A)、ShareprefenceShareB(後文稱爲B)。

我們想要實現的目標是,在A中寫入到Shareprefence中的內容,在B中可以讀到。

先貼出A中代碼:

  1. package com.example.shareprefencesharea;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.EditText;  
  10. import android.widget.Toast;  
  11.   
  12. public class MainActivity extends Activity {  
  13.   
  14.     Button btn,btn1;  
  15.     EditText editText;  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.         btn=(Button)findViewById(R.id.btn);  
  21.         btn1=(Button)findViewById(R.id.btn1);  
  22.         editText=(EditText)findViewById(R.id.text);  
  23.           
  24.         final SharedPrefencesImp imp=new SharedPrefencesImp(MainActivity.this);  
  25.           
  26.         btn.setOnClickListener(new OnClickListener() {  
  27.               
  28.             @Override  
  29.             public void onClick(View v) {  
  30.                 // TODO Auto-generated method stub  
  31.                 imp.SetSharedPrefences("info", editText.getText().toString());  
  32.             }  
  33.         });  
  34.           
  35.         btn1.setOnClickListener(new OnClickListener() {  
  36.               
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 // TODO Auto-generated method stub  
  40.                 String resultimp.GetSharedPrefences("info");  
  41.                 Toast.makeText(getApplicationContext(), result, 0).show();  
  42.             }  
  43.         });  
  44.     }  
  45.   
  46.   
  47. }  
save_snippets.png
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的代碼:

  1. package com.example.shareprefencesharea;  
  2.   
  3. import android.content.Context;  
  4. import android.content.SharedPreferences;  
  5.   
  6. public class SharedPrefencesImp {  
  7.   
  8.      private Context context;  
  9.         private String settingString="SharedPrefencesXml";  
  10.         public SharedPrefencesImp(Context context)  
  11.         {  
  12.             this.context=context;  
  13.         }  
  14.         /**  
  15.          * 設置sharedprefences   
  16.          * @param keyname     
  17.          * @param keyvalue  
  18.          */  
  19.         public void  SetSharedPrefences(String keyname,String keyvalue)  
  20.         {  
  21.             //SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(context).edit();寫法也可以如此,默認名稱爲包名  
  22.             SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();  
  23.             editor.putString(keyname, keyvalue);  
  24.             editor.commit();  
  25.   
  26.         }  
  27.         /**  
  28.          * 獲取sharedprefences中key爲keyname的值  
  29.          * @param keyname  
  30.          * @return  
  31.          */  
  32.         public String GetSharedPrefences(String keyname)  
  33.         {  
  34.             SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE);  
  35.             String resultStringsharedPreferences.getString(keyname, "");  
  36.             return resultString;  
  37.         }  
  38. }  
save_snippets.png
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):

  1. SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();  
save_snippets_01.png
 SharedPreferences.Editor editor=context.getSharedPreferences(settingString, Context.MODE_WORLD_READABLE).edit();


那麼在另一個app中(B),該如何調用A中設置到shareprefence中的數據呢?

B的主程序代碼如下:

  1. package com.example.shareprefenceshareb;  
  2.   
  3.   
  4. import android.os.Bundle;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. public class MainActivity extends Activity {  
  14.   
  15.     Button btn,btn1;  
  16.     EditText editText;  
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.         btn=(Button)findViewById(R.id.btn);  
  22.         btn1=(Button)findViewById(R.id.btn1);  
  23.         editText=(EditText)findViewById(R.id.text);  
  24.           
  25.         Context c=null;  
  26.           try {    
  27.               //com.example.shareprefencesharea 是A的包名  
  28.               //Context.CONTEXT_IGNORE_SECURITY 忽略安全檢查標誌  
  29.              c = createPackageContext("com.example.shareprefencesharea", Context.CONTEXT_IGNORE_SECURITY);    
  30.         } catch (SecurityException e) {    
  31.             e.printStackTrace();    
  32.         } catch (Exception e) {    
  33.             e.printStackTrace();    
  34.         }  
  35.           
  36.         final SharedPrefencesImp imp=new SharedPrefencesImp(c);  
  37.         btn1.setOnClickListener(new OnClickListener() {  
  38.               
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 String resultimp.GetSharedPrefences("info");  
  43.                 Toast.makeText(MainActivity.this, result, 0).show();  
  44.             }  
  45.         });  
  46.     }  
  47.   
  48. }  
save_snippets.png
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的代碼如下:

  1. package com.example.shareprefenceshareb;  
  2.   
  3. import android.content.Context;  
  4. import android.content.SharedPreferences;  
  5. import android.content.pm.PackageManager.NameNotFoundException;  
  6.   
  7. public class SharedPrefencesImp {  
  8.   
  9.      private Context context;  
  10.         private String settingString="SharedPrefencesXml";  
  11.         public SharedPrefencesImp(Context context)  
  12.         {  
  13.                
  14.             this.context=context;  
  15.         }  
  16.         /**  
  17.          * 獲取sharedprefences中key爲keyname的值  
  18.          * @param keyname  
  19.          * @return  
  20.          */  
  21.         public String GetSharedPrefences(String keyname)  
  22.         {  
  23.             SharedPreferences sharedPreferences=context.getSharedPreferences(settingString, context.MODE_PRIVATE);  
  24.             String resultStringsharedPreferences.getString(keyname, "");  
  25.             return resultString;  
  26.         }  
  27. }  
save_snippets.png
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

我的同類文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章