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文件,打开如下图:

时间: 2024-12-19 01:43:52

android开发中SharedPreferences用法详解(含源代码和运行结果截图)的相关文章

Android开发之通知栏Notification详解

Notification的用法  --- 状态栏通知 发送一个状态栏通知必须的两个类: 1. NotificationManager   --- 状态栏通知的管理类,负责发通知,清除通知等 NotificationManager : 是一个系统Service,必须通过 context.getSystemService(NOTIFICATION_SERVICE)方法获取 NotificationManager notificationManager = (NotificationManager)

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

Android开发四大组件--Activity详解

Android开发四大组件--Activity详解 - Android开发教程 Android开发的四大组件在开发中应用中是必不可少的,下面就来详解下四大组件之一Activity,总结自网络.Activty的生命周期的也就是它所在进程的生命周期. 一个Activity的启动顺序: onCreate()——>onStart()——>onResume() 当另一个Activity启动时: 第一个Activity onPause()——>第二个Activity onCreate()——>

C#中const用法详解

本文实例讲述了C#中const用法.分享给大家供大家参考.具体用法分析如下: const是一个c语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助.另外const在其他编程语言中也有出现,如c++.php5.c#.net.hc08 c const 一般修饰 的变量为只读变量 const定义应该为在定义的时候初始化 以后不能改变他的值 例: 代码如下: const

&lt;Android开源库&gt; GreenDAO 用法详解&lt;译文&gt;

简介 greenDAO是一个开源的Android ORM,使SQLite数据库的开发再次变得有趣. 它减轻了开发人员处理底层的数据库需求,同时节省开发时间. SQLite是一个很不错的关系型数据库. 尽管如此,编写SQL和解析查询结果仍然是相当乏味和耗时的任务. greenDAO通过将Java对象映射到数据库表(称为ORM,"对象/关系映射")来解决这些问题. 这样,您可以使用简单的面向对象的API来存储,更新,删除和查询Java对象. 特性 最高性能(可能是Android中最快的OR

Android开发:程序目录结构详解

HelloWorld程序的目录结构概述 我们可以在文件夹中看到,HelloWorld程序的目录主要包括:src文件夹.gen文件夹.Android文件夹.assets.res文件夹. AndroidManifest.xml.default.properties.在Eclipse的左侧展开HelloWorld项目,可以看到如下图的目录结构: 下面将分节介绍上面的各级目录结构. 1.src文件夹 顾名思义(src, source code)该文件夹是放项目的源代码的.打开HelloWorld.jav

Android开发请求网络方式详解

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42643401 大家知道Google支持和发布的Android移动操作系统,主要是为了使其迅速占领移动互联网的市场份额,所谓移动互联网当然也是互联网了,凡是涉及互联网的任何软件任何程序都少不了联网模块的开发,诚然Android联网开发也是我们开发中至关重要的一部分,那么Android是怎么样进行联网操作的呢?这篇博客就简单的介绍一下Android常用的联网方式,包括JDK支持的Ht

Android中SharedPreferences函数详解

Android平台提供了一个SharedPreferences类,它是一个轻量级应用程序内部轻量级的存储方案,特别适合用于保存软件配置参数,比如boolean,int,float,long,String等数据.使用SharedPreferences保存数据,其实质是采用了xml文件存放数据,路径为:/data/data/<package name>/shared_prefs. 获取SharedPreferences的两种方式: (1)调用Context对象的getSharedPreferenc

AngularJS select中ngOptions用法详解

一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in array select as label for value inarray labelgroup bygroupforvalueinarray selectaslabelgroup bygroupforvalueinarray select as label group bygroup for value in array track bytrackexpr 对