Android数据持久化是说在断电后数据不会丢失,而根据存储位置和实现方式一般有3种方式,这里说sharedpreferences:
一,sharedpreferences存储
该种方式是在应用独有目录data/data/[packgename]/shared_prefs/下生成相应的preferences文件保存数据。
保存的是键值对数据,所以比较适合用于保存设置,密码等数据。
API:
1,文件获取、创建
PreferenceManager.getDefaultSharedPreferences(Context context); //返回以包名命名的preferences,首次调用时没有文件就创建
Activity.this.getPreferences(MODE_PRIVATE);//返回以Activity名命名的preferences,首次调用时没有文件就创建
Context.getSharedPreferences("name",MODE_PRIVATE);//返回以name名命名的preferences,首次调用时没有文件就创建
2,数据获取:
defaultpreference.getBoolean("remember_pw",false);
defaultpreference.getString("account","");
3,数据添加,修改,移除
SharedPreferences.Editor editor=defaultpreference.edit();
editor.putString("account",account);
editor.putString("password",password);
editor.putBoolean("remember_pw",true);
editor.remove("accouint");//移除某个键值对
editor.clear();//移除所有数据
editor.commit();
二,Preferences控件
以上是preferences的基础,实际使用过程中android提供了一系列封装了preferences的控件,自动生成packagename_preferencse.xml,自动保存这些数据,并立时生效。
1,常用Preferences控件
PreferenceScreen //所有Preference元素的根节点,如果嵌套,点击后出现一个新的屏幕
PreferenceCategory //用于组合一组Preference,使布局看起来具有层次关系,美观
ListPreference //显示一个相当的list,点击item选中保存对应value
CheckBoxPreference //相当于checkBox
EditTextPreference //等同于EditText,点击弹出对话框,编辑保存
2,控件属性
通用:
android:key 这个属性相当于android:id的作用。用此key来唯一表示此Preference
android:title Preference的标题,
android:summary 表示Preference提示语,相对于android:title来说显示要小点,而且显示位置在android:title下面
android:defaultValue 这个表示的是默认值,比如CheclPreference这种preference就可以指定默认是"true"还是“false”
android:enabled 表示该Preference是否可用状态
特有:
ListPreference
android:title="Options"
android:entries="@array/entry_list"
android:entryValues="@array/values_list"
android:dialogTitle="list dialogtitle"
android:defaultValue="1"
/>
CheckBoxPreference
android:title="checbox_one"
android:summaryOn="On_check_one"
android:summaryOff="offcheck_one"
/>
3,控件获取,点击,监听
Activity不是继承Activity,而是PreferenceActivity;
不是使用setContentView()方法,而是使用addPreferencesFromResource()方法来加载布局文件;
布局文件一般添加在res/xml下面,以PreferenceScreen为根元素的xml文件;
与一般Activity一样在AndroidManifest中注册。
获取控件:
mCheck=(CheckBoxPreference) findPreference("checkbox");
mRing=(RingtonePreference) findPreference("ring");
点击,监听:
对PreferenceActivity监听可以重写onPreferenceTreeClick()
对Preference控件可以注册OnPreferenceChangeListener和OnPreferenceClickListener
那么这三个点击事件在一起是什么用的呢?它的规则如下:
点击某个Preference控件后,会先回调onPreferenceChange()方法,即是否保存值,这里在实际使用中就会有一些使用处理。
然后再回调onPreferenceClick以及onPreferenceTreeClick()方法,因此在onPreferenceClick/onPreferenceTreeClick方法中我们得到的就是保存与否之后的,也就是最新的Preference控件值。
然后onPreferenceClick会比onPreferenceTreeClick()方法先调用,如果onPreferenceClick方法返回true,那就不会再调用onPreferenceTreeClick()方法,
如果onPreferenceClick()返回false就会继续调用onPreferenceTreeClick()方法。
下面是代码和log实例。
public class ItChqActivity extends PreferenceActivity {
private static String TAG="ItChqActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG,"oonCreate");
addPreferencesFromResource(R.xml.prftest);
CheckBoxPreference preference=(CheckBoxPreference)findPreference("checkbox");
preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.d(TAG,"onPreferenceChange() newValuew="+newValue);
return true;
}
});
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Log.d(TAG,"onPreferenceClick preference.Valuew="+PreferenceManager.getDefaultSharedPreferences(ItChqActivity.this).getBoolean(preference.getKey(),false));
return true;
}
});
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Log.d(TAG,"onPreferenceTreeClick()");
if(preference.getKey().equals("checkbox")){
Log.i("itchq", "checkbox");
}
return true;
}
}
1,OnPreferenceChangeListener return true
09-23 08:37:24.904 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false
09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false
09-23 08:37:24.905 9135-9135/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()
2,OnPreferenceChangeListener return false
09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false
09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=true
09-23 08:39:54.072 9344-9344/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceTreeClick()
3,onPreferenceClick return true
09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceChange() newValuew=false
09-23 08:41:56.144 9557-9557/com.coder.piano.loginactivity D/ItChqActivity: onPreferenceClick preference.Valuew=false
参考:https://www.cnblogs.com/itchq/p/3888284.html