PreferenceFragment 內修改偏好設定後,其他 Activity/Service 如何讀取相同資料?是否需重新建立 SharedPreferences?
// 在任何 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,避免衝突。 |
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) 直接存取,**無需重建、無需傳檔名**,極度便利。