gpt4 book ai didi

android - PendingIntent.cancel() 和 AlarmManager.cancel() 的用法

转载 作者:行者123 更新时间:2023-12-02 17:16:30 27 4
gpt4 key购买 nike

如果有待处理的警报,PendingIntent.cancel() 如何影响 AlarmManager。

我应该对两个对象( Intent 和警报管理器)调用取消来取消警报吗?有人可以解释一下他们是如何一起工作的吗?

提前致谢。

最佳答案

注册 PendingIntents

可以通过工厂方法 PendingIntent.getActivity()、PendingIntent.getService()、PendingIntent.getBroadcast() 获取 PendingIntent 实例。

但是,除了获取 PendingIntent 实例之外,ActivityManager 还会在内部缓存/元数据文件中注册 PendingIntent(如果不存在)。相反,如果确实存在,则返回先前注册的实例。

例如,

 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.

仅取消 PendingIntent

取消的方式如下:

 /**
* 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) {
}
}

文档指出应用程序可以为您取消 PendingIntent。本质上,这意味着 ActivityManager 尝试匹配 PendingIntent,并在匹配的 PendingIntent 存在的情况下删除元数据/缓存条目。

如果您尝试获取之前取消或未注册的带有 FLAG_NO_CREATE 标志的 PendingIntent,则会返回 null。

通过 AlarmManager 取消 PendingIntent

通过 AlarmManager 取消显然有所不同,因为它会删除 IAlarmManager 的缓存/元数据文件中注册的 PendingIntent,并且从我深入研究 Android 源代码的情况来看,当警报被删除时,不会通过 ActivityManager 进行取消。

public void cancel(PendingIntent operation) {
try {
mService.remove(operation); IAlarmManager instance
} catch (RemoteException ex) {
}
}

结论

注册后,您必须通过 AlarmManager 取消闹钟,取消 PendingIntent 本身和 AlarmManager 的闹钟取消过程没有任何共同点。

希望我能解答您的疑问。

关于android - PendingIntent.cancel() 和 AlarmManager.cancel() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29977332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com