Android ACTION_SHUTDOWN Broadcast not working

Scorpion picture Scorpion · Jan 3, 2013 · Viewed 23.5k times · Source

Code -

public class ShutdownReceiver extends BroadcastReceiver {
    private static final String TAG = "ShutdownReceiver";

    @Override
    public void onReceive(final Context context, final Intent intent) {
        Logger.i(TAG, "Shutting Down..........................");
        if("android.intent.action.ACTION_SHUTDOWN".equals(intent.getAction())) {
            //Power Off
        }
    }
}

Service -

private BroadcastReceiver mReceiver = null;

    @Override
    public void onCreate() {
         super.onCreate();
         // INITIALIZE RECEIVER
         //It is used to register broadcast for ShutDown or Power Off
         IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN);
         mReceiver = new ShutdownReceiver();
         registerReceiver(mReceiver, filter);
   }

   @Override
   public void onDestroy() {
       unregisterReceiver(mReceiver);
   }

Permissions -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.DEVICE_POWER" />

Answer

Brian Reinhold picture Brian Reinhold · Mar 23, 2014

I know this is old but I have a partial solution which follows the material above. At least the shutdown event is called and I am able to do that unique item on shutdown, but there is a side effect that I don't understand; a memory leak. In one sense it IS shutdown so the memory leak has no drastic effects but I don't understand it and that is a bother.

In any case I have no additions in the manifest.xml with respect to this BroadcastReceiver. It is completely defined in code.

In my main activity a define a class as above

private class ShutDownReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent)
    {
        if(Intent.ACTION_SHUTDOWN.equals(intent.getAction()))
        {
            Log.i(TAG, "System shutting down");
            context.stopService(new Intent(context, BluetoothPanService.class));
        }
    }

}

In the main activity's onResume() method I instantiate and register the receiver:

public void onResume()
{
    super.onResume();
    Log.i(TAG, "Measurement Log Activity has Resumed.");

    IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN);
    mReceiver = new ShutDownReceiver();
    registerReceiver(mReceiver, filter);
}

('mReceiver' is defined as a private class variable of the main activity)

And finally in the main activity's onPause() I unregister the receiver

public void onPause()
{
    super.onPause();
    Log.i(TAG, "Measurement Log Activity has Paused.");
    this.unregisterReceiver(mReceiver);
}

When the phone is powered off the ACTION_SHUTDOWN event is indeed signaled and the service is stopped; it's onDestroy() method is signaled and a message to a remote MQTT broker service is published indicating that the client is no longer connected. The remote broker is getting the message so I know it is working.

However, after that all hell break loose and it's mainly because I cannot stop my service from re-starting (even though I set START_NOT_STICKY in the onStartCommand method). But at this time besides getting a lot of red error lines in logcat, the ACTION_SHUTDOWN is heeded and the action I need to invoke gets done.

Hope this helps someone (who perhaps isn't dealing with shutting down a service).