在其他的PendingIntent取消AlarmManager的PendingIntent(Canc

2019-06-26 13:57发布

我想取消AlarmManager它定义一个服务,在这个服务可能会启动一个新的AlarmManger或取消定义before.And我知道alarmManager.cancel(的PendingIntent)的PendingIntent的PARAMS报警,必须与filterEquals的same.compare(意向等)但它仍然不是work.cancel失败。 这里是我的代码

public class GetRoundStroe {
    private Store[] stores;
    private Context mContext;

    public GetRoundStroe(Context mContext) {
        this.mContext = mContext;
    }

    public Store[] getStores() {
        if (ComCommand.haveInternet(mContext)) {
            start_am_normal();
        } else {
            start_am_silence();
        }
        return stores;
    }

    public Store[] start_am_silence() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmNormal != null) {
            am.cancel(AlarmHolder.mAlarmNormal);

        }

        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getSilence_time(), AlarmHolder.mAlarmSilence);


        return null;


    }

    public Store[] start_am_normal() {


        long firstTime = SystemClock.elapsedRealtime();

        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

        if (AlarmHolder.mAlarmSilence != null) {
            MyLog.e(GetRoundStroe.class,"AlarmHolder.mAlarmSilence"+AlarmHolder.mAlarmSilence+"");
            am.cancel(AlarmHolder.mAlarmSilence);
        }
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                firstTime, TestSwitch.getInstance().getNormal_time(), AlarmHolder.mAlarmNormal);

        return null;
    }

    private static final class AlarmHolder {
        static final PendingIntent mAlarmSilence = PendingIntent.getService(ApplicationContext.getInstance(),
                0,
                new Intent(ApplicationContext.getInstance(), GetRoundSilenceService.class),
                0);

        static final PendingIntent mAlarmNormal = PendingIntent.getService(ApplicationContext.getInstance(),
                0, new
                Intent(ApplicationContext.getInstance(), GetRoundNormalService.class),
                0);

    }
}

GetRoundSilenceService和GerRoundNormalService调用start_am_normal()或start_am_silence; 任何人都可以帮助我吗? 谢谢

Answer 1:

   myIntent = new Intent(SetActivity.this, AlarmActivity.class);
   pendingIntent = PendingIntent.getActivity(CellManageAddShowActivity.this,
       id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
   pendingIntent.cancel();
   alarmManager.cancel(pendingIntent);

这些代码行一定可以帮助您删除/取消挂起的意图和报警。

您将需要主要的是:

  1. 创建具有相同的id和适当的意图FLAG未决的意图。
  2. 取消挂起的意图。
  3. 取消使用报警管理器报警。


Answer 2:

@MKJParekh答案是正确的,但是我想补充更多的信息,以便我们都知道什么工作,什么也不会。

在activityA比方说,你创建和设置AlarmManager在30秒内打开activityC,那么它可以是任何其他活动,我们要取消AlarmManager。 因此,我们会做以下;

在activityA我们创建并设置AlarmManager;

//activityA
Intent myIntentA = new Intent(actvityA.this, activityB.class)
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent myPendingIntent = PendingIntent.getActivity(activityA.this, 0, myIntentA, PendingIntent.FLAG_ONE_SHOT);

//Calendar with the time we want to fire the Alarm
Calendar calendar = Calendar.getInstance();   // Get Current Time
calendar.add(Calendar.SECOND,30);      //Fire Alarm in 30 seconds from Now.                  

((AlarmManager)getSystemService(ALARM_SERVICE)).setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), myPendingIntent);

在另一项活动一段时间后,我们要取消activityA我们都进不去创造了这样AlarmManager。 让我们把这种当前活动activityZ;

//activityZ
Intent myIntentZ = new Intent(activityZ.this, activityB.class);
PendingIntent pendingIntentZ = PendingIntent.getActivity(activityZ.this, 0, myIntentZ, PendingIntent.FLAG_ONE_SHOT);

((AlarmManager)getSystemService(ALARM_SERVICE)).cancel(pendingIntentZ);

一些重要的点,

我们activityA中所提供的背景下new Intent(context)getActivity(context)是相同的,但是他们没有匹配的地方,我们将要取消的活动AlarmManager ,在这种情况下activityZ还有另一个方面。

我们希望与打开类AlarmManager必须在这两个活动同new Intent (context, activityB.class)这是一个int必须是相同的requestCode,我用0这个例子。 最后,标志必须是在这两个活动同PendingIntent.FLAG_ONE_SHOT

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 用因为PendingIntent.getActivity需要它,如果我们开始的现有活动的上下文之外的活动。



文章来源: Cancel an AlarmManager pendingIntent in another pendingintent