Android PendingEvent.cancel()和AlarmManager.cancel()的用法
如果存在挂起的报警,PendingEvent.cancel()如何影响AlarmManager 我是否应该调用两个对象(intent和alarmmanager)上的cancel来取消报警?有人能解释一下他们是如何合作的吗Android PendingEvent.cancel()和AlarmManager.cancel()的用法,android,Android,如果存在挂起的报警,PendingEvent.cancel()如何影响AlarmManager 我是否应该调用两个对象(intent和alarmmanager)上的cancel来取消报警?有人能解释一下他们是如何合作的吗 提前感谢。注册PendingEvents PendingEvent实例可以通过工厂方法PendingEvent.getActivity()、PendingEvent.getService()、PendingEvent.getBroadcast()获得 但是,除了仅获取Pendi
提前感谢。注册PendingEvents PendingEvent实例可以通过工厂方法PendingEvent.getActivity()、PendingEvent.getService()、PendingEvent.getBroadcast()获得 但是,除了仅获取PendingEvent实例外,如果PendingEvent不存在,ActivityManager还会将其注册到内部缓存/元数据文件中。相反,如果它确实存在,则返回以前注册的实例 比如说,
public static PendingIntent getActivity(Context context, int requestCode,
Intent intent, int flags) {
String packageName = context.getPackageName();
String resolvedType = intent != null ? intent.resolveTypeIfNeeded(
context.getContentResolver()) : null;
try {
intent.setAllowFds(false);
IIntentSender target =
ActivityManagerNative.getDefault().getIntentSender(
IActivityManager.INTENT_SENDER_ACTIVITY, packageName,
null, null, requestCode, new Intent[] { intent },
resolvedType != null ? new String[] { resolvedType } : null, flags);
return target != null ? new PendingIntent(target) : null;
} catch (RemoteException e) {
}
return null;
}
如文件所述:
/**
* Retrieve a PendingIntent that will start a new activity, like calling
* {@link Context#startActivity(Intent) Context.startActivity(Intent)}.
* Note that the activity will be started outside of the context of an
* existing activity, so you must use the {@link Intent#FLAG_ACTIVITY_NEW_TASK
* Intent.FLAG_ACTIVITY_NEW_TASK} launch flag in the Intent.
...
* @return Returns an existing or new PendingIntent matching the given
* parameters. May return null only if {@link #FLAG_NO_CREATE} has been
* supplied.
仅取消挂起内容
以下是取消的情况:
/**
* Cancel a currently active PendingIntent. Only the original application
* owning an PendingIntent can cancel it.
*/
public void cancel() {
try {
ActivityManagerNative.getDefault().cancelIntentSender(mTarget);
} catch (RemoteException e) {
}
}
文档说明应用程序可以为您取消挂起的内容。本质上,这意味着ActivityManager尝试匹配PendingEvent,并在匹配PendingEvent存在的情况下删除元数据/缓存项
如果您试图获取之前已取消或未注册的PendingEvent,并应用了标志“否创建”,则返回空值
通过AlarmManager取消挂起事件
通过AlarmManager进行的取消明显不同,因为它删除了IAlarmManager缓存/元数据文件中已注册的挂起内容,并且从我深入研究Android源代码时注意到,在删除报警时,没有通过ActivityManager进行取消
public void cancel(PendingIntent operation) {
try {
mService.remove(operation); IAlarmManager instance
} catch (RemoteException ex) {
}
}
结论
您必须在注册报警后通过AlarmManager取消报警,取消挂起事件本身和AlarmManager的报警取消过程没有任何共同之处
希望我能澄清你的疑问。在dawid gdanski的出色回答上再加上我的2美分 在报警管理器上调用cancel(取消)就足以停止报警触发。但是,您需要传递设置报警时使用的相同待定意图 所以 您可以通过将报警的周期间隔缩短到30秒左右来测试这一点。请注意,仅取消报警就足以阻止报警触发 但是请记住,挂起的意图尚未取消,如果您希望这样做,则需要明确取消它
pc.cancel()
不,只需创建等效的PendingEvent并通过AlarmManager取消它。如果仅取消挂起的意图,会发生什么情况。文件说,它取消了当前的活动挂起意图。
pc.cancel()