应用程序未运行时,在SharedPreferences中保存数据

时间:2016-07-31 19:20:24

标签: android android-intentservice android-sharedpreferences

我正在使用SharedPreferences来存储我的数据。当我的应用程序运行时,数据已成功保存到SharedPreferences,但当我关闭我的应用程序并尝试通过Intent Service保存数据时,没有任何反应。没有数据保存到它:

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");
}

我想确保我想在app未运行时保存价值的要点。当应用程序运行时,一切都很好。

我也想知道什么类或Activity最适合初始化TinyDB的对象,我应该将它设为静态?

2 个答案:

答案 0 :(得分:0)

您可以使用服务的上下文在IntentService类中实例化TinyDB的新实例(假设IntentService在与原始Activity相同的进程上运行)。请注意,在执行其所有逻辑之后,IntentService会被其所有资源销毁,因此新的TinyDB也将被销毁。

答案 1 :(得分: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需要考虑的一些事情:

更多提示:

  • 不存储Context类对象 - 因为它们应该保持短暂状态 - 而不是使用WeakReference

        // 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