我有一個簡單的應用程序,一個活動和一個服務。SharedPreferences沒有保存或完全清除時間
該活動有一個切換按鈕來啓動和停止服務。該服務有通知顯示它何時啓動,何時啓動。通知文本由活動設置,存儲在SharedPreferences
中,並在服務內讀取onCreate()
。
切換按鈕在啓動/停止服務時保存布爾型serviceStarted
,所以當活動啓動時,如果之前啓動了服務,我可以重新啓動服務。
我的錯誤是:有時,serviceStarted
未正確保存。我可以通過查看sharedPreferences文件來看到這一點。它大部分時間都在工作,但是從時間到時間,它都不起作用。 SharedPreferences實例具有正確的值,但該文件不正確。而且事件發生的頻率較低,但它發生時,首選項xml文件完全消失。
我的首選項文件只有兩個值:serviceStarted
布爾值和一個包含通知文本的短字符串。
肘的點擊監聽器:
public void onClick(View v)
{
ToggleButton toggle = (ToggleButton) v;
boolean mustStartService = toggle.isChecked();
if(mustStartService)
{
Intent serviceIntent = new Intent(MainActivity.this, MainService.class);
startService(serviceIntent);
}
else
{
Intent serviceIntent = new Intent(MainActivity.this, MainService.class);
stopService(serviceIntent);
}
// Save to SharedPreferences
SharedPreferences settings = getSharedPreferences("prefs", Context.MODE_MULTI_PROCESS);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("serviceStarted", mustStartService);
editor.commit();
}
注:
服務放在另一個進程,這樣系統就可以從活動relese資源一旦消失,從而用較少的資源保持服務/通知。因此,我使用國旗
MODE_MULTI_PROCESS
。commit()
調用返回true
,即使寫入看起來不正確或文件被刪除。我在logcat中從SharedPreferencesImpl
沒有任何錯誤。唯一的其他寫入首選項的地方是來自活動中的偵聽器(當TextView發生更改時),但是當發生錯誤時我從不調用此代碼,所以不應該存在寫衝突。該服務從不寫入首選項。
兩個對象的定義是這樣的清單:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service
android:name=".MainService"
android:process=":mainService"
android:exported="false">
</service>
任何幫助將apreciated。我知道我可以使用另一種方式來存儲偏好設置,建議here,但我想知道我是不是錯過了一些東西。
首先,如果這有助於嘗試http://stackoverflow.com/questions/10186215/sharedpreferences-value-is-not-updated – AndyFaizan
不,它不會改變 – biskitt
如果你寫一個pref _with null key_,首選項將是目前正在重新加載清除。看看那 –