8

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

我不知道何时保存/恢复这些变量,应用程序没有给我们一些方法,例如 onsaveinstancestate()/onrestoreinstancestate()。

我有一个想法,但我不能确保它可以正常工作。我看到一些应用程序在 os 杀死它时会转到 slashScreen,也许我们可以将这些全局变量保存在 SplashAvtivity 中?因为Activity有onsaveinstancestate()/onrestoreinstancestate()方法,app先启动splashActivity并没有完成,当我们发现os kill app时,我们可以再去SplashActivity(finish all activity on it in task)然后onrestoreinstancestate ()。

还有其他保存/恢复全局变量的好方法吗?当然,我觉得如果google能在application中给我们提供onsaveinstancestate()/onrestoreinstancestate()这样的方法就更好了。:S

4

2 回答 2

8

如果变量必须在执行之间保持不变,则必须进行一些磁盘持久性。正如 Raghunandan 所建议的,最简单的方法是使用共享首选项。

为此,首先请求共享首选项:

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是您的共享首选项文件的名称。通常,为您的应用程序添加包名称,这是一种很好的做法。

于 2013-11-05T06:37:34.640 回答
1

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

于 2018-01-29T14:15:39.093 回答