Android系统在数据存储和数据共享方面提供了多种方式,包括前面我们讲过的使用SQLite数据库的方式,本文将为大家讲解另一种共享数据和存储数据的方式-共享参数类SharedPreferences的使用。
一、SharedPreferences简介
SharedPreferences是一种轻量级的数据存储方式,学过Web开发的同学,可以想象它是一个小小的Cookie。它可以用键值对的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下(data/data/包名/shared_prefs/)自己定义的xml文件中。下面我们用一个记录音乐播放进度的例子来学习SharedPreferences的使用。
二、SharedPreferences实例
1、建立一个新的项目Lesson19_HelloSharedPreferences,Activity名字叫MainHelloSharedPreferences.java。
2、建立一个MusicService.java的Service,代码如下:
Java代码packageandroid.basic.lesson19;
importandroid.app.Service;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.SharedPreferences;
importandroid.media.MediaPlayer;
importandroid.os.IBinder;
importandroid.widget.Toast;
publicclassMusicServiceextendsService {
//定义MediaPlayer播放器变量
MediaPlayer mPlayer =newMediaPlayer();
@Override
publicvoidonCreate() {
Toast.makeText(getApplicationContext(),"Service onCreate()", Toast.LENGTH_LONG).show();
//创建播放器
mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
//设置自动循环
mPlayer.setLooping(true);
}
@Override
publicIBinder onBind(Intent intent) {
Toast.makeText(getApplicationContext(),"Service onBind()", Toast.LENGTH_LONG).show();
//获得SharedPreferences对象
SharedPreferences preferences =this.getSharedPreferences("MusicCurrentPosition",Context.MODE_WORLD_WRITEABLE);
//播放器跳转到上一次播放的进度
mPlayer.seekTo(preferences.getInt("CurrentPosition",0));
//开始播放
mPlayer.start();
returnnull;
}
@Override
publicbooleanonUnbind(Intent intent){
Toast.makeText(getApplicationContext(),"Service onUnbind()", Toast.LENGTH_LONG).show();
//获得SharedPreferences对象
SharedPreferences preferences =this.getSharedPreferences("MusicCurrentPosition",Context.MODE_WORLD_WRITEABLE);
Toast.makeText(getApplicationContext(),"CurrentPosition="+mPlayer.getCurrentPosition(), Toast.LENGTH_LONG).show();
//获得editor对象,写入一个整数到SharePreferences中,记住要用commit()提交,否则不会实现写入操作
preferences.edit().putInt("CurrentPosition",mPlayer.getCurrentPosition()).commit();
mPlayer.stop();
returnfalse;
}
}
3、更改AndroidManifest.xml内容如下:
XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>
4、res/layout/mail.xml的内容如下:
XML/HTML代码<?xmlversion ="1.0"encoding="utf-8"?>
5、MainHelloSharedPreferences.java的内容如下:
Java代码packageandroid.basic.lesson19;
importandroid.app.Activity;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.ServiceConnection;
importandroid.os.Bundle;
importandroid.os.IBinder;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.Toast;
publicclassMainHelloSharedPreferencesextendsActivity {
/** Called when the activity is first created. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//定义UI组件
Button b1 = (Button) findViewById(R.id.Button01);
Button b2 = (Button) findViewById(R.id.Button02);
//定义ServiceConnection对象
finalServiceConnection conn =newServiceConnection() {
@Override
publicvoidonServiceConnected(ComponentName name, IBinder service) {
}
@Override
publicvoidonServiceDisconnected(ComponentName name) {
}
};
//定义按钮的单击监听器
OnClickListener ocl =newOnClickListener() {
@Override
publicvoidonClick(View v) {
Intent intent =newIntent(MainHelloSharedPreferences.this,
android.basic.lesson19.MusicService.class);
switch(v.getId()) {
caseR.id.Button01:
Toast.makeText(getApplicationContext(),"Button01 onClick", Toast.LENGTH_LONG).show();
//绑定服务
bindService(intent,conn,Context.BIND_AUTO_CREATE);
break;
caseR.id.Button02:
Toast.makeText(getApplicationContext(),"Button02 onClick", Toast.LENGTH_LONG).show();
//取消绑定
unbindService(conn);
break;
}
}
};
//绑定单击监听器
b1.setOnClickListener(ocl);
b2.setOnClickListener(ocl);
}
}
6、运行程序,查看运行情况:
查看File Explorer,在/data/data/android.basic.lesson19/shared_prefs/目录下有一个MusicCurrentPosition.xml文件,点击右上角的按钮pull a file from the device,可以把这个xml文拷贝出来:
7、查看MusicCurrentPosition.xml的内容,可以看到音乐播放进度的数据存贮在这个xml中:
XML/HTML代码<?xmlversion ='1.0'encoding='utf-8'standalone='yes'?>
大家可以试着扩展下本实例,为Activity添加一个按钮,点击它实现的功能是取出SharedPreferences中的播放进度数据,显示在另一个文本框Textview02里。下面直接贴上最终的运行效果图,至于程序,大家可以试着自己写一下,更加深刻的理解Share,同一个进程中的不同组件是否都可以访问此共享的持久化数据?这一点是不是与Cookie有些类似?
2012年7月31日