仅当BroadcastReceiver位于前台时才通知它

也许这很容易,但到目前为止我还无法解决这个问题……我有一个BroadcastReceiver等待被AlarmMangager触发 – 这很好用。

现在:因为事件,如果它发生,需要刷新主Activity的屏幕上的一些元素,我想从该背景BroadcastReceiver向我的Activity发送一个Intent – 但前提是它当前在前台,也就是活动的。

如果它没有运行或不可见,我不在乎 – 我想做的最后一件事是按照我的意图开始活动! 我在onResume()方法中处理重新绘制视图,所以我根本不关心。

关于如何做到这一点的任何提示? 谢谢!

编辑:我的BroadcastReceiver正在等待必须通知用户的警报。 所以,它必须在那里并在清单中声明。 问题是:它必须决定所提到的活动目前是否在前面。

所以这几乎是Bino的答案,但是:不要将接收器移动到活动中,而是使用两个具有不同意图的接收器。 第一个是你的原始警报Intent,你已经拥有一个在清单中注册的接收器,然后该接收器发送第二个广播意图,由Bino所说的活动注册的接收者处理。

我在我自己的计时器项目中,在github上完成了这个。 这是警报接收器和重新查询接收器 。 希望有所帮助。

我相信你现在熟悉AlarmManager(创建一个新的Alarm,注册一个接收器……)所以我不会谈论这个。 只需为您的问题提供解决方案。

您只需在活动中创建一个新的BroadcastReceiver,然后在onResume方法中注册它,并在onPause方法中注销它,而不是在类文件和清单中注册BroadcastReceiver,就像在您的活动中一样:

 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //do something } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mIntentFilter = new IntentFilter(); mIntentFilter.addAction("your alarm action"); ... } @Override protected void onResume() { registerReceiver(mIntentReceiver, mIntentFilter); ... super.onResume(); } @Override protected void onPause() { unregisterReceiver(mIntentReceiver); ... super.onPause(); } 

当您的活动处于前台时,接收器将仅接收警报意图:)

(对不起,如果我的英语不清楚)