SharedPreferences是安卓平台上一个轻量级的数据存储接口,一般将应用的个人设置或者需要保存的数据存放到一个xml文件中,Eclipse环境下是放到data\data\<项目资源包名>\shared_prefs\下,只有获得root权限的真机才能看到这个文件夹。
SharedPreferences作为一个公共接口,其源码分为了三个部分:
- 一个OnSharedPreferenceChangeListener()的调用接口,需要实现onSharedPreferenceChanged(),当SharedPreferences改变时调用这个方法。
- public interface Editor,该接口主要是一些putXXX()函数,完成了将基本数据类型存入sharedpreferences的实例中去。即这是一个存操作的函数集合;
- 若干个getXXX()函数,定义了从sharedpreferences实例中获取不同基本数据类型的方法。这是一个取操作函数集合;
既然,SharedPreferences是一个接口,那么如何获取一个实现了该接口的实例呢?Android中方法为Context.getSharedPreferences(String,int),第一个参数表示该sharedpreferences的名称,第二个表示该SharedPreferences的访问模式。
接下来向大家介绍两种SharedPreferences的使用:
一、访问本应用的SharedPreferences实现
新建MainActivity和SecondActivity,一个用于sharedpreferences数据的存储,另一个用于数据的读取。
MainActivity代码:
public class MainActivity extends AppCompatActivity {
private SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = getSharedPreferences("preferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("name","个人设置");
editor.putString("volume","最大音量");
editor.commit();
}
}
SecondActivity代码:
public class SecondActivity extends AppCompatActivity {
private SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
preferences = getSharedPreferences("preferences", Context.MODE_PRIVATE);
String strName = "";
String strVolume = "";
strName = preferences.getString("name","administrator");
strVolume = preferences.getString("volume","默认音量");
Toast.makeText(SecondActivity.this, ""+strName+":"+strVolume, Toast.LENGTH_SHORT).show();
}
}
运行上述demo,我们发现,虽然设置的访问模式为MODE_PRIVATE,但是不同的Activity还是可以访问的(不同的Activity只要在同一App下,不管两个App是否在同一包下,不同包的情况亲测过可以访问PRIVATE的模式)。因此,我们可以得出,SharedPreferences的数据是一个在App层面上的,它能够被本App的其他组件访问。
二、访问另一个应用的SharedPreferences
再新建一个不同的demo为OtherApp,其MainActivity具体代码如下:
public class MainActivity extends AppCompatActivity {
private Context context;
private SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
/**
*com.zhouyou.activitylifecycle是上面“一”部分Activity
*的包名,此时“一”部分的访问模式应改为MODE_WORLD_READABLE
*/
context = createPackageContext("com.zhouyou.activitylifecycle", Context.CONTEXT_IGNORE_SECURITY);
preferences = context.getSharedPreferences("preferences", Context.MODE_WORLD_READABLE);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
String name = preferences.getString("name", "");
String volume = preferences.getString("volume", "");
Toast.makeText(MainActivity.this, ""+name + "," + volume, Toast.LENGTH_SHORT).show();
}
}
运行后发现访问是成功的。即,访问其他应用的SharedPreferences需要获取其对应包的Context,再通过这个context去访问他的SharedPreferences。