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

你的答案没有工作 –

相关问题