也许这很容易,但到目前为止我无法弄清楚这一点...我有一个BroadcastReceiver
等待由AlarmMangager触发 - 这样可以正常工作。
现在:因为事件,如果它发生,需要刷新主Activity的屏幕上的一些元素,我想从该背景BroadcastReceiver发送一个Intent到我的Activity - 但仅如果它目前处于前景,即活跃。
如果它没有运行或不可见,我不在乎 - 我想做的最后一件事是按照我的意图启动Activity!我在onResume()方法中处理重新绘制视图,所以我根本不关心。
有关如何做到这一点的任何提示? 谢谢!
编辑:我的BroadcastReceiver正在等待必须通知用户的警报。所以,它必须在那里并在清单中声明。问题是:它必须决定所提到的活动当前是否在前面。
答案 0 :(得分:43)
我相信你现在熟悉AlarmManager(创建一个新的闹钟,注册接收器......)所以我不会谈论这个。只需为您的问题提供解决方案。
您不是在类文件和清单中注册BroadcastReceiver,而只是在您的活动中创建一个新的BroadcastReceiver,然后在onResume方法中注册它,并在onPause方法中取消注册它,就像在您的活动中一样:< / p>
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();
}
当您的活动处于前台时,接收器将仅接收警报意图:)
(对不起,如果我的英语不清楚)
答案 1 :(得分:38)
所以这几乎是Bino的答案,但是:不要将接收器移动到活动中,而是使用两个具有不同意图的接收器。第一个是你的原始警报Intent,你已经拥有一个在清单中注册的接收器,然后该接收器发送第二个广播意图,由Bino所说的活动注册的接收者处理。
我在我自己的计时器项目中,在github上完成了这个。以下是alarm receiver和requery receiver。希望有所帮助。