2012-07-27 85 views
20

我想取消定义一个服务的AlarmManager,在这个服务中可能会启动一个新的AlarmManger或取消定义的闹钟。而且我知道alarmManager.cancel(PendingIntent)中的参数pendingintent必须是same.compare与filterEquals(意图其他) 但它仍然不工作.cancel失败。 这里是我的代码取消另一个pendingintent中的AlarmManager pendingIntent

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

回答

50
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. 使用报警管理器取消报警。
+0

我try.thank你 – 2012-07-27 07:23:28

+1

+1巨轮人... – 2013-01-29 08:58:08

+2

完美的答案,既pendingIntent.cancel()和alarmanager.cancel(的PendingIntent)需要被调用为 “完全” 取消的PendingIntent – Soham 2014-02-20 23:43:47

0

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

让我们说activityA你创建并设置AlarmManager在30秒内打开activityC,然后在其他一些可以是任何活动的活动中,我们要取消该AlarmManager。因此,我们会做以下事情;

in 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)中相同,requestCode是一个int必须是相同的,本例中我使用0。最后,在两个活动PendingIntent.FLAG_ONE_SHOT中的标志必须相同。

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