【问题标题】:android ICS: service restart hang on intent.getExtras()android ICS:服务重启挂在intent.getExtras()
【发布时间】:2013-07-02 16:19:55
【问题描述】:

我有一个活动,在它的 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,服务将尝试重新启动,但是无法重新启动。错误日志是:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您返回 START_STICKY,文档会说:

    如果此服务的进程在启动时被杀死(之后 从 onStartCommand(Intent, int, int)) 返回,然后将其留在 开始状态,但不保留此传递的意图。后来系统 将尝试重新创建服务。因为是启动状态, 它将保证在之后调用 onStartCommand(Intent, int, int) 创建新的服务实例;如果没有任何挂起的开始 要传递给服务的命令,它将以 null 调用 Intent 对象,因此您必须小心检查。

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

    如果此服务的进程在启动时被杀死(之后 从 onStartCommand(Intent, int, int)) 返回,那么它将是 计划重新启动并且最后交付的 Intent 重新交付到 再次通过 onStartCommand(Intent, int, int)。此意图将保留 计划重新交付,直到服务调用 stopSelf(int) 提供给 onStartCommand(Intent, int, int) 的开始 ID。服务 不会收到带有 null 的 onStartCommand(Intent, int, int) 调用 Intent,因为它只会在未完成时重新启动 处理发送给它的所有 Intent(并且任何此类未决事件都将 在重新启动时交付)。

    所以,在我看来,您要么需要返回 START_STICKY 并理解在重新启动时 onStartCommand() 将被调用一个空的 Intent 对象你需要返回 @ 987654327@ 并了解如果您的服务在被杀死时当前没有执行onStartCommand() 方法,那么它根本不会重新启动。

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

    【讨论】:

    • 我试图逐字理解您的建议。 “如果此服务的进程在启动时被杀死”。我的情况是“如果该服务的进程在有时启动后被终止”。同样的场景? “如果该服务的进程被杀死,则保持启动状态”:即使服务被杀死,它仍然处于启动状态?虽然我不完全理解,但我认为我可以通过检查意图是否为空来处理它,如果它为空,那么服务什么也不做。另一个问题来了:服务会尝试重新启动向服务发送意图的关联活动吗?谢谢
    • 如果你只是想让Android在服务被杀死后重启服务,并且在重启服务时不需要做任何事情,那么是的,你可以在@987654331中检查intent == null @ 并且什么也不做。回答您的其他问题:服务不会自动尝试重新启动向服务发送意图的活动。现在我自己要问一个问题:如果服务无关紧要,为什么还需要它运行?
    • 其实就是服务监控用户copyclip。非常感谢您的回复。它现在不会因为检查意图而挂起 == null
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2014-01-21
    • 2016-12-05
    • 2019-07-16
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多