Android 平台上有类似 iOS 的本地通知的等价解决方案吗?

3

我的应用需要在未来某个特定的时间向用户显示通知(可能是数月之后)。在iOS中,我所需做的就是这样:

UILocalNotification* localNotification = [[UILocalNotificationalloc] init]; 
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = @"Your alert message";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

然而,在Android中,它比我最初预期的要复杂得多:
1. 我必须使用Alarm Manager安装闹钟,以便在未来的每个指定时间启动服务。 2. 这些服务又会创建通知,并使用Notification Manager将通知推送到状态栏等。
但这种解决方案存在问题:
1. 如果设备在闹钟响起之前重启,则闹钟将丢失。我可以像这样注册开机广播并重新安装服务。然而,我真的想避免为同一事件安装重复的闹钟,但似乎没有办法从Alarm Manager获取当前已安装的闹钟? 2. 通知是在将来的预定时间(比如一个月后)组成的,而不是在我设置通知时(现在)。此时,通知所需数据可能已不再可用。除了存储相关数据并等待闹钟响起外,我看不到任何其他解决方案。
是否有无痛的解决方案来解决Android本地通知问题?

1
我认为没有其他方法,但可以参考这个帖子来帮助。 - Saif Hamed
将数据写入文件的哪个部分构成了“痛苦”? - CommonsWare
1
与iOS代码片段相比,您是否同意Android的方式很痛苦? - NeoWang
哇,作为一名iOS开发者转向Android,这真是太神奇了。每次设备启动时我都必须重新注册所有的闹钟...这简直是疯狂。 - Epaga
1个回答

6

如果在闹钟响起之前重新启动设备,则会丢失闹钟。我可以像这样注册启动广播并重新安装服务。不过,我真的想避免为同一事件安装重复的闹钟,但似乎没有办法从闹钟管理器中获取当前安装的闹钟?

当设备重新启动时,您将如何获得重复的闹钟?当设备重新启动时,所有闹钟都会被取消,因此您可以像您所说的那样,在BroadcastReceiver中启动它。

通知是在未来的预定时间组合的(例如一个月后),而不是在我设置通知时组合的。那时,通知所需的数据可能不再可用。 除了存储相关数据并等待闹钟响起外,我看不到其他方法。

没错,您需要存储要在通知中显示的数据,SharedPreferences可能是最简单的方法。

编辑:

您不需要保留对挂起意图的引用,您只需像示例中一样创建该意图即可

当您首次创建闹钟时,您使用了这个意图

Intent intent = new Intent(context,MyClass.class);
    //any flags or extras

PendingIntent.getBroadcast(context, 0, intent, 0);

现在您想取消该闹钟,只需再次创建相同的意图,必须与原始创建的完全一致。
Intent intent = new Intent(context,MyClass.class);
    //any flags or extras that you previously had

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);

alarmMgr.cancel(pi);

回答你的问题:我可以使用一个服务在启动时安装所有警报,但是当新事件准备好时也会调用这个同样的服务(不需要重新启动),在这种情况下,旧事件被安装了两次。难道没有像getCurrentAlarms()这样的方法吗?用户可能需要取消之前设置的某个警报,他该如何做到这一点? - NeoWang
1
没有办法获取所有待处理的意图,你查过如何取消闹钟吗?如果你所有的闹钟创建都在一个地方完成,只需使用与创建时相同的意图在那里取消任何闹钟即可。 - tyczj
我知道cancel(PendingIntent operation) API。但是闹钟可能需要在设置后的某个时间取消(例如一周后决定不去旅行),我不能保留对PendingIntents的引用,对吗? - NeoWang
我没有仔细阅读文档。API使用filterEquals(Intent other)进行比较,而不是引用。谢谢! - NeoWang

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