您的位置:首页 > Web前端

SharedPreferences

2016-04-18 17:08 351 查看


SharedPreferences是Content中的一个接口, 用键值对的方式存储数据,SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。Editor是SharedPreferences中的静态接口,如下图

嵌套的类:



用SharedPreference存储数据的步骤一般为:获取到SharedPreferences对象,利用edit()方法获取Editor对象,通过Editor对象存储key-value键值对数据,通过commit()方法提交数据

一、Android中主要提供了三种方法用于得到 SharedPreferences 对象

1、Context 类中的 getSharedPreferences()方法

public abstract SharedPreferences getSharedPreferences (String name, int mode)

方法得到一个Sharedpreferences对象,参数name是Sharedpreferences文件的名字,没有就创建一个文件,SharedPreferences 文件都是存放在/data/data/< package name >/shared_prefs/目录下的;mode则是操作模式,主要有两种模式可以选择,MODE_PRIVATE 和 MODE_MULTI_PROCESS。默认为0,Context.MODE_PRIVATE表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写,MODE_MULTI_PROCESS 则一般是用于会有多个进程对同一个 SharedPreferences 文件进行读写的情况。作用范围通常是本应用程序。

2、Activity 类中的 getPreferences()方法

这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文件名。作用范围通常是本Activity。

3、PreferenceManager 类中的 getDefaultSharedPreferences()方法,这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。获取到的一般是本应用默认的偏好文件(包名_preferences.xml)。

二、代码实现

布局文件中新建两个按钮,一个存储数据,一个读取数据

public class MainActivity extends ActionBarActivity {

private Button savedata;
private Button readdata;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
savedata = (Button) findViewById(R.id.button1);
readdata = (Button) findViewById(R.id.button2);
savedata.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SharedPreferences.Editor editor = getSharedPreferences("demo",MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 12);
editor.commit();
}
});
readdata.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SharedPreferences sp = getSharedPreferences("demo",
MODE_PRIVATE);
String name = sp.getString("name", "");//取不到值默认为空
int age = sp.getInt("age", 0);
Toast.makeText(MainActivity.this, name + age,
Toast.LENGTH_SHORT).show();
}
});
}
}


当点击保存按钮后,在data/data中能看到如下目录:



可以看到,是以xml文件保存的,里面的内容如下

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="name">Tom</string>
<int name="age" value="12" />
</map>


点击读取按钮后,就会显示你保存的数据

至于为什么可以直接调用getSharedPreferences()而不用获取Context,再从Context中调用,从源码中就可以看到

public class Activity extends ContextThemeWrapper


Activity是继承ContextThemeWrapper类的,而ContextThemeWrapper又继承了Context类,所以Activity也继承了getSharedPreferences()方法,可以直接调用

三、OnSharedPreferenceChangeListener监听SharedPreferences的变化



四、两个不同的应用进行SharedPreference存储

应用1里存

SharedPreferences sp = getSharedPreferences("share1", Context.MODE_MULTI_PROCESS | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("test", "test1");
editor.commit();


应用2里取

Context mContext = createPackageContext("com.example.share1",Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sp = mContext.getSharedPreferences("share1",Context.MODE_MULTI_PROCESS | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
String data = sp.getString("test", "no");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: