【发布时间】:2018-08-23 17:11:27
【问题描述】:
考虑以下事件序列:
-
BroadcastReceiver在Activity的onResume方法中注册(没有处理程序)。 - 通过调用
restartLoader方法作为onResume中的下一个立即语句来启动CursorLoader(restartLoader在 main 线程本身上调用)
我的观察是onLoadFinished 方法总是在第一次调用onReceive 之前被调用。也就是说,CursorLoader 优先于BroadcastReciever。此外,BroadcastReceiver 的 onReceive 方法在 onLoadFinished 方法完成之前不会被调用。
假设:
- 有一个前台服务已经在后台运行,它正在为我的
BroadcastReciever发布消息,甚至在应用程序首次启动之前AND - 考虑到
BroadcastReciever是在CursorLoader启动之前注册的,考虑到BroadcastReceiver已经有消息可用,不应该立即触发onReceive方法。
由于不是这种情况,我相信CursorLoader 在活动的主线程上启动时优先于BroadcastReceiver。但是,我似乎找不到任何文档。
如何确保我的BroadcastReceiver 优先于CursorLoader?这种行为很重要,因为我希望我的Activity 使用前台服务正在广播的一些信息进行初始化,即使应用程序正在新启动(即在ACtivity 上调用onCreate)。 CursorLoader 需要此信息来创建 Uri 以用于获取相关数据并将其显示在 UI 上。由于CursorLoader 在BroadcastReciever 之前运行,它会在没有此信息的情况下构造Uri,然后从数据库中获取陈旧的数据。
【问题讨论】:
标签: java android android-broadcastreceiver android-loadermanager android-loader