首页 > 代码库 > android开发中SharedPreferences用法详解(含源代码和运行结果截图)
android开发中SharedPreferences用法详解(含源代码和运行结果截图)
在Android应用程序开发中,经常需要保存一些类似于配置信息的简单类型数据,比如游戏玩家的积分、是否开启音效等。SharedPreferences类为我们保存、读取这些数据提供了便利。
SharedPreferences接口提供以下常用方法来访问SharedPreferences对象中的key-value对:
boolean contains(String key):判断SharedPreferences对象是否包含键值为key的数据。
boolean getXxx(String key, xxx defaultValue):获取SharedPreferences对象中指定key对应的value。如果该key不存在,返回默认值defaultValue。xxx可以是boolean、float、int、String、long等基本类型。
调用SharedPreferences的edit()方法可以获得Editor对象,通过Editor对象来向SharedPreferences对象中写入数据,有以下常用方法:
SharedPreferences prefs;
Editor editor = prefs.edit();
editor.clear():清空数据
editor.putXxx(String key, xxx value):向SharedPreferences对象中存入指定key对应的数据,xxx可以是boolean、float、int、String、long等基本类型。
editor.remove(String key):删除key对应的数据
editor.apply():保存更改,用于Android 2.3以上版本,异步写入,线程安全。
editor.commit():保存更改,同步写入,它会阻塞调用线程,写入成功返回true,写入失败返回false。
SharedPreferences是一个接口,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取实例。mode参数支持以下几个值:
Context.MODE_PRIVATE:只能被本应用程序读写。
Context.MODE_WORLD_READABLE:能被其他应用程序只读。
Context.MODE_WORLD_WRITEABLE:能被其他应用程序读、写。
SharedPreferences保存的数据在程序重启后仍然有效,所以可以用来保存用户设置的一些数据。
下面来看我的一个demo,在一个activity中点“设置”按钮跳转到另一个activity中,设置相关选项后,重启应用程序,则可以在activity中看到上次设置的结果。
主activity布局xml代码:
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/setButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="设置" android:textSize="20dp"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/engineLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="识别引擎:" android:textSize="20dp"/> <TextView android:id="@+id/engineTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/languageLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="识别语言:" android:textSize="20dp"/> <TextView android:id="@+id/languageTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> </LinearLayout> </LinearLayout> </span>
主activity的java代码:
<span style="font-size:18px;">package my.set; import my.set.R; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class TestActivity extends Activity{ TextView engineView; TextView languageView; Button setButton; SharedPreferences sharedPreferences; class buttonListener implements OnClickListener { public void onClick(View view) { Intent intent = new Intent(TestActivity.this, SetActivity.class); startActivity(intent); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); engineView = (TextView)findViewById(R.id.engineTextView); languageView = (TextView)findViewById(R.id.languageTextView); setButton = (Button)findViewById(R.id.setButton); sharedPreferences = getSharedPreferences("set", MODE_PRIVATE); String engineString = sharedPreferences.getString(SetActivity.PREF_OCR_ENGINE, ""); String languageString = sharedPreferences.getString(SetActivity.PREF_RECOGNIZED_LANGUAGE, ""); setButton.setOnClickListener(new buttonListener()); engineView.setText(engineString); languageView.setText(languageString); } }</span>设置界面的xml布局代码:
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/engine_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/engine_text_view" android:textSize="20dp"/> <RadioGroup android:id="@+id/engine_radio_group" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:id="@+id/tesseract_radio_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tesseract_radio_button" android:textSize="20dp"/> <RadioButton android:id="@+id/tesseract_and_cube_radio_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tesseract_and_cube_radio_button" android:textSize="20dp"/> </RadioGroup> <TextView android:id="@+id/language_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/language_text_view" android:textSize="20dp"/> <RadioGroup android:id="@+id/language_radio_group" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:id="@+id/Chinese_radio_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Chinese_radio_button" android:textSize="20dp"/> <RadioButton android:id="@+id/Engilsh_radio_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/English_radio_button" android:textSize="20dp"/> </RadioGroup> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <Button android:id="@+id/okButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ok" android:textSize="20dp"/> <Button android:id="@+id/cancelButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cancel" android:textSize="20dp"/> </LinearLayout> </LinearLayout> </span>
设置界面的java代码:
<span style="font-size:18px;">package my.set; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.RadioButton; import android.widget.RadioGroup; import my.set.R; public class SetActivity extends Activity { //定义识别引擎的单选按钮 RadioButton tesseractRadioButton; RadioButton tessAndCubeRadioButton; //定义识别语言的单选按钮 RadioButton chineseRadioButton; RadioButton englishRadioButton; RadioGroup engineGroup; RadioGroup languageGroup; Button okButton; Button cancelButton; public static final String PREF_OCR_ENGINE = "PREF_OCR_ENGINE"; public static final String PREF_RECOGNIZED_LANGUAGE = "PREF_RECOGNIZED_LANGUAGE"; SharedPreferences prefs; private String choosedEngine = ""; private String choosedLanguage = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.set); tesseractRadioButton = (RadioButton)findViewById(R.id.tesseract_radio_button); tessAndCubeRadioButton = (RadioButton)findViewById(R.id.tesseract_and_cube_radio_button); chineseRadioButton = (RadioButton)findViewById(R.id.Chinese_radio_button); englishRadioButton = (RadioButton)findViewById(R.id.Engilsh_radio_button); engineGroup = (RadioGroup)findViewById(R.id.engine_radio_group); languageGroup = (RadioGroup)findViewById(R.id.language_radio_group); okButton = (Button)findViewById(R.id.okButton); cancelButton = (Button)findViewById(R.id.cancelButton); prefs = getSharedPreferences("set", MODE_PRIVATE); //添加事件监听器 engineGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub if (checkedId == R.id.tesseract_radio_button) { choosedEngine = tesseractRadioButton.getText().toString(); } else { choosedEngine = tessAndCubeRadioButton.getText().toString(); } } }); languageGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub if (checkedId == R.id.Chinese_radio_button) { choosedLanguage = chineseRadioButton.getText().toString(); } else { choosedLanguage = englishRadioButton.getText().toString(); } } }); okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub savePreferences(); finish(); } }); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } }); } private void savePreferences() { Editor editor = prefs.edit(); editor.putString(PREF_OCR_ENGINE, choosedEngine); editor.putString(PREF_RECOGNIZED_LANGUAGE, choosedLanguage); editor.commit(); } } </span>下面是效果图:
第一次启动后界面:
设置界面:
点击保存按钮后,重启应用程序,则看到上次设置结果如下图:
打开DDMS的File Explorer,SharedPreferences数据保存在/data/data/<package name>/shared_prefs文件夹下,如下图:
导出这个xml文件,打开如下图:
android开发中SharedPreferences用法详解(含源代码和运行结果截图)