Android 不同應用通過SharedPreference實現共享數據


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM