我在我的服务中使用以下代码:
@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
是第一个看待意图的点,但是我没有在堆栈跟踪中看到我的自定义消息。检查方法如下所示:
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)
根据文档,我的服务永远不会接收具有空意图的调用:
从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则它将被安排为重新启动,最后一次传递的Intent通过onStartCommand(Intent,int,int)再次传递给它。此Intent将保持计划重新传递,直到服务调用stopSelf(int),并将启动ID提供给onStartCommand(Intent,int,int)。该服务不会接收带有null Intent的onStartCommand(Intent,int,int)调用,因为只有在没有完成处理发送给它的所有Intent时才会重新启动它(并且任何此类挂起事件将在重启点。)
我无法在我的设备上重现它,但我可以看到多个用户因同样的错误而崩溃。
为什么会发生这种情况以及如何解决这个问题?