首页 > 代码库 > 第三十五讲:Android数据储存之SharedPreferences
第三十五讲:Android数据储存之SharedPreferences
人的一生,总是难免有浮沉。不会永远如旭日东升,也不会永远痛苦潦倒。反复地一浮一沉,对于一个人来说,正是磨练。因此,浮在上面的,的,不必骄傲;沉在底下的,更用不着悲观。必须以率直、谦虚的态度,乐观进取、向前迈进。 —— 松下幸之助
本讲内容:SharedPreferences 数据储存
一、SharedPreferences的作用
应用程序在运行的时候,可能会随着用户的使用而保持该用户的配置信息,如上次播放时的eq设置,音量设置等等,这些小量 的信息可以通过SharedPreferences来保持,通过SharedPreferences保持的数据为一个XML文件,位于应用程序的私有文件夹。保存的数据主要是简单类型的键值对(key-value)
二、SharedPreferences是一个接口,程序是无法创建SharedPreferences实例的,可以通过Context.getSharedPreferences(String name.int mode)来得到一个SharedPreferences实例
name:是指文件名称,不需要加后缀.xml,系统会自动为我们添加上。一般这个文件存储在/data/data/<package name>/shared_prefs下(这个面试常问到)
mode:是指定读写方式,其值有三种,分别为:
Context.MODE_PRIVATE:指定该SharedPreferences数据只能被本应用程序读、写
Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写
Context.MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写
三、由于SharedPreference是一个接口,而且在这个接口里并没有提供写入数据和读取数据的能力。但是在其内部有一个Editor内部的接口,Editor这个接口有一系列的方法用于操作SharedPreference。
Editor接口的常用方法
public abstract SharedPreferences.Editor clear () | 清空SharedPreferences里所有的数据 |
public abstract boolean commit () | 当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改 |
public abstract SharedPreferences.Editor putXXX (String key, boolean XXX) | 向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值 |
public abstract SharedPreferences.Editor remove (String key) | 删除SharedPreferences里指定key对应的数据项 |
四、下面我们通过service的一个音乐播放例子,“播放”与“暂停”两个按钮暂停之后,保持播放进度到SharedPreferences里面,然后再次播放的话,读取进度值进行音乐播放。
下面是res/layout/activity_main.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" android:background="@drawable/c1" tools:context="com.example.text.MainActivity$PlaceholderFragment" > <Button android:id="@+id/button01" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="play" android:textSize="20sp" android:layout_marginTop="5dp"/> <Button android:id="@+id/button02" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="pause" android:textSize="20sp" android:layout_marginTop="5dp"/> </LinearLayout>
下面是新建一个MusicService.java界面文件:
public class MusicService extends Service{ private MediaPlayer player; public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { player=MediaPlayer.create(this, R.raw.apple); player.setLooping(false); //设置不自动循环 } //该服务被销毁时调用该方法 @Override public void onDestroy() { SharedPreferences sp = this.getSharedPreferences("music_progress", MODE_PRIVATE); //获得editor对象,写入一个整数到SharePreferences中,记住要用commit()提交,否则不会实现写入操作 sp.edit().putInt("progress", player.getCurrentPosition()).commit(); // player.getCurrentPosition()方法获取播放进度的数据 // commit()方法是保存SharedPreferences获取来的数据 player.stop(); } public void onStart(Intent intent, int startId) { //获得SharedPreferences对象 SharedPreferences sp = this.getSharedPreferences("music_progress", MODE_PRIVATE); // music_progress为XML文件的文件名 //播放器跳转到上一次播放的进度 player.seekTo(sp.getInt("progress", 0)); // progress为键值对中的key,progress所对应的值通过player.getCurrentPosition()获得,请看下面详细 // 每次调用onStart方法时,就会设置player的进度 // MediaPlayer的seekTo方法,读取进度,然后播放,getInt的第一个参数是所要读取的key名字,第二个参数为默认初始值。也就是说进度初始默认为0 player.start(); } }注意在AndroidManifest.xml文件中注册
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity implements OnClickListener{ private Button b1; private Button b2; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button) findViewById(R.id.button01); b2=(Button) findViewById(R.id.button02); b1.setOnClickListener(this); b2.setOnClickListener(this); intent = new Intent(MainActivity.this,MusicService.class); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button01: startService(intent); break; case R.id.button02: stopService(intent); break; } } }
下面是运行结果:
本讲到这里,谢谢大家!
第三十五讲:Android数据储存之SharedPreferences