Android:finish()方法会不会总是调用onDestroy()方法?

27

一个简单的问题:你能确定 finish() 会调用 onDestroy() 吗?我没有找到任何证实这一点的信息。


https://dev59.com/fGgv5IYBdhLWcg3wF9BP - BackSlash
2
并非总是如文档所述 - Blackbelt
@blackbelt,你能参考一下那份具体的文档吗? - Xander
2个回答

50
简单的问题:你能确定finish()方法会调用onDestroy()方法吗?
首先,本回答假设你是在谈论Android的Activity类及其finish()方法和onDestroy()生命周期方法。
其次,这取决于你对“确定”的定义:
1. 在finish()和onDestroy()之间,您的进程可能会由于与触发finish()调用无关的原因而终止。 2. 设备制造商或ROM修改者可能会引入一些混乱的更改,破坏finish()和onDestroy()之间的连接。 3. 电池可能在finish()和onDestroy()之间耗尽。 4. 等等。
第三,finish() 不会调用 onDestroy()。你可以通过阅读 源代码 来确认这一点。通常情况下,finish() 会触发对 onDestroy() 的调用。
总的来说,finish() 最终会导致 onDestroy() 被调用。

在一个进程中,我能依赖于onDestroy()方法吗?比如说,我有A、B、C、D、E五个活动,并且想要结束除了E之外的所有活动,那么所有的onDestroy()方法都会被调用吗?这里不考虑电池和内存状态。 - Jenix
4
如果进程没有被终止,且你不触发崩溃(未处理的异常),完成一个活动将会调用该活动的onDestroy()方法。 - CommonsWare
太快了哈哈。谢谢! - Jenix
1
@androiddeveloper:finish()不是final,因此它可以被覆盖,而且覆盖实现在某些情况下可能选择不链接到超类,原因可能很奇怪。而且,在finish()onDestroy()之间发生崩溃至少在理论上是可能的,尽管我不知道任何这样的情况。 - CommonsWare
1
@CommonsWare 没关系,我想我明白了。我找到了一个非常老的代码,由于某种原因,在后台线程上对当前 Activity 进行了“同步”,同时在 UI 线程上调用了“setResult”(也会在当前 Activity 上进行同步)。因此它引起了奇怪的问题(可能是 ANR 或死锁,或类似的东西)。 - android developer
显示剩余2条评论

6

不能确定!

调用finish()通常会触发Activity生命周期中的onDestroy()方法,但您不能依赖它。特别是不能用它来保存数据。 文档明确说明。

do not count on this method being called as a place for saving data! 

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