Android使用START_STICKY的服务在杀死应用程序时崩溃

7

当我在一个Activity中点击按钮时,我的Service被调用。如果在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.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)

这是在type = intent.getIntExtra("Type",-1);处的null指针。 我知道杀死应用程序就是杀死进程,此时传递给ServiceIntentnull。但是如何处理这种情况,即使Activity被关闭,Intent也被传递给了Service? 我希望Service完全独立于Activity。并且我像这样运行它:
Intent pickIntent = new Intent(getApplicationContext(),MyLocationService.class);

可能是重复的问题:什么是NullPointerException,如何修复? - petey
1个回答

5
我明白杀死应用程序就是杀死进程,而且这个服务正在接收的意图将变为空。由于您没有发布onStartCommand()的返回值,我认为它是START_STICKY,这意味着系统将使用nullIntent重新创建服务。但是如何处理这种情况,即使活动被终止,也会将意图移交给服务。只需返回START_REDELIVER_INTENT标志,这意味着:"如果系统在onStartCommand()返回后杀死服务,则重新创建服务并使用最后传递给服务的意图调用onStartCommand()。"

谢谢。它有效。如果我使用START_REDELIVER_INTENT,而在服务运行时重新启动手机,你有什么线索会发生什么? - gandharv09
@newtoandroid 在启动应用程序并启动服务之前,什么也不会发生。如果您想在设备启动时启动服务,请参阅“尝试在Android上启动引导服务”(https://dev59.com/zHE85IYBdhLWcg3wbS1h?rq=1) - Onik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接