在onDestroy()和onSaveInstanceState()上取消注册广播接收器

时间:2013-12-08 12:49:09

标签: android android-intent broadcastreceiver

我的Android应用程序中有一个流程,可以打开一系列用户个人资料活动,一个活动来自另一个。

示例:打开用户配置文件A,其中包含其他用户配置文件的列表。单击此列表中的项目将打开用户配置文件B.再次,它会列出其他用户配置文件,其中用户配置文件A可能是的一部分。因此,单击此项将打开用户配置文件A的另一个活动 应用程序用户可以对用户配置文件A的当前活动执行操作,该操作需要反映在后台堆栈中的所有其他用户配置文件A活动上。所以我所做的是在用户个人资料活动中注册了一个接收者,该活动用户身份检查来自广播的活动用户ID,并在用户界面上执行相关操作。

问题是,我不能在onPause()或onStop()上取消接收器(根据这里的很多线程建议),因为这对我试图在这里构建的东西起反作用。并且根据documentation onDestroy(),每次活动终止时都不会被调用。

那么我基本上要问的是 - 在onCreate()上注册所有活动接收器并在onDestroy()和onSaveInstanceState()上注销这是一个好习惯,所以我将是100%确定他们在活动破坏时得到了清理吗?

我在文档中看到的唯一提及不在onSaveInstanceState()中取消注册接收器的问题就在这里 - BroadcastReceiver - 它只是说

  

不要在Activity.onSaveInstanceState()中取消注册,因为如果用户在历史堆栈中向后移动,则不会调用此方法

编辑: 好的,我刚刚在onDestroy() spec

中看到了这句话
  

在某些情况下,系统会在不调用此方法(或任何其他)的情况下简单地终止活动的托管过程,因此不应将其用于执行旨在保留的内容过程消失后。

因此也不会调用onSaveInstanceState() 但是没有接受者认为这些东西不是“在过程消失后仍然留在身边”的东西吗?我不明白为什么在这种情况下不会调用onDestroy()。那里发布的其他资源(不只是接收者)会发生什么?

1 个答案:

答案 0 :(得分:0)

在您的情况下,使用广播接收器来检测正在运行的Activity实例不是一个好主意。您应该为每个Activity使用单个实例。另一种解决方案是您可以在一个Activity而不是Activity堆栈中创建视图堆栈。切换视图比切换活动更容易。至于如何使用onDestroy和onSaveInstanceState(),它取决于你的场景。如果您完成了Activity,则会调用onDestroy。如果您的Activity在某些情况下被系统破坏,例如屏幕旋转,则会触发onSaveInstanceState。