SharedPreferences 是 Android 中一種用來儲存少量資料(例如登入狀態、使用者偏好、設定等)的工具,適合存取key-value 配對的資料,像是Boolean、String、int,它儲存的格式是xml檔,且可以跨頁存取,由於是在你的手機裡創建一個xml檔,所以資料被寫入後是不會因關閉APP而消失的
import android.content.SharedPreferences;
首先我們在MainActivity中先建立創建一個叫user的SharedPreferences
SharedPreferences user = getSharedPreferences("user", MODE_PRIVATE);
這個方法會自動幫你在 app 的儲存目錄裡建立一個 XML 檔案,存放資料
PS:資料存檔的檔案名稱(命名),必須是String,MODE_PRIVATE 是權限,表示只允許該APP存取,其他的權限模式已在Android 4.2的版本時因安全性疑慮而被廢棄了
創建後我們就要往裡面寫入資料,所以要先讓它進入編輯狀態(.Editor)
SharedPreferences.Editor editor = user.edit();
現在就可以寫入資料了,以key與value對應資料的數據存放
editor.putString(key,value);
寫完就要送出儲存時,有兩種寫法:editor.commit() 或 editor.apply()。
commit() 會回傳一個 boolean 值,表示是否儲存成功。它是同步執行,會阻塞主執行緒,因此適合用在需要馬上確認是否成功寫入、或需要根據結果做後續處理的情況。
apply() 則是非同步執行,會在背景儲存資料,不會卡住主執行緒,但不會回傳是否成功寫入。適合用在不太重要或不需立即處理的資料。
在實務中,大多數情況會使用 apply(),因為它效能較佳且不影響 UI 操作。
我在這頁只寫了創建 寫入以及送出,在點擊按鈕跳轉至TestActivity時才會在TestActivity顯示user裡的資料
SharedPreferences user = getSharedPreferences("user", MODE_PRIVATE);
//開始寫入
SharedPreferences.Editor editor = user.edit();
//存放資料 key/value
editor.putString("username", "feng");
editor.putInt("loginCount", 5);
editor.putBoolean("isFirstLogin", true);
//提交 或editor.apply();
editor.commit();
在這頁,我們先透過getSharedPreferences("user", MODE_PRIVATE)來獲取SharedPreferences,再用 user.getString("username", "未設定")來讀取username裡的資料,前面是我們想調取的值的key,後面是挼裡面沒有資料則回傳"未設定"
另外,若你是在創建的那頁讀取資料,則不用加getSharedPreferences("user", MODE_PRIVATE)這行
有寫入自然也有刪除,要刪除便要先開啟編輯模式
一樣是SharedPreferences.Editor editor = user.edit();
開啟後就可以 editor.remove("username")
裡面輸入你想刪除的key
刪除或寫入完畢一定要記得用 editor.commit()送出!!!
再次讀取更新後的資料,因為name不會自動更新,需再檢查一次
String updatedName = user.getString("username", "已被移除");
SharedPreferences user = getSharedPreferences("user", MODE_PRIVATE);
// 讀取資料 若沒讀取到顯示未設定
String name = user.getString("username", "未設定");
textView.setText(name);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = user.edit();
// 清除某個 key 的資料
editor.remove("username"); // 移除 username
//送出
editor.commit();
// 再次讀取更新後的資料 因為name不會自動更新 需再檢查一次
String updatedName = user.getString("username", "已被移除");
textView.setText(updatedName);
}
});
成果展示:
PS.若你需要清除所有資料可以再開啟編輯模式後使用editor.clear()
PPS.如果想判斷是否有存過這個 key可以像這樣寫
if (user.contains("username")) {
//
}