Android开发者-闹钟管理器 vs 服务

8

我正在制作一个需要每小时执行函数的应用程序,即使应用程序关闭也是如此。

首先,我考虑创建一个服务,但在我的测试中,我意识到Android有时会杀死我的服务。因此,我正在寻找另一种解决方案,并找到了AlarmManager。我已经实施了它,似乎可以工作,但我怀疑它是否会像服务那样发生同样的情况,或者它会一直运行直到手机重启为止?

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

2个回答

6
我已经实现了它,看起来它能够工作,但我怀疑服务是否会发生相同的情况,或者它会一直运行?(直到手机重启...)
它会一直运行直到:
- 设备被重启,正如您所指出的,或者 - 用户卸载您的应用程序,或者 - 您自己取消事件,或者 - 用户进入设置,在已安装应用程序列表中找到您的应用程序,点击该条目,并单击“强制停止”按钮。
在您的应用程序升级后,可能需要重新安排闹钟(我忘记了...)。
需要在alarm manager中创建一个新线程来执行进程吗?还是直接在其他线程中运行?
除非您要执行的工作只需要几毫秒,否则您需要为其使用后台线程。这导致两种可能的模式:
  1. 如果您没有使用 _WAKEUP 类型的闹钟,请使用一个 getService() PendingIntent 每小时发送控制到一个 IntentService

  2. 如果您正在使用 _WAKEUP 类型的闹钟,您需要使用一个 getBroadcast() PendingIntent,并且要么调用您的 WakefulIntentService 子类,要么自己管理一个 WakeLock 以保持设备处于唤醒状态,同时完成工作


2
另外,如果你希望应用在设备重启后不停止运行,你可以在manifest中注册一个intent-filterBOOT_COMPLETED,这样它就会在设备重启后重新启动。 - codeMagic
@CommonsWare 如果升级后,闹钟应用程序不会自动重新启用,那么它不就变得无用了吗?我的意思是,您写过关于升级后 alarmManager 取消与应用程序相关的一切的内容,对于在后台运行的解决方案,您有相应的示例代码吗? - android developer
@androiddeveloper:“如果升级了,闹钟应用程序不会自动重新启用,因此它不会有用,对吗?”--监听ACTION_PACKAGE_CHANGED,如果必要的话。 “你写道,在升级后,alarmManager会取消与该应用程序相关的所有内容,对吗?”--不,我没有写那个。我写道:“可能需要在您的应用程序升级后再次安排闹钟(我忘记了...)。”(添加强调)“关于在后台运行的解决方案,你有每个解决方案的示例代码吗?”--我不知道你在说什么。 - CommonsWare
@androiddeveloper:实际上,我认为正确的是ACTION_MY_PACKAGE_REPLACED,这是API Level 12中新增的,进一步表明应用程序的闹钟在升级时不会受到影响。“我问你是否知道它们的示例”--https://github.com/commonsguy/cw-omnibus/tree/master/AlarmManager/Scheduled和https://github.com/commonsguy/cw-omnibus/tree/master/AlarmManager/Wakeful - CommonsWare
@CommonsWare 您的意思是,在 API 12 之前,升级后闹钟不会自动删除?使用 ACTION_PACKAGE_CHANGED 是否有助于您克服这个问题,并查看是否需要更新某些内容(例如闹钟的时间)?关于示例,谢谢。将来可能会派上用场。 - android developer
显示剩余3条评论

3
不,安卓不会取消预定的闹钟,除非应用被取代或设备重启,否则它们将按计划执行。使用广播接收器来重新安排闹钟。无法防止强制停止,因为它会完全终止应用程序的所有组件和线程。
这取决于闹钟管理器的操作。如果它发送广播,则接收器限制为10秒钟。
如果它启动一个Activity、Service或Intent Service,则没有限制。对于Activity和Service,您必须完成或停止它,对于Intent Service,直到进程完成为止。请注意,您不能在Intent Service内部有另一个线程,并且受限于OnHandleIntent中的代码。
此外,您必须考虑设备状态。如果它处于睡眠状态,并且您正在使用唤醒标志接收器,则接收器不需要唤醒锁定,但其他接收器需要。设备不久就会回到休眠状态。
不要浪费系统资源来运行服务,因为闹钟管理器可以满足您的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接