我有一个侦听广播的活动,即使我的活动在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-the和is-ondestroy-not-always-called中,声明不使用ondestroy()
编辑 - 我的用例是当我通过FCM收到推送通知时,我希望向我的活动发送广播,然后新元素将添加到我的列表中。
答案 0 :(得分:1)
onStart()
和onStop()
之间显示应用程序时注册/收听以更新gui onCreate()
和onDestroy()
我认为你有充分理由需要(4)。
如您所述,有些情况下onStop()
或onDestroy()
未被调用
SDK Activity.html#onDestroy()告诉
在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程。
你正在寻找生命周期中的一个地方,保证被召唤以取消注册听众,但恐怕没有。
我认为"kill the activity's hosting"
是