25

我想取消定义服务的AlarmManager,在此服务中可能会启动一个新的AlarmManger或取消之前定义的警报。我知道alarmManager.cancel(PendingIntent)中的参数pendingintent,必须相同。与filterEquals(其他意图)比较但它仍然不起作用。取消失败。这是我的代码

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;任何人都可以帮助我吗?谢谢

4

2 回答 2

70
   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. 使用警报管理器取消警报。
于 2012-07-27T05:32:46.240 回答
1

@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);

一段时间后,在另一个 Activity 中,我们想取消在我们无权访问的 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是因为如果我们在现有活动的上下文之外启动活动,则需要它。

于 2017-06-01T09:10:34.643 回答