首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android PreferenceFragment 共享偏好設定:跨元件存取 PreferenceManager.getDefaultSharedPreferences

     編輯:程式設計疑難解答

問題

PreferenceFragment 內修改偏好設定後,其他 Activity/Service 如何讀取相同資料?是否需重新建立 SharedPreferences?

答案:直接用 PreferenceManager.getDefaultSharedPreferences(Context)

// 在任何 Context (Activity, Service, Application, BroadcastReceiver) 中
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
// 讀取
boolean notificationsEnabled = prefs.getBoolean("notifications_key", true);
String syncFrequency = prefs.getString("sync_frequency_key", "daily");

// 寫入 (需求較少,通常只在 PreferenceFragment 內寫)
prefs.edit().putBoolean("notifications_key", false).apply();

原理

  • PreferenceFragment 預設操作的正是 **DefaultSharedPreferences**(檔案路徑:/data/data/pkg/shared_prefs/pkg_preferences.xml)。
  • PreferenceManager.getDefaultSharedPreferences(context) 回傳的正是同一個 SharedPreferences 實例(進程內單例)。
  • 無需傳遞檔名、無需 getSharedPreferences("custom_name", MODE_PRIVATE)。

注意事項

情境處理方式
多進程 (如 :remote 服務)DefaultSharedPreferences **不支援** 多進程同步。需自建 getSharedPreferences("name", MODE_MULTI_PROCESS) (API 23+ 已棄用) 或用 ContentProvider/資料庫同步。
偏好設定變更監聽在 PreferenceFragment 內 OnSharedPreferenceChangeListener 即可;其他元件用 prefs.registerOnSharedPreferenceChangeListener(listener)。
XML 定義 key 命名建議加前綴區分模組:pref_notifications, pref_sync_freq,避免衝突。

程式碼範例:Service 中讀取偏好決定行為

public class SyncService extends IntentService {
    public SyncService() { super("SyncService"); }

    @Override
    protected void onHandleIntent(Intent intent) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String freq = prefs.getString("sync_frequency_key", "daily");
        long interval = "daily".equals(freq) ? 24*3600*1000 : 3600*1000;
        
        // 執行同步邏輯...
    }
}

總結

PreferenceFragment 讀寫的正是 **DefaultSharedPreferences**。全應用任何元件均可透過 PreferenceManager.getDefaultSharedPreferences(context) 直接存取,**無需重建、無需傳檔名**,極度便利。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved