Search code examples
androidbroadcastreceiver

Boot completed Broadcast receiver is not working for dynamic registration


I created a broadcast receiver and registered in in manifest using following approach it is working fine

static way registering broadcast receiver (working fine)

<receiver
        android:name="DeviceRestartListener"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            </category> -->
        </intent-filter>
    </receiver>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

But when i tried to register the broadcast receiver programmatic (instead of static way) using following way it doesnt work Programmetic registering (not working)

DeviceRestartListener dataBroadcastReceiver = new DeviceRestartListener();
            IntentFilter filter = new IntentFilter();
            filter.addAction(
                    "android.intent.action.BOOT_COMPLETED")
//registerReceiver(dataBroadcastReceiver, filter); //DOESNT WORK
registerReceiver(dataBroadcastReceiver, filter, "android.permission.RECEIVE_BOOT_COMPLETED", null); //DOESNT WORK

No compilation and run time error. But the receiver is not receiving broadcast after device restarts

Thanks


Solution

  • Register receiver in code

    When we register a receiver in code, we must unregister it when the app gets destroy (actually, when the Activity or Service that register it, gets destroy).

    Register receiver in manifest

    When we declare it in the manifest, you make it available even if you app is not running.

    When to use which method to register

    Which method to use for registering your BroadcastReceiver depends on what your app does with the system event. I think there are basically two reasons why your app wants to know about system-wide events:

    1. Your app offers some kind of service around these events

    2. Your app wants to react graciously to state changes

    Examples for the first category are apps that need to work as soon as the device is booted or that must start some kind of work whenever an app is installed. Battery Widget Pro or App2SD are good examples for these kinds of apps. For this type you must register the BroadcastReceiver in the Manifest file.

    Examples for the second category are events that signal a change to circumstances your app might rely on. Say your app depends on an established Bluetooth connection. You have to react to a state change – but only when your app is active. In this case there is no need for a statically registered broadcast receiver. A dynamically registered one would be more reasonable.

    There are also a few events that you are not even allowed to statically register for. An example for this is the Intent.ACTION_TIME_TICK event which is broadcast every minute. Which is a wise decision because a static receiver would unnecessarily drain the battery.