Android 在onDestroy()和onSaveInstanceState()上注销广播接收器

Android 在onDestroy()和onSaveInstanceState()上注销广播接收器,android,android-intent,broadcastreceiver,Android,Android Intent,Broadcastreceiver,我的android应用程序中有一个流程,可以打开一系列用户档案活动,一个活动一个活动 示例:打开用户配置文件A,其中包含其他用户配置文件的列表。单击此列表中的项目将打开用户配置文件B。再次,它将列出用户配置文件A可能属于的其他用户配置文件。因此,单击此项目将打开用户配置文件A的另一个活动。 应用程序用户可以对用户配置文件A的当前活动执行操作,该操作需要反映在后台堆栈中的所有其他用户配置文件A活动上。因此,我所做的是在用户配置文件活动中注册一个接收者,该接收者根据来自广播的活动用户id检查活动用户

我的android应用程序中有一个流程,可以打开一系列用户档案活动,一个活动一个活动

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

问题是,我无法在onPause()或onStop()上取消接收器的迁移(根据这里的许多线程建议),因为这与我试图在这里构建的内容有点相反。并且根据onDestroy()的定义,不保证每次活动终止时都调用它

因此,我在这里基本上要问的是——在onCreate()上注册所有活动接收器,然后在onDestroy()和onSaveInstanceState()上注销它们,这是一种好的做法吗?
,这样我就可以100%确定它们在活动销毁时被清除了

我在文档中看到的唯一一个建议是不要在onSaveInstanceState()中注销接收者的地方就是这里——它只说

不要在Activity.onSaveInstanceState()中注销,因为如果用户在历史堆栈中向后移动,则不会调用此函数

编辑: 好的,我刚刚在下面的文章中看到了这句话:

在某些情况下,系统会简单地终止活动的宿主进程,而不在其中调用此方法(或任何其他方法),因此不应使用此方法来执行在进程结束后仍保留的操作

因此onSaveInstanceState()也不会被调用。

但接受者不符合“在过程结束后不打算留在身边”的条件吗?我不明白为什么在这种情况下不调用onDestroy()。释放到那里的其他资源(不仅仅是接收器)会发生什么情况?

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

当系统终止活动以释放内存时,是否也会调用onSaveInstanceState?可能不会,但可能会触发onLowMemory()