SharedPreferences是一种轻型的数据存储方式,类似于Map采用键值对key-value的方式存储在XML文件中。
如果是root过的手机,可以在date/date/包名/shared_prefs中找到存储的XML文件。
SharedPreferences一般是用来存储不重要的简单的配置信息。
例如,电子书上次读到了哪一页,五子棋的游戏设置参数,自动同步几分钟进行一次同步等等。
SharedPreferences对象本身只支持读取数据,读写的权限有:
①Context.MODE_PRIVATE:只能被本应用程序读、写。
②Context.MODE_WORLD_READABLE:能被其他应用读,但不能写。(已过时)
③Context.MODE_WORLD_WRITEABLE:能被其他应用读、写。(已过时)
这两个过时的权限会造成安全漏洞,有需要的话可以使用ContentProvider来代替
如果需要存储数据,需要使用SharedPreferences的内部类Editor。
实现SharedPreferences存储的步骤如下:
①获取SharedPreferences对象
②获取SharedPreferences.Editor对象
③使用Editor中的putString(key, value)等方法存储基本数据类型
④使用Editor中的commit()提交存储的数据(相当于保存修改)
⑤使用SharedPreferences对象中的getString()等方法获取数据
①获取SharedPreferences对象
获取SharedPreferences对象的方法有两种
//第一种,通过Preference管理获得默认的SharedPreferences对象
SharedPreferences share = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
//第二种,通过Context中的getSharedPreferences方法获得SharedPreferences对象,Demo中使用第二种
SharedPreferences share = getSharedPreferences(String name, int MODE);//name表示存放的XML的名字,MODE表示模式
我们上面有解释了各种模式,这里只是一个简单的demo,所以使用第二种,模式是MODE_PRIVATE
②获取SharedPreferences.Editor对象
在SharedPreferences对象中有一个edit()方法,用来返回内部的Editor对象
SharedPreferences.Editor editor = share.edit();
③使用Editor中的putString(key, value)等方法存储基本数据类型
之后我们使用Editor进行数据的存储,editor只能存储基本的数据类型,如果是自定义的类型则不能存储
(如果非要存储自定义类型,也可以将自定义类型拆开来,将其中的基本数据类型进行分别存储)
editor.putBoolean(String key, boolean value);//存储Boolean类型
editor.putInt(String key, int value);//存储int类型
editor.putFloat(String key, float value);//存储float类型
editor.putLong(String key, long value);//存储long类型
editor.putString(String key, String value);//存储String类型
editor.putStringSet(String key, Set<string> value);//存储Set<String>类型,本质还是存储String类型</string>
还记得我们上面说的SharedPreferences是以键值对的方式存储数据吗?这里的key-value就是键值对。
后面会通过键,来寻找值。
④使用Editor中的commit()提交存储的数据(相当于保存修改)
当然,在我们努力的修改完数据之后,我们还要保存修改,不然就前功尽弃了
editor里面有一个commit()方法来保存修改(之前的关于Fragment动态加载的博客中也有出现commit()方法)
editor.commit();//提交保存数据
⑤使用SharedPreferences对象中的getString()等方法获取数据
之后我们如果需要提取数据,那么就不再使用Editor对象了,直接使用SharedPreferences对象即可。
和Editor存储的方法相对应,SharedPreferences中也有一些读取的方法
share.getBoolean(String key, boolean default);//读取Boolean类型
share.getInt(String key, int default);//读取int类型
share.getFloat(String key, float default);//读取float类型
share.getLong(String key, long default);//读取long类型
share.getString(String key, String default);//读取String类型
share.getStringSet(String key, Set default);//读取Set<string>类型,本质还是读取String类型
share.getAll()//读取所有数据,并返回一个Map类型</string>
这里可能有人会奇怪,为什么读取数据也要加入一个值的参数。
这是为了在SharedPreferences找不到该键值对,也就是获取不到数据的时候,能返回一个default的默认值,提醒你找不到数据。
⑥读、写其他应用的SharedPreferences应用
在读写其他应用的SharedPreferences前,首先要确定被读取的应用要有对应的访问权限。
如果是MODE_WORLD_WRITEABLE,则表明该SharedPreferences可被其他应用程序写入。
如果是MODE_WORLD_READABLE,则表明该SharedPreferences可被其他应用程序读取。
首先我们要获取被读写应用程序的Context上下文。
Context useCount = createPackageContext(String package, int MODE);//package为被读写应用的包名,MODE表示模式
Context useCount = createPackageContext("com.package.test", Context.CONTEXT_IGNORE_SECURITY);
这里的MODE有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两种方式
CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。
CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。
获取了SharedPreferences之后,我们就要用之前讲过的方法进行读写,前提是要有权限。
Context useCount = createPackageContext("com.package.test", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences shares = useCount.getSharedPreferences("count", Context.MODE_WORLD_READABLE);
或者我们也可以用IO流来读取,但这不属于
以下附上简单的demo源码
public class MainActivity extends Activity{
Button saveButton, loadButton;
EditText editText;//要存入的数据
TextView outputText;//读取并显示数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveButton = (Button) findViewById(R.id.saveButton);
loadButton = (Button) findViewById(R.id.loadButton);
editText = (EditText) findViewById(R.id.inputEdit);
outputText = (TextView) findViewById(R.id.outputText);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String value = editText.getText().toString();//获取editorText中的数据
SharedPreferences share = getSharedPreferences("inputEdit", MODE_PRIVATE);
//以私有模式打开或新建一个inputEdit.XML文件
SharedPreferences.Editor editor = share.edit();//获取Editor对象
editor.putString("key", value);//存入数据
editor.commit();//保存修改,避免前功尽弃
}
});
loadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences share = getSharedPreferences("inputEdit", MODE_PRIVATE);
//以私有模式打开或新建一个inputEdit.XML文件
outputText.setText(share.getString("key", "没有存放"));//获取数据,如果找不到数据就返回"没有存放"
}
});
}
}
<!--主Activity的布局文件-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/inputEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/saveButton"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="存放"/>
<TextView
android:id="@+id/outputText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取的数据"/>
<Button
android:id="@+id/loadButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取"/>
</LinearLayout>