Reasons that the passed Intent would be NULL in onStartCommand

AndroidAndroid IntentAndroid Service

Android Problem Overview


Is there any other reason that the Intent that is passed to onStartCommand(Intent, int, int) would be NULL besides the system restarting the service via a flag such as START_STICKY?

Also, when the service is restarted by the system the Intent.getAction() method returns NULL... sometimes. Intent is not NULL just getAction()

I asked here too but haven't received an answer just yet.

UPDATE: After chatting with Mark Murphy, he suggested that I return START_REDELIVER_INTENT in the onStartCommand() callback in my service instead of START_STICKY so that the entire intent is sent following a restart.

I didn't do this initially because I was concerned that if the service was attempting to do something, then in the middle of that something the service was restarted... will it recognize that it started doing that something? I guess that is logic I will need to be responsible for :)

Android Solutions


Solution 1 - Android

I'm surprised there's no discussion of the incoming flags. I'm going to monitor this in the logs with the following:

if (null == intent || null == intent.getAction ()) {
		String source = null == intent ? "intent" : "action";
		Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
		return START_STICKY;
}

Update: Flags were 0 so there was nothing actionable there. I've left the null check in there with no loss of function.

Edit: Ok, I found it in the documentation of START_STICKY of all places! "if there are not any pending start commands to be delivered to the service, it will be called with a null intent object, so you must take care to check for this."

http://developer.android.com/reference/android/app/Service.html

Solution 2 - Android

Return START_REDELIVER_INTENT in your callback:

    public int onStartCommand(Intent intent, int flags, int startId) {

        // your service code here

        return android.app.Service.START_REDELIVER_INTENT; // make sure restart delivers the intent
    }

It's an unexpected default, most of the time you don't want START_STICKY but START_REDELIVER_INTENT. START_REDELIVER_INTENT is the expected behavior.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrf43View Question on Stackoverflow
Solution 1 - AndroidEric WoodruffView Answer on Stackoverflow
Solution 2 - AndroidJappie KerkView Answer on Stackoverflow