2

在我的应用程序中,我设置了一个警报,当运行时,它会启动一个执行任务的服务(在我的应用程序中,它会在没有用户交互的情况下发送文本消息)。这条消息可以设置为未来 2 小时,也可以设置为未来一年。这是我如何实现它。

在我的主要活动中

用户键入消息,选择日期和时间(转换为毫秒),并且该警报时间(毫秒)被永久保存。然后我调用一个我设置为粘性的服务,并在启动时启动。

在我的服务。

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

这是问题

警报时间过去后,消息已成功发送,我看不到关闭该服务始终运行的方法。因此,一旦服务被杀死并重新启动(例如手机重新启动时),它就会启动,看到警报时间已经过去,并立即启动发送消息的服务。因此,在我清除应用程序上的数据之前,我会在未来随机发送随机重复消息。

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

消息第一次发送后,我将 50 年(以毫秒为单位)添加到警报时间,并永久重新保存。这样它就不会再次触发,直到用户真正自己设置时间。这似乎奏效了,但 IMO 是一个糟糕的解决方案。

必须有一种更合适的方法来设置持续警报只运行一次。对AlarmManager有更多经验的人可以告诉我吗?

4

3 回答 3

0

你最好做一些事情,比如在你设定的时间使用 anAlarmManager来传递 a ,它开始传递你的消息并在发送消息时终止。您将在侦听 BOOT_COMPLETED 的 BroadcastReceiver 中重置 。让您的服务一直运行是不好的,它可能会被杀死(并且将其设置为前台服务以使其不太可能被杀死会浪费资源)。PendingIntentIntentServiceAlarmManagerPendingIntent

于 2013-07-11T16:02:37.203 回答
0

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

请不要浪费用户的内存,让服务运行而只是看着时钟滴答作响。

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

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

我看不到关闭该服务始终运行的方法

一开始它不应该“一直在运行”。话虽如此,要停止服务,服务可以调用stopSelf().

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

将消息标记为已在您用于其余部分的任何持久存储中发送。

消息第一次发送后,我将 50 年(以毫秒为单位)添加到警报时间,并永久重新保存。这样它就不会再次触发,直到用户真正自己设置时间。这似乎奏效了,但 IMO 是一个糟糕的解决方案。

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

于 2013-07-11T16:04:44.863 回答
0

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

更快地经历了同样的事情

于 2013-07-11T15:36:22.393 回答