Android 具有 START_STICKY 的服务在终止应用程序时崩溃

Android service with START_STICKY crashes on killing app

这是我的 Service 在点击按钮时被 Activity 调用。如果我在 Service 为 运行 时向左滑动 Activity,它就会崩溃。我还通过在清单中放入 android:process=":remote" 在单独的过程中尝试 运行 它,但它仍然是一样的。

@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);

我得到的错误是:

  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.access00(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.access00(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)

null指针在type = intent.getIntExtra("Type",-1);

我知道终止应用程序就是终止进程,Intent 这个 Service 正在变得 null。但是这种就算Activity被杀掉Intent交给Service的情况怎么办? 我希望服务完全独立于 Activity。我也是 运行 喜欢:

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

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

由于您还没有发布 onStartCommand() 的 return 值,我相信它是 START_STICKY 意味着该服务是由系统重新创建的 null Intent通过了。

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

只是return START_REDELIVER_INTENT标志,意思是:

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