实现一次运行警报但在重启后保持活动的正确方法是什么?

时间:2013-07-11 15:33:26

标签: android service alarmmanager receiver alarms

在我的应用程序中,我有一个警报设置,在运行时,启动将执行任务的服务(在我的应用程序中,它发送文本消息而无需用户交互)。此消息可以在将来设置为2小时,也可以在将来设置为一年。这是我实现它的方式。

在我的主要活动中

用户类型消息,选择日期和时间(转换为毫秒),并且持续保存该警报时间(毫秒)。然后我调用一个服务,我已设置为粘性,并在启动时启动。

在我的服务中。

当服务被调用时(在第一次调度消息之后,它现在一直在运行),它会创建具有保存的警报时间的警报。这很好,因为如果手机重新启动,警报将再次重新创建。

以下是问题

警报时间结束后,消息成功发送,我看不到关闭该服务的方法。因此,只要服务被杀死并重新启动(例如电话重新启动),它就会启动,看到警报时间已过去,并立即启动发送消息的服务。因此,在我清除应用程序上的数据之前,我会随机发送随机重复的消息。

我的解决方案(不优雅)。

在第一次发送消息后,我将50年(以毫秒为单位)添加到闹钟时间,并持续重新保存。这样,在用户实际设置时间之前,它不会再次触发。这似乎有效,但IMO是一个可怕的解决方案。

必须有更合适的方法将持久警报设置为仅运行一次。有更多使用AlarmManager经验的人可以告诉我吗?

3 个答案:

答案 0 :(得分:0)

您可以注册一个BroadcastReciever onBooted以再次启动警报 - 但您肯定需要将警报时间保存在sharedpreferences或sqlite数据库中......

早点经历了同样的事情

答案 1 :(得分:0)

最好在您设定的时间使用AlarmManager来发送PendingIntent,这样会启动IntentService来传递您的信息,并在邮件发送时终止。您将在BroadcastReceiver中使用AlarmManager重置PendingIntent,以侦听BOOT_COMPLETED。让你的服务一直运行并不好,它可能会被杀死(并使它成为一个前台服务,使其不太可能被杀死会浪费资源)。

答案 2 :(得分:0)

  

当服务被调用时(在第一次安排消息之后,它现在一直在运行)

请不要浪费用户的记忆,让服务运行除了看时钟之外什么也不做。

  

它会使用保存的闹钟时间创建闹钟

我假设,从上下文来看,“创建警报”意味着“使用AlarmManager安排事件”。如果您使用AlarmManager,则没有理由让服务“始终在运行”。

  

我没有办法从总是运行

关闭该服务

首先它不应该“一直在运行”。话虽这么说,要停止服务,服务可以拨打stopSelf()

  

一旦服务被杀死并重新启动(比如电话重启),它就会启动,看到警报时间已经过去,并立即启动发送消息的服务

将邮件标记为已在您正在使用的任何持久性商店中发送,用于其余部分。

  

在第一次发送消息后,我将50年(以毫秒为单位)添加到闹钟时间,并持续重新保存。这样,在用户实际设置时间之前,它不会再次触发。这似乎有效,但IMO是一个可怕的解决方案。

欢迎您使用hasBeenDelivered boolean或等效内容。或者,根据您的数据结构,完全删除条目。无论如何,您的持久数据模型需要反映消息的已发送/未发送状态,但您选择这样做。