Android开发者 - 警报管理器与服务

时间:2013-04-22 22:54:19

标签: android alarmmanager

即使应用程序已关闭,我正在创建一个需要每小时执行一次功能的应用程序。

首先,我想创建一个服务,但在我的测试中,我意识到android有时会杀死我的服务。所以我正在寻找另一种解决方案,我找到了AlarmManager。我已经实现了它似乎工作但我怀疑它是否会发生相同的服务或它将永远运行? (直到重新启动移动设备......)

另一个问题是,有必要创建一个新线程来执行警报管理器中的进程,还是直接在其他线程中运行?

2 个答案:

答案 0 :(得分:6)

  

我已经实现了它似乎工作但我怀疑它是否会发生相同的服务或它将永远运行? (直到重新启动移动设备......)

它会一直运行到:

  • 正如您所说,
  • 重启设备
  • 用户卸载您的应用,或
  • 您自己取消活动,或
  • 用户进入“设置”,在已安装的应用列表中找到您的应用,点按该条目,然后点击“强制停止”按钮

升级应用后,可能需要再次安排闹钟(我忘了......)。

  

有必要创建一个新线程来在报警管理器中执行该进程,还是直接在其他线程中运行?

除非你要做的工作只需要几毫秒,否则你需要一个后台线程。这导致了两种可能的模式:

  1. 如果您没有使用_WAKEUP式警报,请使用getService() PendingIntent每小时将控件发送至IntentService

    < / LI>
  2. 如果您使用_WAKEUP式警报,则需要使用getBroadcast() PendingIntent,并让它调用my WakefulIntentService的子类,或者你需要自己管理WakeLock以保持设备在你做一些工作时保持清醒

答案 1 :(得分:3)

不,除非更换应用或重启设备,否则Android不会终止预定的警报并按计划执行。使用广播接收器来重新安排警报。没有办法阻止强制停止,因为它会完全杀死你的所有应用程序组件和线程。

这取决于Alarm Manager的功能。如果它发送广播,则接收器限制为10秒。

如果它启动了Activity,Service或Intent Service,则没有限制。对于活动和服务,您必须完成或停止它以及Intent服务,直到该过程完成。请注意,您不能在Intent Service中拥有另一个线程,并且您仅限于OnHandleIntent中的代码。

此外,您必须考虑设备状态。如果它处于睡眠状态并且您正在使用唤醒标志接收器将不需要唤醒锁,但其他人则需要。设备重新入睡不会花费很长时间。

不要将系统资源浪费在服务上,因为Alarm Manager可以执行您想要的操作。