我的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没有发送任何意图。我该如何处理这个案子?感谢
答案 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
的最新值,可以将其写入共享偏好设置。