服务死亡,在日志中看到“ActivityManager:超时执行服务...”。原因?

时间:2012-04-03 16:32:29

标签: android

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

正如当前实现的那样,该服务不会产生一个单独的线程来完成它的工作,在onStart()中完成所有操作。

该服务执行一些数据库查询,我怀疑我现在经常看到日志中的服务“超时执行服务...”消息的原因,因为我的服务已经死亡,这些查询需要花费更长的时间作为数据库规模增加。

具体会导致执行超时。

  • 是否正在主题上进行工作?

因此,从onStart()产生一个单独的线程,允许onStart()及时返回,而DB查询等在单独的线程上运行将完全消除这个问题?或者还有其他我想念的东西?

1 个答案:

答案 0 :(得分:2)

如果您使用android.app.Service作为基类,那么您正在主线程上进行工作。开发人员,请在主线程上执行数据库操作!你会减慢系统速度,最有可能导致你的应用程序出现ANR。

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

您可以在IntentService本身中设置AlarmManager,然后让它自动重复,而无需您的应用程序干预。向IntentService发送“开始”意图,以便第一次启动服务并设置重复计划。给PendingIntent一个“循环”意图,然后使用AlarmManager.setRepeating来设置你的日程安排。 AlarmManager实例会定期向您的IntentService发送“循环”意图,在其中您可以执行数据库工作。

要停止闹钟,请发出“停止”意图,以取消闹钟。