Broadcastreceiver and Paused activity
Asked Answered
A

3

16

I have a broadcast receiver registered programatically in a activity. It responds to the PACKAGE_REMOVED intent, that fires when a package gets removed.

The problem is, it doesn't get this message. I think this is due to that the intent is fired when I leave the activity and move to another activity to uninstall a app, so the original activity is paused. Could it be that a paused activity (where the receiver is not unregistered in onPause) also pauses the receiver?

Attlee answered 25/10, 2011 at 13:55 Comment(0)
F
38

When you register a broadcast receiver programatically in an activity, it will NOT get broadcasts when the activity is paused. The BroadcastReceiver docs are not as clear as they could be on this point. They recommend unregistering on onPause solely to reduce system overhead.

If you want to receive events even when your activity is not in the foreground, register the receiver in your manifest using the receiver element.

Food answered 10/11, 2011 at 16:56 Comment(3)
Will this registered receiver if registered in manifest residing inside a activity that is currently paused, be able to acces the private variables of its enclosing activity?Attlee
Never mind, I now see that a Receiver class is not a interface, but a class you need to inherit from.Attlee
Down voted. I create local broadcast receivers all the time and they get called EVEN when the activity is paused. The resume is not even called. Not sure where you got this false information but it is clearly wrong.Embryotomy
N
5

Add a Receiver to your project and you will get this event without even starting your application.

public class TestReciver extends BroadcastReceiver  {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TestReciver",intent.getAction()+"\n"
                +intent.getDataString()+"\n"
                +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n"
                +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n"
                +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)
            );
    }

}

and in your manifest add it like this (Inside your <application> tag):

<receiver android:name="TestReciver" >
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

When you use a receiver like this you do not call any register or unregister so it will always be ready to get data.

A note is that this will not work if you let the users move your app to the SD card. If an event is sent when the SD card is unmounted the receiver will not be accessible and you will miss the event.

No answered 11/11, 2011 at 21:55 Comment(0)
B
2

Maybe you can register the receiver in service which will run background

Broadleaf answered 11/11, 2011 at 3:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.