关闭APK后,Service.onStartCommand中出现NullPointer异常。如何处理?

时间:2015-11-12 10:21:27

标签: android android-intent service nullpointerexception

有一项服务必须处理其IntentHandler的数据 下面的代码段:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Bundle bundle = intent.getExtras();
    Message msg = new Message();
    msg.setData(bundle);
    mServiceHadler.sendMessage(msg);
    return  START_STICKY;
}

在调用Intent以启动服务并从概览屏幕中移除APK后,由于NullPointerException null来了,因此获得Intent

java.lang.RuntimeException: Unable to start service com.example.intentservicetest01.ServiceExt@750547a with null: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4021)
            at android.app.ActivityThread.access$2400(ActivityThread.java:209)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1841)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:7014)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:621)

是否有规范明确(不添加条件null检查)方式来处理null Intent

如果服务将在另一个进程中启动,这个回调方法(Service.onStartCommand)是否会存在?任何合适的想法都值得赞赏。

2 个答案:

答案 0 :(得分:0)

尝试停止service这样的

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    stopSelf();
}

或以这种方式启动

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // your code
    return START_REDELIVER_INTENT;
}

答案 1 :(得分:0)

我喜欢像这样编码,使用@Nullable Annotation。

@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand: " + intent.getCategories());
    return super.onStartCommand(intent, flags, startId);
}

如果使用了intent但未选中,则会出现如下警告: warning info 那么你可以轻松地做到。