newtoandroid newtoandroid - 1 month ago 24
Android Question

Android service with START_STICKY crashes on killing app

This is my

Service
getting called on button click from an
Activity
. If I swipe my
Activity
left while
Service
is running it crashes. I have also tried running it in separate process by putting in
android:process=":remote"
in the manifest but it is still the same.

@Override
public void onCreate(){
super.onCreate();
Log.d("Service", "Creating");
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return null;
}

@Override
public int onStartCommand (Intent intent, int flags, int startId)
{
super.onStartCommand(intent, flags, startId);

Log.d("Started", "Service");

type = intent.getIntExtra("Type",-1);
mode = intent.getIntExtra("Mode",-1);
rank = intent.getIntExtra("Rank", -1);
latitude = intent.getDoubleExtra("Lat", -1.0);
longitude = intent.getDoubleExtra("Long", -1.0);
startTime = intent.getLongExtra("Start", 0);
endTime = intent.getLongExtra("End", 0);


The error I am getting is:

java.lang.RuntimeException: Unable to start service com.routofy.routofytest.MyLocationService@374afe93 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2913)
at android.app.ActivityThread.access$2100(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getIntExtra(java.lang.String, int)' on a null object reference
at com.routofy.routofytest.MyLocationService.onStartCommand(MyLocationService.java:89)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2896)
at android.app.ActivityThread.access$2100(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)


That is
null
pointer on
type = intent.getIntExtra("Type",-1);


I understand that killing the app is killing the process and
Intent
this
Service
is getting is coming out to be
null
. But how to handle such cases that even if
Activity
is killed
Intent
is handed over to
Service
?
I want service to be totally independent of
Activity
. Also I am running it like:

Intent pickIntent = new Intent(getApplicationContext(),MyLocationService.class);

Answer

I understand that killing the app is killing the process and intent this service is getting is coming out to be null.

Since you haven't posted the return value of onStartCommand() I believe that it's START_STICKY meaning that the service is recreated by the system with null Intent passed in.

But how to handle such cases that even if activity is killed intent is handed over to service.

Just return START_REDELIVER_INTENT flag, which means that:

"If the system kills the service after onStartCommand() returns, recreate the service and call onStartCommand() with the last intent that was delivered to the service."