views:

911

answers:

3

Hi there!

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: 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.

+2  A: 

Hi Zordid,

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)

Bino
Hi Bino! Thanks for your reply - I see, I have to update my question as your answer would impose a new problem...I need the BroadcastReceiver to **always** be there, not ONLY if the Activity is running and in foreground! It's an alarm - precisely it will inform the user about a bus that he wants to catch. Now: alarms must be notified no matter what the Activity is doing. BUT: if and only if it is active and in the foreground I need to update a checkbox indicating that this specific alarm is not set any more! :-(
Zordid
+2  A: 

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.

Chris Boyle
A: 

Thanks all, I had the same problem, Chris Boyles solution worked for me!