SharedPreferences的用法
2014-01-24 11:48
351 查看
http://hi.baidu.com/liumin_x/item/10a2acfc473778caa835a2c4
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "老李");
editor.putInt("age", 4);
editor.commit();//提交修改
生成的zyj.xml文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">老李</string>
<int name="age" value="4" />
</map>
因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。
SharedPreferences其实用的是pull解释器
访问[b]SharedPreferences中的数据代码如下:[/b]
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
//getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
如果访问其他应用中的[b]Preference,[/b]前提条件是:
该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。
getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :
Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj",Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);
如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
File xmlFile = new File(“/data/data/<package name>/shared_prefs/zyj.xml”);//<package name>应替换成应用的包名
下面,编写一个使用SharedPreferences读写配置文件的小例子。
1.创建Android工程
Project name:sharedPreferences
BuildTarget:Android2.2
Application name:软件参数设置
Package name:com.com.jbridge.pres.activity
Create Activity:PreferencesActivity
Min SDK Version:8
2.编辑strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, PreferencesActivity!</string>
<string name="app_name">软件参数设置</string>
<string name="tv_name">姓名</string>
<string name="tv_age">年龄</string>
<string name="bt_write">设置</string>
<string name="bt_read">读取</string>
<string name="save_success">保存成功</string>
<string name="save_failed">保存失败</string>
</resources>
3.编辑main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_name"
android:id="@+id/tv_name"
android:textSize="30px"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/et_name"
android:layout_toRightOf="@id/tv_name"
android:layout_alignTop="@id/tv_name"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_age"
android:id="@+id/tv_age"
android:textSize="30px"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/et_age"
android:layout_toRightOf="@id/tv_age"
android:layout_alignTop="@id/tv_age"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_write"
android:text="@string/bt_write"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_read"
android:text="@string/bt_read"
android:layout_toRightOf="@id/bt_write"
android:layout_alignTop="@id/bt_write"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_show"
/>
</LinearLayout>
4.为按钮添加事件代码
package com.jbridge.pres.activity;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources.NotFoundException;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class PreferencesActivity extends Activity {
private EditText etName;
private EditText etAge;
private View.OnClickListener onClickListener=new View.OnClickListener() {
public void onClick(View view) {
Button button=(Button) view;
SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);
switch (button.getId()) {
case R.id.bt_write:
try {
Editor editor=sharedPreferences.edit();
editor.putString("name", etName.getText().toString());
editor.putInt("age",Integer.valueOf(etAge.getText().toString()) );
editor.commit();
Toast.makeText(PreferencesActivity.this, R.string.save_success, Toast.LENGTH_LONG).show();
} catch (NumberFormatException e) {
Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;
e.printStackTrace();
} catch (NotFoundException e) {
Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;
e.printStackTrace();
}
break;
case R.id.bt_read:
String name=sharedPreferences.getString("name", "no name");
String age=String.valueOf(sharedPreferences.getInt("age", 0));
TextView tvShow=(TextView) PreferencesActivity.this.findViewById(R.id.tv_show);
tvShow.setText("姓名: "+name+" 年龄: "+age);
break;
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);
etName=(EditText) this.findViewById(R.id.et_name);
etAge=(EditText) this.findViewById(R.id.et_age);
etName.setText(sharedPreferences.getString("name", "no name"));
etAge.setText(String.valueOf(sharedPreferences.getInt("age", 0)));
Button btWrite=(Button) this.findViewById(R.id.bt_write);
Button btRead=(Button) this.findViewById(R.id.bt_read);
btWrite.setOnClickListener(onClickListener);
btRead.setOnClickListener(onClickListener);
}
/*
如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。
getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :
Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "no name");
int age = sharedPreferences.getInt("age", 0);
*/
}
5.运行程序
启动模拟器,运行程序。输入名称和年龄,点击保存。我们使用的代码是getSharedPreferences("zyj",Context.MODE_PRIVATE);,当然commit时。它会为我们为”/data/data/com.jbridge.pres.activity/shared_prefszyj.xml”。将 preferences.xml导出,查看它的内容为:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="name">zyj</string><int name="age" value="22" /></map>
SharedPreferences的用法
很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下:
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "老李");
editor.putInt("age", 4);
editor.commit();//提交修改
生成的zyj.xml文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">老李</string>
<int name="age" value="4" />
</map>
因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。
SharedPreferences其实用的是pull解释器
访问[b]SharedPreferences中的数据代码如下:[/b]
SharedPreferences sharedPreferences = getSharedPreferences("zyj", Context.MODE_PRIVATE);
//getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
如果访问其他应用中的[b]Preference,[/b]前提条件是:
该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。
getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :
Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj",Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 0);
如果不通过创建Context访问其他应用的preference,可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
File xmlFile = new File(“/data/data/<package name>/shared_prefs/zyj.xml”);//<package name>应替换成应用的包名
下面,编写一个使用SharedPreferences读写配置文件的小例子。
1.创建Android工程
Project name:sharedPreferences
BuildTarget:Android2.2
Application name:软件参数设置
Package name:com.com.jbridge.pres.activity
Create Activity:PreferencesActivity
Min SDK Version:8
2.编辑strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, PreferencesActivity!</string>
<string name="app_name">软件参数设置</string>
<string name="tv_name">姓名</string>
<string name="tv_age">年龄</string>
<string name="bt_write">设置</string>
<string name="bt_read">读取</string>
<string name="save_success">保存成功</string>
<string name="save_failed">保存失败</string>
</resources>
3.编辑main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_name"
android:id="@+id/tv_name"
android:textSize="30px"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/et_name"
android:layout_toRightOf="@id/tv_name"
android:layout_alignTop="@id/tv_name"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_age"
android:id="@+id/tv_age"
android:textSize="30px"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/et_age"
android:layout_toRightOf="@id/tv_age"
android:layout_alignTop="@id/tv_age"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_write"
android:text="@string/bt_write"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/bt_read"
android:text="@string/bt_read"
android:layout_toRightOf="@id/bt_write"
android:layout_alignTop="@id/bt_write"
android:layout_marginLeft="30px"
/>
</RelativeLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_show"
/>
</LinearLayout>
4.为按钮添加事件代码
package com.jbridge.pres.activity;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources.NotFoundException;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class PreferencesActivity extends Activity {
private EditText etName;
private EditText etAge;
private View.OnClickListener onClickListener=new View.OnClickListener() {
public void onClick(View view) {
Button button=(Button) view;
SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);
switch (button.getId()) {
case R.id.bt_write:
try {
Editor editor=sharedPreferences.edit();
editor.putString("name", etName.getText().toString());
editor.putInt("age",Integer.valueOf(etAge.getText().toString()) );
editor.commit();
Toast.makeText(PreferencesActivity.this, R.string.save_success, Toast.LENGTH_LONG).show();
} catch (NumberFormatException e) {
Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;
e.printStackTrace();
} catch (NotFoundException e) {
Toast.makeText(PreferencesActivity.this, R.string.save_failed, Toast.LENGTH_LONG).show();;
e.printStackTrace();
}
break;
case R.id.bt_read:
String name=sharedPreferences.getString("name", "no name");
String age=String.valueOf(sharedPreferences.getInt("age", 0));
TextView tvShow=(TextView) PreferencesActivity.this.findViewById(R.id.tv_show);
tvShow.setText("姓名: "+name+" 年龄: "+age);
break;
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SharedPreferences sharedPreferences=PreferencesActivity.this.getSharedPreferences("zyj", Context.MODE_PRIVATE);
etName=(EditText) this.findViewById(R.id.et_name);
etAge=(EditText) this.findViewById(R.id.et_age);
etName.setText(sharedPreferences.getString("name", "no name"));
etAge.setText(String.valueOf(sharedPreferences.getInt("age", 0)));
Button btWrite=(Button) this.findViewById(R.id.bt_write);
Button btRead=(Button) this.findViewById(R.id.bt_read);
btWrite.setOnClickListener(onClickListener);
btRead.setOnClickListener(onClickListener);
}
/*
如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为com.jbridge.pres.activity的应用使用下面语句创建了preference。
getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :
Context otherAppsContext = createPackageContext("com.jbridge.pres.activity", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("zyj", Context.MODE_WORLD_READABLE);
String name = sharedPreferences.getString("name", "no name");
int age = sharedPreferences.getInt("age", 0);
*/
}
5.运行程序
启动模拟器,运行程序。输入名称和年龄,点击保存。我们使用的代码是getSharedPreferences("zyj",Context.MODE_PRIVATE);,当然commit时。它会为我们为”/data/data/com.jbridge.pres.activity/shared_prefszyj.xml”。将 preferences.xml导出,查看它的内容为:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?><map><string name="name">zyj</string><int name="age" value="22" /></map>
相关文章推荐
- jquery 鼠标滑动显示详情
- 使用JavaScript获取CSS伪元素属性
- Cannot delete .... . Name node is in safe mode
- 认识 JavaScript
- 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
- jquery操作cookie
- IE浏览器jQuery中trim()报错
- IE浏览器jQuery中trim()报错
- 提取HTML的正文类
- mysql 使用federated 实现dblink 远程表访问
- 关于jquery获取json数据的格式问题
- 什么是web前端开发
- 8 个 jQuery 的 PDF 浏览插件
- 浅谈 js中parseInt函数的解析
- JQuery 点击标签切换class
- js数组及对象的深拷贝
- js学习(一)原型理解
- 推荐10款非常优秀的 HTML5 开发工具
- html5<canvas>画图
- html5 标签