服务死亡,在日志中查看"ActivityManager: Timeout executing service..."。原因?



在什么特定情况下会发生这种超时?我安排一个警报以定期启动服务,因此我创建了一个以服务为目标的PendingIntent(通过调用PendingIntent.getService(……)),并将其传递给AlarmManager setRepeating(…..)方法。报警类型为RTC_WAKEUP。

正如目前实现的那样,该服务没有生成一个单独的线程来完成它的工作,而是在onStart()中完成所有工作。

该服务执行一些DB查询,我怀疑,当我的服务失效时,我现在经常在日志中看到该服务的"Timeout executing service.."消息的原因是,随着DB大小的增加,这些查询需要更长的时间。

不过,特别是的内容会导致执行超时。

  • 它是否在main线程上执行工作

那么,从onStart()中生成一个单独的线程,允许onStart(()及时返回,而DB查询等在单独的线程上运行,会完全消除这个问题吗?或者我还缺少什么?

如果使用android.app.Service作为基类,则在主线程上执行工作。开发人员,请在主线程上执行而不是的DB操作!你会减慢系统的速度,很可能会导致你的应用程序出现ANR。

使用IntentService而不是Service来确保工作在单独的线程上进行。IntentService专门设计用于在单独的线程上进行异步后台处理。

您可以在IntentService中设置AlarmManager,然后让它自动重复,而无需应用程序的干预。向IntentService发送"启动"意向,以便首次启动服务并设置重复计划。给PendingIntent指定一个"循环"意图,然后使用AlarmManager.setReating设置您的时间表。AlarmManager实例会定期向IntentService发送"循环"意图,您可以在其中完成DB工作。

要停止报警,您可以发送一个"停止"意图来取消报警。

最新更新