在什么特定情况下发生这种超时?我安排一个警报来定期启动服务,所以我创建一个PendingIntent,以服务为目标(通过调用PendingIntent.getService(......)),并将其传递给AlarmManager setRepeating(..... ) 方法。警报类型为RTC_WAKEUP。
正如当前实现的那样,该服务不会产生一个单独的线程来完成它的工作,在onStart()中完成所有操作。
该服务执行一些数据库查询,我怀疑我现在经常看到日志中的服务“超时执行服务...”消息的原因,因为我的服务已经死亡,这些查询需要花费更长的时间作为数据库规模增加。
但具体会导致执行超时。
因此,从onStart()产生一个单独的线程,允许onStart()及时返回,而DB查询等在单独的线程上运行将完全消除这个问题?或者还有其他我想念的东西?
答案 0 :(得分:2)
如果您使用android.app.Service作为基类,那么您正在主线程上进行工作。开发人员,请不在主线程上执行数据库操作!你会减慢系统速度,最有可能导致你的应用程序出现ANR。
使用IntentService而不是Service来确保工作在单独的线程上进行。 IntentService专门用于在单独的线程上进行异步后台处理。
您可以在IntentService本身中设置AlarmManager,然后让它自动重复,而无需您的应用程序干预。向IntentService发送“开始”意图,以便第一次启动服务并设置重复计划。给PendingIntent一个“循环”意图,然后使用AlarmManager.setRepeating来设置你的日程安排。 AlarmManager实例会定期向您的IntentService发送“循环”意图,在其中您可以执行数据库工作。
要停止闹钟,请发出“停止”意图,以取消闹钟。