只有在前台通知来自BroadcastReceiver的活动

也许这很容易,但是目前为止我还没有真正弄清楚这个问题……我有一个BroadcastReceiver等待AlarmMangager触发 – 这个工作正常。

现在:因为这个事件,如果发生,需要刷新主Activity的屏幕上的一些元素,我想从该背景的BroadcastReceiver发送一个Intent到我的Activity – 但是只有当前处于前景中,也就是活跃的。

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

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

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

Solutions Collecting From Web of "只有在前台通知来自BroadcastReceiver的活动"

所以这几乎是比诺的答案,但是:不是将接收器移动到活动中,而是使用具有不同意图的两个接收器。 第一个是你的原始警报Intent,如果你已经有一个接收者登记在清单上,那么这个接收者发送第二个广播意图,这个意向由Bino说的那个活动注册的接收者处理。

我已经在github上的自己的计时器项目中做了这个。 这里是报警接收器和询问接收器 。 希望有所帮助。

我相信你现在熟悉AlarmManager(创build一个新的闹钟,注册一个接收器…),所以我不会谈论这个。 只要给你一个解决你的问题。

而不是在类文件和清单中注册BroadcastReceiver,而只是在您的活动中创build一个新的BroadcastReceiver,然后将其注册到onResume方法中,并在onPause方法中取消注册它,如下所示:

 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(); } 

当您的活动在前台时,接收器只会收到警报意图:)

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