本来打算把这一篇文章写在【使用SharedPreferences实现简单数据存储】之后的,但由于文章出现的问题是在不同的情况下发生和使用的,所以还是分下来下好了。
SharedPreferences可以让不同程序之间的数据进行共享,当两个应用程序之间数据需要传递或者共享时,可以使用这个方法。本文会使用两个例子SharePreferenceWrite和SharePreferenceRead,前者为一个写SharedPreferences的程序,后者为读取前者写的SharedPreferences。
1、SharedPreferences权限设置,我们在getSharedPreferences方法中第二参数是用来表明我们的SharedPreferences的使用属性的,这个参数可以是下面值:
MODE_PRIVATE=0:只能是当前的应用才能操作文件如果创建的文件已经存在新内容覆盖原内容;
MODE_APPEND=32768:新内容追加到原内容后这个模式也是私有的这个文件只能被创建文件的应用所访问;
MODE_WORLD_READABLE=1:允许其他应用程序读取本应用创建的文件;
MODE_WORLD_WRITEABLE=2:允许其他应用程序写入本应用程序创建的文件,会覆盖原数据。
所以如果我们的SharedPreferences能让外部程序读取,就必须选择MODE_WORLD_READABLE或或者MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE。
2、我们一般在写SharedPreferences时使用getSharedPreferences方法,但需要我们注意的时,getSharedPreferences使用的是当前的Context即this,而我们需要在SharePreferenceRead程序中获取SharePreferenceWrite写的SharedPreferences时,一定要获取SharePreferenceWrite的Context,代码如下:
- Context c = null;
- try {
- c = this.createPackageContext("org.ourunix.android.sharepreferencewrite", this.CONTEXT_IGNORE_SECURITY);
- } catch (NameNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
其中参数一为我需要获取Context的程序包名,第二个参数为flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。
3、获取SharedPreferences,需要用到上述的Context,即Context.getSharedPreferences(NAME, 0);
获取到上下文,我们就好干事情了,呵呵,干过Android的人都知道Context是个好东东,有此宝贝就可以用之来发广播、打开文件夹、数据库操作等都可以完成。
回归主题,我们先看SharePreferenceWrite的代码:
- public class SharePreferenceWriteActivity extends Activity implements OnClickListener{
- private SharedPreferences prference;
- private String PREF_NAME = "PREF_NAME";
- private String KEY = "TestValue";
- private EditText mEditText;
- private Button mButton;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mEditText = (EditText) findViewById(R.id.writeTV);
- mButton = (Button) findViewById(R.id.submit);
- mButton.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- prference = getSharedPreferences(PREF_NAME, MODE_WORLD_READABLE );
- prference.edit().putString(KEY, mEditText.getText().toString()).commit();
- }
- }
运行效果图:
再看读取SharePreferenceWrite程序带的SharedPreferences的PreferenceRead程序:
- public class SharePreferenceReadActivity extends Activity {
- /** Called when the activity is first created. */
- private SharedPreferences prference;
- private String NAME = "PREF_NAME";
- private String KEY = "TestValue";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- setContentView(tv);
- String tmp;
- Context c = null;
- try {
- c = this.createPackageContext("org.ourunix.android.sharepreferencewrite", CONTEXT_IGNORE_SECURITY);
- } catch (NameNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- if (c != null)
- prference = c.getSharedPreferences(NAME, MODE_PRIVATE);
- tmp = prference.getString(KEY, "nothing");
- tv.setText(tmp);
- }
- }
运行效果图: