繁体   English   中英

系统何时将开始考虑动态注册的BroadcastReceiver?

[英]When will dynamically registered BroadcastReceiver start being considered by system?

我的问题是关于:“邮递员何时会看到我的邮箱”,而不是“什么时候可以阅读任何信件”?

我有一个Activity ,允许用户编辑列表。 用户提交编辑后,将IntentService启动IntentService ,该服务又调用数据库助手以根据需要更改数据库条目。

一旦数据库成功更新(此后才崩溃),数据库助手将“ ok”写入SharedPreferences并返回到IntentService IntentService将消息发送到BroadcastReceiver ,这现在使该列表从db中使用当前数据重新加载。

BroadcastReceiverActivity的内部类,并且在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM