我在我的服务中使用以下代码:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mStartId = startId;
    handleStartCommandIntent(intent);
    return START_REDELIVER_INTENT;
}

private void handleStartCommandIntent(@Nullable Intent intent) {
    if (mCompositeDisposable == null) {
        mCompositeDisposable = new CompositeDisposable();
    }
    checkNotNull(intent, "intent cannot be null");
    String type = intent.getStringExtra(SERVICE_REQUEST_TYPE);
    <...>
}

@Override
public void completed() {
    stopSelf(mStartId);
}

checkNotNull 是第一个看到intent的地方,但是我没有在堆栈跟踪中看到我的自定义消息 . 检查方法如下所示:

public static <T> T checkNotNull(T reference, @Nullable Object errorMessage) {
    if(reference == null) {
        throw new NullPointerException(String.valueOf(errorMessage));
    } else {
        return reference;
    }
}

但是,我仍然在Crashlytics日志中看到NPE:

Fatal Exception: java.lang.RuntimeException: Unable to start service com.myapp.app.internal.service.MessagingService@4134a7b8 with Intent { cmp=com.myapp.app/com.myapp.app.internal.service.MessagingService }: java.lang.NullPointerException
   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2608)
   at android.app.ActivityThread.access$1900(ActivityThread.java:130)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4847)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:535)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
   at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.NullPointerException
   at com.myapp.app.internal.service.MessagingService.onStartCommand(MessagingService.java:1065)
   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2591)
   at android.app.ActivityThread.access$1900(ActivityThread.java:130)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:4847)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:535)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
   at dalvik.system.NativeStart.main(NativeStart.java)

根据文档,我的服务永远不会接收具有null意图的调用:

从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),那么它将被安排重启并且最后一次传递意图通过onStartCommand(Intent,int,int)再次传递给它 . 此Intent将保持计划重新传递,直到服务调用stopSelf(int),并将启动ID提供给onStartCommand(Intent,int,int) . 该服务不会接收带有null Intent的onStartCommand(Intent,int,int)调用,因为只有在没有完成处理发送给它的所有Intent时才会重新启动它(并且任何此类挂起事件将在重启点) .

我无法在我的设备上重现它,但我可以看到多个用户因同样的错误而崩溃 .

任何建议为什么会发生这种情况以及如何解决它?