0

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

我有一个Activity允许用户编辑列表。一旦用户提交编辑,IntentService就会启动 an ,然后调用数据库助手以根据需要更改数据库条目。

一旦数据库成功更新(在那之前没有崩溃),数据库助手将“ok”写入SharedPreferences并返回到IntentService. 向IntentServicea 发送一条消息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的列表中,直到可以重新加载列表,那根本没有问题。但是想象一下用户四处移动并以某种方式导致方向改变......这就是为什么我有“ok”的原因SharedPeferences

onCreate(),注册接收者后,我检查是否有待处理的操作:

如果数据库更新成功,我可以加载数据并为我的接收者设置一个标志以忽略下一条消息。它将来,因为 IntentService 配置了setIntentRedelivery(true).

如果我发现数据库还没有更新,我决定等待来自IntentService.

我非常不确定的一件事是:

从哪一刻起,系统会认为我的接收器“启动并运行”?我知道onReceive()只能在onCreate()完成后调用。

是否有可能onCreate()在执行时, IntentService 触发本地广播(“太快”)而我的接收器永远不会得到它?

然后该列表将永远不会刷新,直到用户离开Activity(这很可能)并再次返回(然后不太可能)。

4

1 回答 1

2

广播接收器没有在 Activity 中注册,而是在主应用程序线程中注册。registerReceiver 方法在 Context 类中定义。

这意味着您的广播接收器将一直保留registered,直到您取消注册或您的应用程序被销毁(即没有接收器在 a 中Service

检查文档

从哪一刻起,系统会认为我的接收器“启动并运行”?我知道 onReceive() 只能在 onCreate() 完成后调用。

从 registerReceiver() 返回的那一刻起

是否有可能在执行 onCreate() 时, IntentService 触发本地广播(“太快”)而我的接收器永远不会得到它?

您可以通过在扩展类的 onCreate 方法中注册接收器来避免这种情况Application。这就是您可以确保广播接收器是第一件事的方法。

于 2016-01-29T15:07:28.623 回答