在Android平台上有iOS等localNotification等效解决方案吗?

Neo*_*ang 3 notifications android alarmmanager ios uilocalnotification

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

UILocalNotification* localNotification = [[UILocalNotificationalloc] init]; 
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = @"Your alert message";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
Run Code Online (Sandbox Code Playgroud)

但是,在Android中,它比我原先预期的要复杂得多:

  1. 我必须使用Alarm Manager安装警报,以便在将来的每个指定时间启动服务.

  2. 反过来,这些服务会创建通知,并使用通知管理器将通知推送到状态栏等.

但是这个解决方案有问题:

  1. 如果在警报触发之前重启设备,则警报将丢失.我可以开机广播注册这样和重新安装服务.但是,我真的想避免为同一事件安装重复的警报,但似乎无法从Alarm Manager获取当前安装的警报?
  2. 通知在将来的预定时间(比如一个月之后)组成,而不是在我设置通知(现在)时.那时,通知所需的数据可能不再可用.我没有看到任何解决方法,除了存储相关数据,并等待警报触发.

Android上的本地通知问题是否有一个无痛的解决方案?

tyc*_*czj 6

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

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

通知在将来的预定时间(比如一个月之后)组成,而不是在我设置通知(现在)时.那时,通知所需的数据可能不再可用.我没有看到任何解决方法,除了存储相关数据,并等待警报触发.

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

编辑:

您不需要保留对待处理意图的引用,您只需以相同的方式创建意图示例

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

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

PendingIntent.getBroadcast(context, 0, intent, 0);
Run Code Online (Sandbox Code Playgroud)

现在你要取消该警报,以便再次创建相同的意图,它必须是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);
Run Code Online (Sandbox Code Playgroud)