3

我有一个活动,在它的 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关闭我的应用程序/服务以释放一些内存。如您所料,使用 START_STICKY,服务将尝试重新启动,但是无法重新启动。错误日志是:

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

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

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

4

1 回答 1

2

如果你 return START_STICKY,文档说:

如果此服务的进程在启动时被杀死(从 onStartCommand(Intent, int, int) 返回后),则将其保持在启动状态,但不要保留此传递的意图。稍后系统将尝试重新创建服务。因为处于启动状态,所以会保证在创建新的服务实例后调用onStartCommand(Intent, int, int);如果没有任何待处理的启动命令要传递给服务,它将使用 null 意图对象调用,因此您必须注意检查这一点。

如果,而不是START_STICKY,你 return START_REDELIVER_INTENT,文档说:

如果该服务的进程在启动时被杀死(在从 onStartCommand(Intent, int, int) 返回之后),那么它将被安排重新启动,并通过 onStartCommand(Intent, int,诠释)。在服务调用 stopSelf(int) 并将开始 ID 提供给 onStartCommand(Intent, int, int) 之前,此 Intent 将保持计划重新传递。该服务将不会收到带有 null Intent 的 onStartCommand(Intent, int, int) 调用,因为它只会在未完成处理发送给它的所有 Intent 时重新启动(并且任何此类挂起的事件都将在重启点)。

因此,在我看来,您要么需要返回START_STICKY并了解在重新启动onStartCommand()时将使用 nullIntent对象调用,要么您需要返回START_REDELIVER_INTENT并了解如果您的服务onStartCommand()在被杀死时当前未执行该方法,那么它将不会根本无法重新启动。

如果您需要保存 的最新值myString,可以将其写入共享首选项。

于 2013-07-02T16:32:40.240 回答