7

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);
Onik
  • 19,396
  • 14
  • 68
  • 91
gandharv09
  • 257
  • 5
  • 17
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – petey Oct 27 '16 at 18:02

1 Answers1

5

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."

Onik
  • 19,396
  • 14
  • 68
  • 91
  • Thanks. It works. Also any clue what will happen if i reboot the phone while service is running if i use START_REDELIVER_INTENT? – gandharv09 Sep 18 '15 at 06:40
  • @newtoandroid Nothing, untill you start the app that in its turn starts the service. If you'd like to start the service on device boot, take a look at [Trying to start a service on boot on Android](http://stackoverflow.com/questions/2784441/trying-to-start-a-service-on-boot-on-android?rq=1) – Onik Sep 18 '15 at 09:09