23

也许这很容易,但到目前为止我还不能真正弄清楚......我BroadcastReceiver等待被 AlarmMangager 触发 - 这很好用。

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

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

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

编辑:我的 BroadcastReceiver 正在等待必须通知用户的警报。因此,它必须存在并在清单中声明。问题是:它必须决定所提到的 Activity 当前是否在前面。

4

2 回答 2

44

相信大家现在对AlarmManager 已经很熟悉了(新建一个Alarm,注册一个receiver……)所以我就不多说了。只需为您的问题提供解决方案。

无需在类文件和清单中注册 BroadcastReceiver,您只需在 Activity 中创建一个新的 BroadcastReceiver,然后在 onResume 方法中注册它,并在 onPause 方法中取消注册,就像在您的 Activity 中这样:

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

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

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

于 2010-02-17T17:13:27.237 回答
38

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

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

于 2010-03-19T20:36:56.363 回答