很久以前就接觸過sharedPreference這個android中的儲存介質。但是一直沒有實際使用過,今天在看之前做的“民用機型大全”的app時,突然想到可以使用sharedPreference類來改進這個app中的一個缺陷。
此前,我先介紹sharedPreference的使用。
Android資料總共有四種儲存的方式
一、SharePreference
二、SQLite
三、File
四、ContentProvider
SharedPreference類是一個輕量級的儲存類,特別適合儲存軟體的配置參數。SharedPreference實際上是產生一個xml檔案來存放資料,這個xml檔案產生以後的存放位置在“/data/data/<package name>/shared_prefs”目錄下。
SharedPreference類的使用流程如下:
一、擷取SharedPreference類的執行個體化對象
二、擷取Editor對象用於編輯SharedPreference類執行個體
三、利用Editor添加(修改)資料
四、使用commit()提交事務
一、擷取SharedPreference類的執行個體化對象
擷取SharedPreference類執行個體化的對象的方法有兩種
(1)Context.getSharedPreferences(String name,int mode)
參數解析:
a)name是SharedPreference產生的xml檔案的檔案名稱,假設參數name處填寫為“firstTest”,那麼代碼執行後SharedPreference將產生一個firstTest.xml檔案。這個xml採用鍵-值對的形式儲存參數。
b) mode是建立模式,是設定SharedPreference的儲存的模式,總共有四種參數:
Context.MODE_PRIVATE: 預設的操作模式,代表檔案是私人資料,只能被本地應用訪問
Context.MODE_APPEND: 檢查檔案是否存在,存在則往檔案中追加內容,否則建立新檔案
Context.MODE_WORLD_READABLE: 當前檔案可被其他應用程式讀取 ·
Context.MODE_WORLD_WRITEABLEs: 當前檔案可被其他應用程式寫入
(2)Activity.getPreferences(int mode)
這種方式下,name是通過getLocalClassName()得到的,不能讓我們自己設定,而且最終會調到ContextWrapper的getSharedPreferences()
推薦使用第一種方法擷取SharedPreference類的執行個體化對象
二、擷取Editor對象
SharedPreferences對象本身只能擷取資料而不支援儲存和修改,儲存修改是通過Editor對象實現。具體實現如下
SharedPreferences sp = ctx.getSharedPreferences("Test", MODE_PRIVATE);
Editor editor = sp.edit();
三+四、利用Editor添加(修改)資料+使用commit()提交事務
Editor中內建了一些常用變數的寫入函數(使用鍵-值對),方便儲存資料,儲存完資料之後,一定要使用commit()函數提交事務,才能完成資料的儲存,具體實現如下:
editor.putString("STRING_KEY", "string"); editor.putInt("INT_KEY", 0); editor.putBoolean("BOOLEAN_KEY", true); editor.commit();
通過SharedPreference類,我們就可以實現【使用者引導功能】只在第一次進入app時執行。具體實現如下:
/** * 該類是進入app的第一個介面,顯示開啟app的動畫 * @author LiXuetao */public class startAnimationActivity extends Activity { public static final int SKIP_GUIDE = 0x001; public static final int SKIP_MAIN = 0x002; SharedPreferences sharedPreferences; //該線程用於延遲跳轉activity Thread thread; //判斷是否第一次開啟該應用 Boolean b; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_startanimation); /** * context.getgetSharedPreferences(String name, int mode) 擷取sharedPreference對象 * name是sharedPreference產生的xml檔案的名字 */ sharedPreferences = getSharedPreferences("test", Context.MODE_PRIVATE); thread = new Thread(runnable); thread.start(); } //此handler用於處理介面的變換(跳轉activity) Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case SKIP_GUIDE: Intent guideIntent = new Intent(startAnimationActivity.this, guideActivity.class); startActivity(guideIntent); break; case SKIP_MAIN: Intent mainIntent = new Intent(startAnimationActivity.this, MainActivity.class); startActivity(mainIntent); break; } }; }; Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { //getBoolean(String key, boolean defValue) 擷取鍵isFirst的值,若無此鍵則擷取預設值(第一次開啟程式的時候沒有isFirst這個鍵) b = sharedPreferences.getBoolean("isFirst", true); Message msg = handler.obtainMessage(); if(b){ //Editor對象用於修改sharedpreference對象,修改完後必須提交事務,才能完成修改(參考資料庫的交易處理) Editor editor = sharedPreferences.edit(); editor.putBoolean("isFirst", false); editor.commit(); msg.what = SKIP_GUIDE; }else{ msg.what = SKIP_MAIN; } //休眠3s後,將資訊發給handler,由handler來跳轉activity Thread.sleep(3000); handler.sendMessage(msg); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } };}/** * 該類是app的主介面 * @author LiXuetao * */public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }}/** * 該類是app的引導介面,只在app第一次啟動時執行 * @author LiXuetao */public class guideActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_guide); } }
以上就是app第一次啟動時進入guide介面的具體實現代碼。
我最開始說的機型大全的APP存在的問題是由於該APP的資料庫是外部匯入的,所以每次修改資料庫都要重新匯入資料庫,否則就會資料就會按照上個版本的資料庫顯示。當時我實在想不出辦法來,只好在每次開啟app的時候只要檢測到資料庫存在就刪了它,然後重新匯入app。
現在有了sharedPreference,就可以實現只在第一次啟動app時刪除原先的資料庫,匯入新的資料庫了。 完了,我要去改代碼了~~~