取消注册localbroadcast接收器以便即使在活动处于后台/前台时也能收听

时间:2017-08-22 13:35:41

标签: android broadcastreceiver android-lifecycle

我有一个侦听广播的活动,即使我的活动在broadcasts或处于foreground/background状态,我也希望抓住onpaused。现在我考虑在onstop()方法中取消注册我的接收器但是这里有一个问题,假设我的用户现在按下了主页按钮,因为我的onstop被调用,因为我的注册将被取消注册到期现在我的活动无法收听广播,直到用户导航回我的应用程序。现在为了解决这个问题,我考虑在ondestroy方法中取消注册我的监听器,但仍然存在Android docs中所述的问题,我们不应该在ondestroy中执行任何操作,因为有没有保证每次都会被调用。现在要解决这个问题,我想到了使用我的活动的onbackpressed()按钮,因为即使用户点击主页按钮,我的接收器也会保留在那里,当用户点击后退按钮时,这意味着活动正在进行被销毁,所以我可以在这里简单地unregister我的接收器。

现在我有两个疑问

第一个 - 当用户点击主页按钮并从最近的应用程序中刷我的应用程序(杀死我的应用程序)时,我手动必须取消注册我的接收器或应用程序被杀死所以我不喜欢不必担心这种情况。

第二种情况 - 假设由于应用程序内存使用量android决定杀死我的活动/应用程序,现在当android将杀死我的活动/应用程序,因为我有我的取消注册写入onbackpressed所以我必须在我的代码中的任何地方取消注册我的接收器,否则不会有任何问题。另外我在日志中看到这样做会调用ondestroy,但正如文档中所述那样;为什么我不使用它来取消注册我的接收器。

任何人都可以告诉我,我是否涵盖了所有案例,或者仍然有一些案例,我的解决方案无效。

另外,有人可以告诉我你们有没有其他方法而不是使用onbackpressed来解决这个问题?如果是,请告诉我。

根据Android文档编辑activity-lifecycle

  

使用onStop()释放资源也很重要   可能泄漏内存,因为系统有可能杀死内存   进程托管您的活动而不调用活动的最终结果   onDestroy()回调。

同样在这些SO帖android-activity-ondestroy-is-not-always-called-and-if-called-only-part-of-theis-ondestroy-not-always-called中,声明不使用ondestroy()

编辑 - 我的用例是当我通过FCM收到推送通知时,我希望向我的活动发送广播,然后新元素将添加到我的列表中。

1 个答案:

答案 0 :(得分:1)

  1. 最干净的方法是让全球广播接收器一直收听。
  2. 本地广播接收器的最常见用途是仅在onStart()onStop()之间显示应用程序时注册/收听以更新gui
  3. 如果您需要进行更多持续处理,您还可以使用本地广播接收器提供服务。
  4. 如果你真的必须运行本地广播接收器,即使活动已经停止(=在后台)但是没有被破坏,你必须在onCreate()onDestroy()

    我认为你有充分理由需要(4)。

    如您所述,有些情况下onStop()onDestroy()未被调用

    SDK Activity.html#onDestroy()告诉

      

    在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程。

    你正在寻找生命周期中的一个地方,保证被召唤以取消注册听众,但恐怕没有。

    我认为"kill the activity's hosting"

    • 活动中有未捕获的异常或
    • android正在查杀完整的应用程序,包括出于内存原因的广播接收器。