天天看點

Android SharedPreferences和File

本講内容:SharedPreferences 和 Android中的檔案IO操作

1、SharedPreferences

2、Android中的檔案IO操作

Android中進行資料共享和資料存儲有多種方式,前面我們講過使用Sqlite資料庫的方式,今天我們講一下SharedPreferences和檔案讀寫操作方式。

一、SharedPreferences

SharedPreferences是一種輕量級的資料存儲方式,學過Web開發的同學,可以想象它是一個小小的Cookie。它可以用鍵值對的方式把簡單資料類型(boolean、int、float、long和String)存儲在應用程式的私有目錄下(data/data/包名/shared_prefs/)自己定義的xml檔案中。下面我們用一個記錄音樂播放進度的例子來學習SharedPreferences的使用。

1、建立一個新的項目 Lesson19_HelloSharedPreferences , Activity名字叫 MainHelloSharedPreferences.java

2、建立一個MusicService.java的Service,代碼如下:

view sourceprint?01 package android.basic.lesson19;

02

03 import android.app.Service;

04 import android.content.Context;

05 import android.content.Intent;

06 import android.content.SharedPreferences;

07 import android.media.MediaPlayer;

08 import android.os.IBinder;

09 import android.widget.Toast;

10

11 public class MusicService extends Service {

12

13 //定義MediaPlayer播放器變量

14 MediaPlayer mPlayer = new MediaPlayer();

15

16 @Override

17 public void onCreate() {

18 Toast.makeText(getApplicationContext(), "Service onCreate()", Toast.LENGTH_LONG).show();

19 //建立播放器

20 mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.babayetu);

21 //設定自動循環

22 mPlayer.setLooping(true);

23 }

24

25 @Override

26 public IBinder onBind(Intent intent) {

27 Toast.makeText(getApplicationContext(), "Service onBind()", Toast.LENGTH_LONG).show();

28 //獲得SharedPreferences對象

29 SharedPreferences preferences = this.getSharedPreferences("MusicCurrentPosition",Context.MODE_WORLD_WRITEABLE);

30 //播放器跳轉到上一次播放的進度

31 mPlayer.seekTo(preferences.getInt("CurrentPosition", 0));

32 //開始播放

33 mPlayer.start();

34 return null;

35 }

36

37 @Override

38 public boolean onUnbind(Intent intent){

39 Toast.makeText(getApplicationContext(), "Service onUnbind()", Toast.LENGTH_LONG).show();

40 //獲得SharedPreferences對象

41 SharedPreferences preferences = this.getSharedPreferences("MusicCurrentPosition",Context.MODE_WORLD_WRITEABLE);

42 Toast.makeText(getApplicationContext(), "CurrentPosition="+mPlayer.getCurrentPosition(), Toast.LENGTH_LONG).show();

43 //獲得editor對象,寫入一個整數到SharePreferences中,記住要用commit()送出,否則不會實作寫入操作

44 preferences.edit().putInt("CurrentPosition",mPlayer.getCurrentPosition()).commit();

45 mPlayer.stop();

46 return false;

47 }

48 }

3、更改AndroidManifest.xml内容如下:

view sourceprint?01 <?xml version="1.0" encoding="utf-8"?>

02 <MANIFEST package="android.basic.lesson19" xmlns:android="http://schemas.android.com/apk/res/android" android:versioncode="1" android:versionname="1.0">

03 <APPLICATION android:label="@string/app_name" android:icon="@drawable/icon">

04 <ACTIVITY android:label="@string/app_name" android:name=".MainHelloSharedPreferences">

05 <INTENT -filter>

06 <ACTION android:name="android.intent.action.MAIN" />

07 <CATEGORY android:name="android.intent.category.LAUNCHER" />

08 </INTENT>

09 </ACTIVITY>

10 <SERVICE android:name=".MusicService" android:enabled="true">

11 </SERVICE>

12 </APPLICATION>

13 <USES -sdk android:minsdkversion="8" />

14

15 </MANIFEST>

4、res/layout/mail.xml的内容如下:

view sourceprint?01 <?xml version="1.0" encoding="utf-8"?>

02 <LINEARLAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical">

03 <TEXTVIEW android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/TextView01" android:text="SharedPreferences的使用" android:textsize="20sp">

04 </TEXTVIEW>

05

06 <BUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button01" android:text="綁定音樂播放服務" android:textsize="20sp" android:layout_margintop="10dp">

07 </BUTTON>

08 <BUTTON android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/Button02" android:text="解綁定音樂播放服務" android:textsize="20sp" android:layout_margintop="10dp">

09 </BUTTON>

10 </LINEARLAYOUT>

5、MainHelloSharedPreferences.java的内容如下:

view sourceprint?01 package android.basic.lesson19;

02

03 import android.app.Activity;

04 import android.content.ComponentName;

05 import android.content.Context;

06 import android.content.Intent;

07 import android.content.ServiceConnection;

08 import android.os.Bundle;

09 import android.os.IBinder;

10 import android.view.View;

11 import android.view.View.OnClickListener;

12 import android.widget.Button;

13 import android.widget.Toast;

14

15 public class MainHelloSharedPreferences extends Activity {

16

17 @Override

18 public void onCreate(Bundle savedInstanceState) {

19 super.onCreate(savedInstanceState);

20 setContentView(R.layout.main);

21

22 //定義UI元件

23 Button b1 = (Button) findViewById(R.id.Button01);

24 Button b2 = (Button) findViewById(R.id.Button02);

25

26 //定義ServiceConnection對象

27 final ServiceConnection conn = new ServiceConnection() {

28

29 @Override

30 public void onServiceConnected(ComponentName name, IBinder service) {

31 }

32

33 @Override

34 public void onServiceDisconnected(ComponentName name) {

35 }

36 };

37

38 //定義按鈕的單擊監聽器

39 OnClickListener ocl = new OnClickListener() {

40 @Override

41 public void onClick(View v) {

42 Intent intent = new Intent(MainHelloSharedPreferences.this,

43 android.basic.lesson19.MusicService.class);

44 switch (v.getId()) {

45 case R.id.Button01:

46 Toast.makeText(getApplicationContext(), "Button01 onClick", Toast.LENGTH_LONG).show();

47 //綁定服務

48 bindService(intent,conn,Context.BIND_AUTO_CREATE);

49 break;

50 case R.id.Button02:

51 Toast.makeText(getApplicationContext(), "Button02 onClick", Toast.LENGTH_LONG).show();

52 //取消綁定

53 unbindService(conn);

54 break;

55 }

56 }

57 };

58

59 //綁定單擊監聽器

60 b1.setOnClickListener(ocl);

61 b2.setOnClickListener(ocl);

62

63 }

64 }

6、運作程式,檢視運作情況:

檢視 File Explorer,在/data/data/android.basic.lesson19/shared_prefs/目錄下有一個MusicCurrentPosition.xml檔案,點選右上角的按鈕 pull a file from the device,可以把這個xml文拷貝出來

7、檢視MusicCurrentPosition.xml的内容,可以看到音樂播放進度的資料存貯在這個xml中

view sourceprint?1 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

2 <MAP>

3 <INT value="15177" name="CurrentPosition" />

4 </MAP>

興趣的同學可以嘗試一下,在Activity中增加一個按鈕,點選以後把SharedPreference中的播放進度資料取出來,顯示在另一個文本框Textview02裡,我在這裡把最後的運作結果圖放這裡,代碼你們可以自己練習着敲出來,從中體會Share的意思,是不是在同一個APK中不同的元件之間都可以去通路這個共享的持久化資料?從這一點上說是不是有點像是Cookie?