首页 > 代码库 > 第三十五讲: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