任何一個應用程序都要依賴數據存儲,而且這種存儲必須不丟失數據,並且有效、簡便使用和更新這些數據。在 Android 操作系統中一共提供了4種數據存儲方式,但是由於存儲的這些數據都是私有的,所以如果需要共享其他應用程序的數據,就需要我們上篇文章說到的 Content Provider。4種數據存儲方式分別為如下:
- 1、Shared Preferences。
用來存儲 “鍵-值”格式的數據。
- 2、Files。
通過FileInputStream和FileOutputStream對文件進行操作。
- 3、SQLite。
標准數據庫,支持SQL語句。
- NetWork。
通過網絡存儲和獲取數據。
本篇中主要講述4種之一的Shared Preferences,因為在前幾篇己經有SQLite的用法做了簡單介紹,所以在以下的幾篇將會跳過SQLite的講解。下面開始講述Shared Preferences。主要內容如下:
- 1、Shared Preferences 是什麼?
- 2、如何使用 Shared Preferences 獲得數據?
- 3、如何使用 Shared Preferences 保存數據?
- 3.1、使用getPreferences方法創建文件的模式。
- 4、模擬用戶參數設置。
- 5、查看 Preferences 產生的文件。
1、Shared Preferences 是什麼?
Shared Preferences 類似於winform中做一些小型配置的ini文件,用來保存一些用戶設置的參數。例如,可以通過它保存上一次用戶所做的修改或者自定義參數設定,當再次啟動程序後依然保持原有設置。
2、如何使用 Shared Preferences 保存數據?
Shared Preferences提供了getPreferences方法來獲得Preferences對象,取得該對象了,即可以使用Editor取得編輯對象
3、如何使用 Shared Preferences 保存數據?
上文獲得Editor對象之後即可通過 Android 提供的各自操作函數進行數據提交,如:putBoolean()提交一個鍵值 為bool值的數據,最後通過commit方法保存這些數據。
3.1、使用getPreferences方法創建文件的模式
在 Android系統提供的API中, 獲取 Preferences對象有四種類型,分別如下:
- 文件創建模式:Activity.MODE_APPEND
如果該文件已經存在,然後將數據寫入,而不是抹掉它現有文件的末尾。
- 文件創建模式:MODE_PRIVATE
默認模式,在那裡創建的文件只能由應用程序調用,即為私有的
- 文件創建模式:Activity.MODE_WORLD_READABLE
允許所有其他應用程序有讀取和創建文件的權限。
- 文件創建模式:Activity.MODE_WORLD_WRITEABLE
允許所有其他應用程序具有寫入、訪問和創建的文件權限。
本例中使用到了私有的文件創建模式,來獲取Preferences對象。
4、 模擬用戶參數設置
在模擬的例子中,我們放了一個復選框和一個文本顯示控件,然後通過播放音樂來達到模擬效果。當復選框選中時打開音樂,文本顯示控件顯示當前音樂為:打開,如果反選復選框則音樂停止,文本顯示控件顯示當前音樂為:關閉。如果你按下模擬器的返回按鈕退出的同時保存當前的狀態,如果復選框選中則一打開程序立刻播放音樂,反之則不播放音樂。代碼如下:
音樂播放示例代碼
package com.terry;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class sharedPreActivity extends Activity {
private TextView myTextView;
private CheckBox myBox;
private playMusic PLAYER=null;
private boolean isplay=false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTextView=(TextView)findViewById(R.id.TextView01);
myBox=(CheckBox)findViewById(R.id.CheckBox01);
PLAYER=new playMusic(this);
/*
* 文件創建模式:Activity.MODE_APPEND
* 如果該文件已經存在,然後將數據寫入,而不是抹掉它現有文件的末尾。
*/
/*
* 文件創建模式:MODE_PRIVATE
* 默認模式,在那裡創建的文件只能由應用程序調用,即為私有的
*/
/*
* 文件創建模式:Activity.MODE_WORLD_READABLE
* 允許所有其他應用程序有讀取和創建文件的權限。
*/
/*
* 文件創建模式:Activity.MODE_WORLD_WRITEABLE
* 允許所有其他應用程序具有寫入、訪問和創建的文件權限。
*/
SharedPreferences settings=getPreferences(Activity.MODE_PRIVATE);
isplay=settings.getBoolean("isplay", false); //通過key值找到value,如果不存在即返回false
myBox.setChecked(isplay);
if(isplay){
myTextView.setText("當前音樂的播放狀態:開");
isplay=true;
PLAYER.Play();
}
else{
myTextView.setText("當前音樂的播放狀態:關");
}
myBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if(isChecked)
{
myTextView.setText("當前音樂的播放狀態:開");
isplay=true;
PLAYER.Play();
}
else{
myTextView.setText("當前音樂的播放狀態:關");
isplay=false;
PLAYER.FreeMusc();
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK){
SharedPreferences uiState=getPreferences(0);
SharedPreferences.Editor editor=uiState.edit();
editor.putBoolean("isplay", isplay);
editor.commit();
if(isplay)
{
PLAYER.FreeMusc();
}
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
其中,settings.getBoolean提供了兩個參數,第一個參數為鍵值,第二個則為默認值。當通過鍵值獲取空數據時,則返回第二個參數。
以上代碼的音樂播放類如下:
package com.terry;
import java.io.IOException;
import android.content.Context;
import android.media.MediaPlayer;
public class playMusic {
public MediaPlayer music=null;
private Context myContext;
public playMusic(Context cc)
{
myContext=cc;
}
public void Play()
{
music=MediaPlayer.create(myContext, R.raw.start);
music.setLooping(true);
try {
music.prepare();
} catch (IllegalStateException e) {
// TODO: handle exception
e.printStackTrace();
}
catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
music.start();
}
public void FreeMusc()
{
if(music!=null)
{
music.stop();
music.release();
}
}
}
5、查看 Preferences 產生的文件
通過上面的例子和代碼的實現,己經實現了我們當初期望得到的效果,如果說它像winform中的ini文件,那麼它就會創建在一個地方咯。沒錯,下面我們就來找到它。
在每安裝一個Android 應用程序時,data/data目錄下都會產生一個文件夾,如果應用程序中使用了 Preferences 則會在該應用程序文件夾下產生一個shared_prefs文件夾,我們產生的文件正安靜的躺在那裡等著我們呢。。。。(YY中。。。),查看步驟要求:
- 必須啟動模擬器,運行程序。
- 在 你使用的IDE中切換到DDMS視圖,選擇File Explorer標簽。注意:如果你的File Explorer裡面沒有任何東西,請根據此步驟找回--》DDMS-在Devices標簽中選擇
點擊Reset adb即可將你的 File Explorer還原。
- 找到/data/data目錄中對應的項目文件夾下的shared_prefs文件夾
好了,今天的數據存儲就講到這裡,例子的運行圖如下:
源碼下載:/Files/TerryBlog/sharedPreDemo.rar