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

yangxi_001發表於2016-07-21

轉自: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

相關文章