Android不同應用之間數據的共享有許多方式,但是我覺得還是使用sharedPreference比較簡單和輕量級。如果程序B想要訪問程序A的sharedPreference可以通過下面的語句來實現:
try { AContext =createPackageContext(A_PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY); } catch (NameNotFoundException e) { Log.e(TAG, "find package error!"); } SharedPreferences sp = AContext.getSharedPreferences(PREFERENCES_NAME, Context.MODE_WORLD_READABLE); sp.getInt(PREF_NAME, 0);
當然在A程序里創建SharedPreference的時候也需要使用Context.MODE_WORLD_READABLE屬性。另外 SharedPreference還有Context.MODE_WORLD_WRITEABLE屬性。根據SDK的解釋,就是允許別的應用程序來對 SharedPreference進行寫操作。但是在實際程序實驗中發現即使加上了這個屬性,寫操作也是無法成功的,會提示一個錯誤:Couldn't rename file /data/data/....PREFERENCES_NAME.XML to /data/data/....PREFERENCES_NAME.XML.bak。這個錯誤的原因應該是很明確了,程序B在程序A的目錄里面沒有創建 和重命名文件的權限。
那么到底要怎么樣才能讓程序B在程序A的SharedPreferences里面寫東西呢,其實很簡單,在manifest.xml里面將兩個應用程序 的android:sharedUserId屬性設為相同的就可以了。而且SharedPreference的屬性也不需要 Context.MODE_WORLD_WRITEABLE了,只需要Context.MODE_PRIVATE也可以完成讀寫操作。
示例:
保存或創建一個preference:
package edu.cczu.SimplePreference; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.widget.EditText; public class SimplePreferenceActivity extends Activity { private EditText nameText; private EditText ageText; private EditText heightText; public static final String PREFER_NAME = "SaveSet"; public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nameText = (EditText)findViewById(R.id.name); ageText = (EditText)findViewById(R.id.age); heightText = (EditText)findViewById(R.id.height); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); loadSharedPreferences(); } private void loadSharedPreferences() { // TODO Auto-generated method stub SharedPreferences share = getSharedPreferences(PREFER_NAME, MODE); String name = share.getString("Name", "Tom"); int age = share.getInt("Age", 20); float height = share.getFloat("Height", 1.81f); nameText.setText(name); ageText.setText(String.valueOf(age)); heightText.setText(String.valueOf(height)); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); saveSharedPreferences(); } private void saveSharedPreferences() { // TODO Auto-generated method stub SharedPreferences share = getSharedPreferences(PREFER_NAME, MODE); SharedPreferences.Editor editor = share.edit(); editor.putString("Name", nameText.getText().toString()); editor.putInt("Age", Integer.parseInt(ageText.getText().toString())); editor.putFloat("Height", Float.parseFloat(heightText.getText().toString())); editor.commit(); } }
其他應用來讀取數據:
package edu.cczu.SharePreference; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; public class SharePreferenceActivity extends Activity { public static final String PREFERENCE_PACKAGE = "edu.cczu.SimplePreference"; public static final String PREFERENCE_NAME = "SaveSet"; public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE; private TextView labelView; private static String TAG = "LIFECYCLE"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Context c = null; labelView = (TextView)findViewById(R.id.label); try { c = this.createPackageContext(PREFERENCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } SharedPreferences sharedPreferences = c.getSharedPreferences(PREFERENCE_NAME, MODE); String name = sharedPreferences.getString("Name","Tom"); int age = sharedPreferences.getInt("Age", 20); float height = sharedPreferences.getFloat("Height",1.81f); String msg = ""; msg += "姓名:" + name + "\n"; msg += "年齡:" + String.valueOf(age) + "\n"; msg += "身高:" + String.valueOf(height) + "\n"; labelView.setText(msg); Toast.makeText(this, name, Toast.LENGTH_SHORT).show(); Log.i(TAG, "(1) onCreate()"); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.i(TAG, "(2) onStart()"); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.i(TAG, "(8) onStop()"); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.i(TAG, "(9) onDestroy()"); //System.exit(0); } }
完