1

我正在使用SharedPreferences來存儲我的數據。當我的應用程序正在運行時,數據已成功保存到SharedPreferences,但是當我關閉我的應用程序並嘗試通過Intent Service保存數據時,什麼也沒有發生。沒有保存到該數據:在應用程序未運行時將數據保存在SharedPreferences中

public class TinyDB { 

private SharedPreferences preferences; 
private String DEFAULT_APP_IMAGEDATA_DIRECTORY; 
private String lastImagePath = ""; 

public TinyDB(Context appContext) { 
    preferences = PreferenceManager.getDefaultSharedPreferences(appContext); 
} 


public void putString(String key, String value) { 
     checkForNullKey(key); checkForNullValue(value); 
     preferences.edit().putString(key, value).apply(); 
    } 
} 

我使用它的對象onMessageReceive()

public void onMessageReceived(RemoteMessage remoteMessage) { 
    tinyDb.putString("key","value"); 
} 

主要的一點,我要確保我要保存的值時,應用程序沒有運行。當應用程序運行時,一切都很好。

我也想知道什麼類或活動是最好的初始化TinyDB的對象,我應該使它靜態或不?

+0

您的意思是您正在嘗試在應用程序關閉時將密鑰保存到sharedPrefs。如果這是真的,那麼在調用putString方法時,需要確保tinyDB的資源仍然存在(由於原始上下文丟失,優選實例可能不起作用)。 –

+0

是的,我知道,那就是我想知道的問題的答案 –

+0

你究竟在'SharedPreferences'上調用'apply()'或'commit()'在哪裏? – Darwind

回答

0

您可以使用您的服務的上下文(假設IntentService在與原始活動相同的進程上運行)在您的IntentService類中實例化TinyDB的新實例。請注意,執行完所有邏輯之後,IntentService將被全部資源銷燬,因此新的TinyDB也將被銷燬。

0

嘗試

public void onMessageReceived(RemoteMessage remoteMessage) { 


    // shortcut and valid local variable 
    Context ctx = getApplicationContext() 
    // get instance of shared preferences using service/receiver context! 
    SharedPreferences sp = ctx.getSharedPreferences(preferencesFileName,Context.MODE_PRIVATE); 
    // save pref value 
    sp.edit().put(...).commit(); 


} 

* preferenceFileName - 如果默認是your_packageName + _preferences

PS一些事情要考慮:

更多的提示外喜好:

  • 不存儲上下文類對象 - 因爲他們是,應該保持短暫的生活 - 而不是使用弱參考

    // create if you want to hold context reference 
        WeakReference<Context> wctx = new WeakReference<Context>(context) 
        // then get when you want to use context 
        Context ctx = wctx.get(); 
    
        if(ctx!=null) // context still alive we can use it 
    
+0

你的答案沒有工作 –

相關問題