android ICS:服务重启挂在intent.getExtras()上

时间:2013-07-02 16:19:55

标签: android service android-4.0-ice-cream-sandwich restart

我的OnCreate中有一项活动:

    serviceIntent = new Intent(this, MyServ.class);
    int templen =  myString.length();
    Log.i("check", "mystring"+templen);     
    serviceIntent.putExtra("myString", myString);       
    startService(serviceIntent);

在服务中,

public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub      
    myString = intent.getExtras().getString("myString");
    return START_STICKY;
}

工作正常。然后我打开了很多应用程序,让android关闭我的app / services以释放一些ram。正如您所料,使用START_STICKY,服务将尝试重新启动,但是无法重新启动。错误日志是:

引起:java.lang.NullPointerException 在com.example.myapp.myserv.onStartCommand(MyServ.java:77),它指向这一行:

myString = intent.getExtras().getString("myString");

所以我相信当服务重新启动时,myact没有发送任何意图。我该如何处理这个案子?感谢

1 个答案:

答案 0 :(得分:2)

如果您返回START_STICKY,则文档说明:

  

如果此服务的进程在启动时被终止(之后)   从onStartCommand(Intent,int,int)返回,然后将其留在   开始状态,但不保留这个交付的意图。后来的系统   将尝试重新创建服务。因为它处于启动状态,   它将保证在之后调用onStartCommand(Intent,int,int)   创建新的服务实例;如果没有任何未决的开始   要传递给服务的命令,将使用null调用它   意图对象,所以你必须注意检查这个。

如果您返回START_STICKY而不是START_REDELIVER_INTENT,则文档说:

  

如果此服务的进程在启动时被终止(之后)   从onStartCommand(Intent,int,int)返回,然后它将是   计划重新启动,最后交付的Intent重新发送到   它再次通过onStartCommand(Intent,int,int)。这个意图将保留   计划重新发送,直到服务调用stopSelf(int)   提供给onStartCommand(Intent,int,int)的起始ID。服务   将不会收到带有null的onStartCommand(Intent,int,int)调用   意图,因为它只会在没有完成时重新启动   处理发送给它的所有Intent(以及任何此类待处理事件   在重新启动时交付。)

所以,听起来像你需要返回START_STICKY并了解重启onStartCommand()时将使用null Intent对象您需要返回START_REDELIVER_INTENT并了解如果您的服务当前没有执行onStartCommand()方法,那么它将不会重新启动。

如果您需要保存myString的最新值,可以将其写入共享偏好设置。