8

我正在制作一个应用程序,即使应用程序关闭,它也需要每小时执行一个功能。

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

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

4

2 回答 2

6

我已经实现了它,它似乎可以工作,但我怀疑它是否会与服务相同,或者它会永远运行?(直到重新启动手机...)

它将运行到:

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

您的应用升级后可能需要再次安排警报(我忘记了......)。

是否需要创建一个新线程来执行警报管理器中的进程或直接在其他线程中运行??

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

  1. 如果您不使用_WAKEUP-style 警报,请使用 agetService() PendingIntent将控制发送到IntentService每小时

  2. 如果您使用的是_WAKEUP-style 警报,则需要使用 a getBroadcast() PendingIntent,并让它调用您的子类myWakefulIntentService,或者您需要WakeLock自己管理 a 以在您做一些工作时保持设备唤醒

于 2013-04-22T22:58:58.660 回答
3

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

这取决于报警管理器做什么。如果它发送广播,则接收器限制为 10 秒。

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

您还必须考虑设备状态。如果它处于睡眠状态并且您正在使用唤醒标志接收器,则不需要唤醒锁,但其他人则需要。设备很快就会重新进入睡眠状态。

不要因为服务而浪费系统资源,因为警报管理器可以满足您的需求。

于 2013-04-22T23:04:35.480 回答