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

Zor*_*did 23 android broadcastreceiver

也许这很容易,但到目前为止,我BroadcastReceiver还是无法解决这个问题......我等待被AlarmMangager触发 - 这很好用.

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

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

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

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

Bin*_*ran 43

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

您只需在活动中创建一个新的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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗨比诺!谢谢你的回复 - 我明白了,我必须更新我的问题,因为你的答案会带来一个新的问题......我需要BroadcastReceiver**总是**在那里,不仅仅是活动正在运行并且在前台!这是一个警报 - 正是它会告诉用户他想要捕获的公共汽车.现在:无论Activity正在做什么,都必须通知警报.但是:当且仅当它处于活动状态且在前台时,我需要更新一个复选框,表明此特定警报不再设置!:-( (2认同)

Chr*_*yle 38

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

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