终止Android服务和静态变量

7
使用 Android 2.1+。我有一个服务,由于内存压力等原因,会不时被操作系统终止。

该服务使用类的静态成员字段维护某些状态。我期望静态字段保持其值,尽管服务被操作系统杀死并重新启动。

但似乎并不是这样。在重新启动后,静态变量重置为默认值。这是期望发生的吗?应该使用其他方法来保持持久状态以免被终止/重新启动吗?

1个回答

8

是的,当您的服务被终止时就会发生这种情况。程序被从内存中清除,再次加载到内存时,所有静态变量的默认值都会被假定。换句话说,程序的字节码在每次执行时都不会改变。

通常认为使用静态变量来保持状态是不好的。尝试将它们存储在持久性存储介质中,比如sqlite数据库。


1
我还要指出的是,由于静态字段被重置,这意味着操作系统会杀死整个应用程序Java进程。是的,这种情况偶尔会发生,请查看此帖子 - https://dev59.com/yHRB5IYBdhLWcg3wJUau#4642069 - Vit Khudenko
1
Android真的没有提供除了每次写入flash之外保持持久状态的方法吗?(例如,onDestroy不能保证被调用!?)我的服务频繁更改状态,如果每次状态更改都必须触碰flash,这将增加电池使用量并加快flash的磨损! - Michael
@Michael 从onDestroy方法的文档中可以看到: 注意:不要指望这个方法作为保存数据的地方!例如,如果一个活动正在编辑内容提供程序中的数据,则应该在onPause()或onSaveInstanceState(Bundle)中提交这些编辑,而不是在这里。 - Kurtis Nusbaum
@KurtisNusbaum,Service中onDestroy的文档没有提到这样的限制(尽管显然它仍然存在),Service也没有onPause或onSaveInstanceState。 - Michael
糟糕,我的错。我已经很久没有看过这篇帖子了,我只是假定我们在谈论活动。 - Kurtis Nusbaum

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