仅在进程生命周期内注册 BroadcastReceiver

Register BroadcastReceiver only during process lifecycle

我遇到过这个设计问题。我有一个显示 mp3 列表的应用程序,用户可以在线播放或下载到本地播放。现在我想在列表视图行布局中添加一个绿色勾号,以防文件已下载。为此,在模型 class 中我添加了一个名为 isDownloaded() 的字段,当加载程序 class 从 xml 文件加载 mp3 列表时初始化该字段,然后检查如果它们存在于文件系统中并相应地设置 isDownloaded() 值。数据在应用程序进程启动时下载一次,并在配置更改期间保留它而不重新加载它。现在问题来了:我使用系统下载管理器下载文件,系统下载管理器在文件下载完成时触发一个意图。为了更新列表视图,我在 onStart() 期间注册了一个 BroadcastReceiver,并在 onStop() 期间注销了它,因此如果下载完成而用户 activity 位于前台,则会更新列表视图。但是如果activity在后台,进程还没有被销毁呢?下载完成的意图丢失,当用户返回 activity 时,UI 不会更新,因为模型尚未更新。很明显我需要别的东西,所以当用户不与 activity 交互时,模型会更新,当用户返回时 activity 将在 onStart() 期间重新绘制列表视图。在清单中注册 BroadcastReceiver 似乎不是一个解决方案,因为如果下载完成时进程已经终止,则不需要再次启动进程并更新模型(显然甚至不会加载)。我将不胜感激任何设计想法或建议,非常感谢。

简单地将 register/unregister 移动到 onCreate 和 onDestroy 行不通吗?

或者,如果是我,我会保留某种元文件或数据库来跟踪 mp3 是否已被下载。这种在清单中注册的方式是可行的,因为列表将根据元数据进行更新,而元数据又可以独立于 activity 生命周期进行更新。

答案是在 class 期间使用应用程序上下文在应用程序 class 中注册 BroadcastReceiver。这样,只要应用进程处于活动状态,BroadcastReceiver 就会处于活动状态。