Android平台上有iOS本地通知等效解决方案吗?

时间:2014-12-15 18:08:51

标签: android ios notifications alarmmanager uilocalnotification

我的应用需要在将来某个特定时间向用户显示通知(可能需要几个月的时间)。在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. 这些服务反过来创建通知,并使用通知管理器将通知推送到状态栏等。

  3. 但是这个解决方案存在问题:

    1. 如果在警报触发前重启设备,则警报会丢失。我可以注册启动广播like this并重新安装服务。但是,我真的想避免为同一事件安装重复的警报,但似乎无法从警报管理器中获取当前安装的警报?
    2. 通知是在将来的预定时间(比如一个月后)编写的,而不是在我设置通知(现在)时。那时,通知所需的数据可能不再可用。除了存储相关数据外,我没有看到任何解决方法,等待闹钟触发。
    3. Android上的本地通知问题是否有一个无痛的解决方案?

1 个答案:

答案 0 :(得分:6)

  

如果在警报触发前重启设备,则警报会丢失。   我可以注册这样的启动广播并重新安装   服务。但是,我真的想避免安装重复的警报   对于同一事件,但似乎目前无法获得   从Alarm Manager安装了警报?

重启设备后,您将如何获得重复警报?当设备重新启动时,所有警报都会被取消,因此您可以按照说明在设备启动时BroadcastReceiver中再次启动它的位置

  

通知是在未来的预定时间组成的(例如a   一个月后),而不是我设置通知(现在)。那时候,   通知所需的数据可能不再可用。我不   除了存储相关数据外,还要等待   警报开火。

这是正确的,您需要存储要在通知中显示的数据,SharedPreferences可能是最简单的

修改

您不需要保留对待处理意图的引用所有您需要做的就是以相同的方式创建意图示例

当您第一次创建警报时,您使用了此意图

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

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

现在您要取消该警报,以便再次创建相同的意图,它必须是1对1的原始

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);