如果我在服务中获得了xtras,那么为什么Android应用程序在关闭应用时崩溃

时间:2016-10-14 01:50:43

标签: android android-intent android-service

<div ng-controller="validationCtrl"> <form name="xyzForm" novalidate> <input type="text" name="name" ng-model="xname" ng-class="{'has-error': xyzForm.name.$invalid && !xyzForm.name.$pristine}" /> <input type="number" name="age" ng-model="xage" ng-class="{'has-error': xyzForm.age.$invalid && !xyzForm.age.$pristine && xyzForm.age.$dirty}" /> <div> <button ng-click="submit()" ng-disabled="xyzForm.$invalid || xyzForm.$pristine">Submit</button> <span>invalid : {{xyzForm.$invalid}}</span> <span>pristine : {{xyzForm.$pristine}}</span> </div> </form> </div> 我启动服务

Activity

在服务中,我得到参数

Intent serv=new Intent(this, MyService.class);
serv.putExtra("mac", "mac");
startService(serv);

然后我杀了应用程序,应用程序将崩溃,服务也将崩溃。

如果我删除此行,那么这将没有问题,我杀死应用程序后服务也活着。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String mac=intent.getExtras().getString("mac");
    return super.onStartCommand(intent, flags, startId);
}

为什么应用程序会崩溃?

2 个答案:

答案 0 :(得分:1)

默认情况下,

super.onStartCommand(intent, flags, startId)会返回START_STICKY标记,根据文档,这意味着:

&#34;如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则将其保持在已启动状态但不要进行操作。保留这个交付的意图。&#34;

由于Intent未被重新传递,因此在致电NPE时您可能会intent.getExtras()

要重新传递Intent,请从onStartCommand()返回START_REDELIVER_INTENT标记:

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

答案 1 :(得分:0)

您正在为错误的意图bleService.putExtra("mac", "mac");

添加额外内容

相反,你应该写serv.putExtra("mac", "mac");

此外,您应该始终检查是否有额外内容

if(getIntent().hasExtra("mac"){
   //do some stuff
}