Android SharedPreferences存储数据的使用方法

最后更新于:2022-04-01 14:27:32

### 1、SharedPreferences类的介绍 对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存;如果是j2se应用,我们会采用properties属性文件或者xml进行保存。如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在 /data/data/<package name>/shared_prefs 目录下(下面会对实际案例进行截图证明)。SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对),SharedPreferences常用来存储一些轻量级的数据。 ### 2、SharedPreferences类的说明及简单分析 (1)获取SharedPreferences的两种方式: 1 调用Context对象的getSharedPreferences()方法; 2 调用Activity对象的getPreferences()方法; 两种方式的区别: 调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享; 调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用;  (2)SharedPreferences的四种操作模式: Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容; Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件; Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入; (3)将数据保存至SharedPreferences: ~~~ SharedPreferences preferences = getSharedPreferences("user",Context.MODE_PRIVATE); Editor editor=preferences.edit(); String name="xixi"; String age="22"; editor.putString("name", name); editor.putString("age", age); editor.commit(); ~~~ (4)从SharedPreferences获取数据: ~~~ SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE); String name=preferences.getString("name", "defaultname"); String age=preferences.getString("age", "0"); ~~~ ### 3、简单案例展示: ~~~ findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub SharedPreferences sharedPreferences=getSharedPreferences("user", Context.MODE_PRIVATE); // 实例化SharedPreferences对象 Editor editor=sharedPreferences.edit(); // 实例化SharedPreferences.Editor对象 editor.putString("name", "张三"); // 用putString的方法保存数据 editor.putString("IP", "192.168.1.102"); editor.putString("password", "123456"); editor.commit(); // 提交当前数据 Toast.makeText(MainActivity.this, "写入数据成功!", Toast.LENGTH_SHORT).show(); } }); findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在读取SharedPreferences数据前要实例化出一个SharedPreferences对象 SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE); String nameStr=preferences.getString("name", "dafultName"); // 使用getString方法获得value,注意第2个参数是value的默认值 String ipStr=preferences.getString("IP", ""); // getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值 String pwStr=preferences.getString("password", ""); Toast.makeText(MainActivity.this, "用户信息:姓名:"+nameStr+",IP:"+ipStr+",密码:"+pwStr, Toast.LENGTH_LONG).show(); } }); ~~~ 关于SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。 数据文件图示: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-06_5704cceda7349.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-06_5704ccedbcc77.jpg) ### 4、关于“记住用户登录信息”的案例: xml: ~~~ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="用户名:" /> <EditText android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_weight="1" android:hint="请输入登录名" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="IP地址:" /> <EditText android:id="@+id/ip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_weight="1" android:hint="请输入IP地址" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="密 码:" /> <EditText android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_weight="1" android:hint="请输入密码" android:inputType="textPassword" /> </LinearLayout> <CheckBox android:id="@+id/check" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住用户名" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="登录" /> <Button android:id="@+id/cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消" /> </LinearLayout> </LinearLayout> ~~~ Main.java ~~~ public class MainActivity extends Activity implements OnClickListener { private EditText etName,etIP,etPw; private CheckBox checkBox; private Button btnLogin,btnCancel; SharedPreferences sharedPreferences; Editor editor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etName=(EditText) findViewById(R.id.name); etIP=(EditText) findViewById(R.id.ip); etPw=(EditText) findViewById(R.id.password); checkBox=(CheckBox) findViewById(R.id.check); btnLogin=(Button) findViewById(R.id.login); btnCancel=(Button) findViewById(R.id.cancel); btnLogin.setOnClickListener(this); btnCancel.setOnClickListener(this); sharedPreferences = getSharedPreferences("UserInfo", MODE_PRIVATE); editor = sharedPreferences.edit(); String getName = sharedPreferences.getString("name", ""); //此处是关于“记住登录信息”的操作 String getIP=sharedPreferences.getString("IP", ""); String getPassword=sharedPreferences.getString("password", ""); if(getName==null){ checkBox.setChecked(false); } else{ checkBox.setChecked(true); etName.setText(getName); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.login: String name = etName.getText().toString().trim(); String IP = etIP.getText().toString().trim(); String password=etPw.getText().toString().trim(); if(name.equals("admin") /*&& IP.equals("192.168.1.102")*/ && password.equals("GO")){ if(checkBox.isChecked()){ editor.putString("name", name); //只记住登录名 //editor.putString("IP", IP); //editor.putString("password", password); editor.commit(); Toast.makeText(MainActivity.this, "登录名已保存", Toast.LENGTH_SHORT).show(); } else{ editor.remove("name"); //如果没有勾选“记住登录信息” //editor.remove("IP"); //editor.remove("password"); editor.commit(); Toast.makeText(MainActivity.this, "登录名未保存", Toast.LENGTH_SHORT).show(); } Toast.makeText(MainActivity.this, "登陆成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show(); } break; case R.id.cancel: break; } } } ~~~ 效果图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-06_5704ccedcb91d.jpg) 登陆成功以后,返回退出,重新进入该应用程序,用户名已经存在!(勾掉“记住用户名”,则不会自动填写用户名一栏) ### 4、不同APP通过SharedPreferences传递数据(共享数据) 具体案例见:[http://blog.csdn.net/songshimvp1/article/details/50300521](http://blog.csdn.net/songshimvp1/article/details/50300521)
';