Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PendingEvent.cancel()和AlarmManager.cancel()的用法_Android - Fatal编程技术网

Android PendingEvent.cancel()和AlarmManager.cancel()的用法

Android PendingEvent.cancel()和AlarmManager.cancel()的用法,android,Android,如果存在挂起的报警,PendingEvent.cancel()如何影响AlarmManager 我是否应该调用两个对象(intent和alarmmanager)上的cancel来取消报警?有人能解释一下他们是如何合作的吗 提前感谢。注册PendingEvents PendingEvent实例可以通过工厂方法PendingEvent.getActivity()、PendingEvent.getService()、PendingEvent.getBroadcast()获得 但是,除了仅获取Pendi

如果存在挂起的报警,PendingEvent.cancel()如何影响AlarmManager

我是否应该调用两个对象(intent和alarmmanager)上的cancel来取消报警?有人能解释一下他们是如何合作的吗


提前感谢。

注册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()