开发者

Inform Activity from a BroadcastReceiver ONLY if it is in the foreground

开发者 https://www.devze.com 2022-12-20 16:46 出处:网络
Maybe it\'s easy, but I couldn\'t really figure this out right so far... I got a BroadcastReceiver waiting to get triggered by the AlarmMangager - this works fine.

Maybe it's easy, but I couldn't really figure this out right so far... I got a BroadcastReceiver waiting to get triggered by the AlarmMangager - this works fine.

Now: because the event, if it occurs, needs to refresh some elements on screen of the main Activity, I would like to send an Intent from that background BroadcastReceiver to my Activity - but only if it is currently in the foreground, aka active.

If it is not running or not visible, I don't care - and the last thing I want to do is start the Activity by my intent! I handle repainting of the views in my onResume() method, so I don't care at all.

Any hints on how to do that? Thanks!

EDIT开发者_StackOverflow社区: my BroadcastReceiver is waiting for alarms that must be notified to the user. So, it must be there and declared in the manifest. The problem is: it will have to decide whether the mentioned Activity is currently up in front or not.


I believe that you're familiar with AlarmManager now (creating a new Alarm, register a receiver...) so I will not talk about that. Just give you a solution for your question.

Instead of registering a BroadcastReceiver in a class file and in manifest, you only create a new BroadcastReceiver in your activity, and then, register it in onResume method, and unregister it in onPause method, sth like this in your 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();
}

The receiver will only receive the alarm intent when your activity is in foreground :)

(Sorry if my English is not clear)


So this is almost Bino's answer, but: instead of moving the receiver into the activity, use two receivers, with different Intents. The first one is your original alarm Intent, with a receiver registered in the manifest as you already have, and then that receiver sends a second broadcast intent, which is handled by a receiver registered by the activity as Bino says.

I've done this in my own timer project, on github. Here are the alarm receiver and the requery receiver. Hope that helps.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号