如果不调用onStop(),我可以在哪里取消注册我的Broadcastreceiver?

时间:2017-10-03 18:33:33

标签: android broadcastreceiver android-lifecycle

我现在问这个问题Is onDestroy called only if you explicitly call finish() ?? or are there any exceptions? 我得到了

  

无法调用ondestroy()的情况。

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

  2. 如果您的流程以紧急方式终止(例如,系统需要RAM来处理来电)

  3. 如果用户点击"强制停止"在设置

  4. 中的应用程序屏幕上
  5. 在少数设备上,如果用户使用制造商提供的任务管理器终止您的流程

  6. 现在对于这些情况,onDestroy()将不会被调用,所以我想尝试onStop()

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

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

      

    如果不可能那么我猜两个onStop()和。{   onDestroy()对于这四种情况,我们不能依赖它们   取消注册我们的接收器然后在Android docs写入的原因   不使用onDestroy()即使两者同样不可靠??

    他们不应该说{/ 1}}

    解决方案根据commonsware回答

      

    在所有这三种情况下,您的进程都已消失,因此您的BroadcastReceiver也已消失。没有什么可以取消注册。

    因此,当广播接收器也消失了,所以不需要取消注册接收器,所以我认为如果我使用{{1},在所有这三种情况下都不会有任何问题。接收器both functions should not be used for releasing resources(unregistering receivers)

    只有onDestroy()我会尝试实现我自己的顶级未捕获异常处理程序,因为onDestroy()不会被调用。

1 个答案:

答案 0 :(得分:1)

  

但是对于所有上述情况,即使我将在onStop()中编写代码以取消注册接收器,那么它仍然不会被调用

对于上述三种情况,在浩大大多数情况下,将调用onStop()

  • 如果您的流程以紧急方式终止(例如,系统需要RAM来处理来电)

  • 如果用户点击"强制停止"在设置

  • 中的应用程序屏幕上
  • 在少数设备上,如果用户使用制造商提供的任务管理器终止您的流程

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

此外,在所有这三种情况下,您的流程都已消失,因此您的BroadcastReceiver也已消失。什么都没有取消注册。这是为什么不要过多担心这些情况的原因之一。 onDestroy()用于清理可能阻止您的活动被垃圾收集的内容,如果您的进程被终止,您的活动和所有其他对象都将消失。

剩下的四个场景中的一个场景是你的应用程序是否因未处理的异常而崩溃。在这种情况下,您的应用程序严重搞砸了。如果您有自己的顶级未捕获异常处理程序,则可以考虑在清理过程中终止自己的进程。