在我的应用程序中,我有一个警报设置,在运行时,启动将执行任务的服务(在我的应用程序中,它发送文本消息而无需用户交互)。此消息可以在将来设置为2小时,也可以在将来设置为一年。这是我实现它的方式。
在我的主要活动中
用户类型消息,选择日期和时间(转换为毫秒),并且持续保存该警报时间(毫秒)。然后我调用一个服务,我已设置为粘性,并在启动时启动。
在我的服务中。
当服务被调用时(在第一次调度消息之后,它现在一直在运行),它会创建具有保存的警报时间的警报。这很好,因为如果手机重新启动,警报将再次重新创建。
以下是问题
警报时间结束后,消息成功发送,我看不到关闭该服务的方法。因此,只要服务被杀死并重新启动(例如电话重新启动),它就会启动,看到警报时间已过去,并立即启动发送消息的服务。因此,在我清除应用程序上的数据之前,我会随机发送随机重复的消息。
我的解决方案(不优雅)。
在第一次发送消息后,我将50年(以毫秒为单位)添加到闹钟时间,并持续重新保存。这样,在用户实际设置时间之前,它不会再次触发。这似乎有效,但IMO是一个可怕的解决方案。
必须有更合适的方法将持久警报设置为仅运行一次。有更多使用AlarmManager经验的人可以告诉我吗?
答案 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
或等效内容。或者,根据您的数据结构,完全删除条目。无论如何,您的持久数据模型需要反映消息的已发送/未发送状态,但您选择这样做。