我的应用中有一项功能,当它从外部API获取数据时会产生警报。刷新API数据时,它会再次根据新数据创建警报。每次用户访问该特定视图时,都会从服务器中提取当前数据并创建警报。如何确保删除使用旧数据创建的警报?该功能是一种提醒服务。
答案 0 :(得分:0)
如果您使用requestCode
或PendingIntent.FLAG_UPDATE_CURRENT
创建其他警报,则可以在为警报创建PendingIntent时使用最初使用的PendingIntent.FLAG_CANCEL_CURRENT
,并且它将首先取消警报并在PendingIntent.FLAG_CANCEL_CURRENT
的情况下创建一个新的,或者在PendingIntent.FLAG_UPDATE_CURRENT
来自Docs
FLAG_CANCEL_CURRENT
表示如果所描述的PendingIntent已存在,则表示在生成新的PendingIntent之前应取消当前的PendingIntent。用于getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int)和getService(Context,int,Intent,int)。 当您只更改Intent中的额外数据时,可以使用它来检索新的PendingIntent;通过取消先前的待定意图,这可确保只有给定新数据的实体才能启动它。如果此保证不是问题,请考虑FLAG_UPDATE_CURRENT。
FLAG_UPDATE_CURRENT
指示如果描述的PendingIntent已经存在的标志,则保留它,但将其额外数据替换为此新Intent中的内容。用于getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int)和getService(Context,int,Intent,int)。 如果您创建只有额外内容更改的意图,并且不关心接收到您之前的PendingIntent的任何实体将能够使用您的新附加功能启动它,即使它们未明确赋予它,也可以使用此功能。
否则,如果未指定这些标志,您可以手动取消它们。您只需要请求代码
PendingIntent pendingIntent =
PendingIntent.getBroadcast(mContext, requestCode, alarmReceiverClassIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) mContext.getSystemService(ALARM_SERVICE);
if (am != null) {
am.cancel(pendingIntent);
}