![](/img/trans.png)
[英]BroadcastReceiver onReceive() not Called when registered dynamically
[英]When will dynamically registered BroadcastReceiver start being considered by system?
我的问题是关于:“邮递员何时会看到我的邮箱”,而不是“什么时候可以阅读任何信件”?
我有一个Activity
,允许用户编辑列表。 用户提交编辑后,将IntentService
启动IntentService
,该服务又调用数据库助手以根据需要更改数据库条目。
一旦数据库成功更新(此后才崩溃),数据库助手将“ ok”写入SharedPreferences
并返回到IntentService
。 IntentService
将消息发送到BroadcastReceiver
,这现在使该列表从db中使用当前数据重新加载。
BroadcastReceiver
是Activity
的内部类,并且在onCreate()
动态注册:
mReceiver = new MyMessageReceiver();
IntentFilter iFilter = new IntentFilter();
iFilter.addAction("com.example.mycoolapp.LOCALINTENT");
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, iFilter);
如果用户一直停留在“我的Activity
直到可以重新加载列表,那么就不会有任何问题。 但是,想象一下用户到处走动并以某种方式导致方向改变...这就是为什么我在SharedPeferences
“确定”的SharedPeferences
:
在onCreate()
,注册接收者之后,我检查是否有待处理的操作:
如果数据库更新成功,我可以加载数据,并为接收者设置一个标志以忽略下一条消息。 即将出现,因为IntentService是使用setIntentRedelivery(true)
配置的。
如果发现数据库尚未更新,则决定等待IntentService
的广播。
我非常不确定的一件事是:
从哪一刻起,系统将认为我的接收器“已启动并正在运行”? 我知道onReceive()
只能在onCreate()
完成后才能调用。
是否有可能在执行onCreate()
,IntentService触发本地广播(“太早”),而我的接收器将永远无法获得它?
然后,直到用户离开“ Activity
(很有可能)并再次返回(然后不太可能)之前,该列表才不会刷新。
广播接收器未在活动中注册,而是在主应用程序线程中注册。 registerReceiver方法在Context类中定义。
这意味着您的广播接收器将一直保持registered
状态,直到您取消注册它或您的应用程序被破坏(即Service
没有接收器)为止
检查文件
从哪一刻起,系统将认为我的接收器“已启动并正在运行”? 我知道onReceive()只能在onCreate()完成后才能调用。
从registerReceiver()返回的那一刻起
是否有可能在执行onCreate()时,IntentService触发本地广播(“太早”),而我的接收器将永远无法获得它?
您可以通过在扩展 Application
的类的onCreate方法中注册接收方来避免这种情况。 这样可以确保广播接收器是第一件事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.