如果 onStop() 不会被调用,我在哪里可以注销我的 Broadcastreceiver?

Where can i unregister my Broadcastreceiver if onStop() will not get called?

我问了这个问题onDestroy 只有在显式调用 finish() 时才会调用吗??或者有什么例外吗? 现在回答我明白了

where are the cases where ondestroy() not get called up.

  1. 如果您因未处理的异常而崩溃

  2. 如果您的进程以紧急方式终止(例如,系统需要 RAM 来处理传入的 phone 调用)

  3. 如果用户在“设置”中点击您应用屏幕上的"Force Stop"

  4. 在一些设备上,如果用户使用制造商提供的任务管理器终止您的进程

现在至于这些情况,因为 onDestroy() 不会被调用所以我想尝试 onStop()

但是对于上述所有情况,即使我将 onStop() 中的代码写入 unregister 接收器,它仍然不会被调用,因为我的接收器将保持注册状态。

所以现在我的问题是,当上述四种情况中的任何一种发生时,我在哪里可以编写我的代码来注销接收器。

Also if it is not possible then i guess as for both onStop() and onDestroy() for these four cases we cannot rely on them to unregister our receiver then why in Android docs it is written to not use onDestroy() even both are equally unreliable ??

他们不应该说 both functions should not be used for releasing resources(unregistering receivers).

解决方案-根据commonsware回答

In all three of these cases, your process is gone, and therefore your BroadcastReceiver is also gone. There is nothing to unregister.

因为broadcastreceiver也没有了,所以不需要取消注册receiver,所以我认为如果我使用onDestroy()在这三种情况下都不会有任何问题unregister 接收者。

仅针对 1 Case 我将尝试实现我自己的顶级未捕获异常处理程序,因为不会为此调用 onDestroy()。

But as for all above cases even if i will write code in onStop() to unregister the receiver then still it will not get called

对于以上三种情况,在绝大多数大多数情况下,onStop()将被称为:

  • 如果您的进程以紧急方式终止(例如,系统需要 RAM 来处理传入的 phone 调用)

  • 如果用户在“设置”中点击您应用屏幕上的"Force Stop"

  • 在一些设备上,如果用户使用制造商提供的任务管理器终止您的进程

Android 不会终止从 UI 的角度来看在前台的进程。在所有这些情况下,绝大多数情况下,您的应用不会在前台运行,因此 onStop() 将被调用。

此外,在所有这三种情况下,您的进程都消失了,因此您的 BroadcastReceiver 也消失了。没有什么可以注销的。这就是为什么人们往往不太担心这些情况的原因之一。 onDestroy() 用于清理可能阻止您的 activity 被垃圾收集的东西,如果您的进程终止,您的 activity 和所有其他对象都将消失。

剩下的四种情况中的一种情况是您的应用程序因未处理的异常而崩溃。在那种情况下,您的应用程序会严重混乱。如果您有自己的顶级未捕获异常处理程序,您可以考虑终止自己的进程作为清理的一部分。