如何在Android中保存/恢复全局变量,即使操作系统终止应用程序

8

在Android中,Google建议我们将全局变量保存在Application中。但是有一个问题,如果Android系统因内存不足而杀死应用程序,则应用程序将重新创建并且我保存的全局变量将丢失。

我不知道何时保存/恢复这些变量,应用程序没有提供像onsaveinstancestate()/onrestoreinstancestate()这样的方法。

我有一个想法,但我无法确定它能否正常工作。 我看到一些应用程序在操作系统将其杀掉时会进入SplashScreen,也许我们可以将这些全局变量保存在SplashAvtivity中?因为Activity具有onsaveinstancestate()/onrestoreinstancestate()方法,所以应用程序首先启动SplashActivity并且不完成它,当我们发现操作系统杀死应用程序时,我们可以再次进入SplashActivity(完成任务中其上的所有Activity),然后调用onrestoreinstancestate()。

是否有其他更好的保存/恢复全局变量的方式? 当然,我认为如果Google能够在Application中提供类似于onsaveinstancestate()/onrestoreinstancestate()的方法,那将更好。:S


1
使用共享首选项。 - Raghunandan
@Raghunandan 是的,我认为持久性是必要的。但问题在于何时保存全局变量。 - small_dream
查看Activity的生命周期并在需要时持久化值。 - Raghunandan
2个回答

8

如果一个变量需要在多次执行之间保持不变,你需要进行一些磁盘持久化。最简单的方法是使用Raghunandan建议的Shared Preferences。

要实现这个功能,首先需要请求一个Shared Preferences:

SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("key_name", "key_value");
editor.commit(); //important, otherwise it wouldn't save.

例如,在活动的onStop或onPause中可以执行此操作(始终调用onPause,但不能保证在Honeycomb之前调用onStop)。
在您的onCreate(或需要该值时),从SharedPreferences中读取并检查是否设置了值,否则使用默认值:
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
String myVariable = prefs.getString("key_name", "default_value");

现在,您可以使用myVariable的持久化值或默认值(如果之前没有保存任何内容)。
更多信息,请参见https://developer.android.com/guide/topics/data/data-storage.html#pref
要澄清一下,PREFS_NAME是您共享首选项文件的名称。通常,将应用程序的包名称作为前缀是一个好习惯。

谢谢你的回答。看起来我们只能在活动级别保存/恢复应用程序级变量。 - small_dream
1
你可以扩展应用程序并在其中执行一些操作,但是从应用程序本身无法知道它是否被终止。有一种方法可以通过使用IBinder.linkToDeath()并注册为DeathRecipient的另一个进程来了解,但这是完全不同的故事。 请参见此链接:http://www.androiddesignpatterns.com/2013/08/binders-death-recipients.html和https://developer.android.com/reference/android/os/IBinder.html - Douglas Drumond Kayama

1
根据新的指南,始终考虑在共享首选项上使用apply()而不是commit。 而commit会立即阻塞并将其数据写入持久存储,apply将在后台处理它,并不会影响您正在进行的其他工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接