web-dev-qa-db-fra.com

Annuler une instance en attente de AlarmManager dans une autre instance en attente

Je veux annuler AlarmManager qui définit un service. Dans ce service, un nouveau AlarmManger peut être créé ou une alarme précédemment définie. Et je sais que les paramètres en attente dans alarmManager.cancel (PendingIntent) doivent être identiques. mais ça ne marche toujours pas.annuler a échoué. voici mon code

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 et GerRoundNormalService invoquent start_am_normal () ou start_am_silence; Quelqu'un pourrait m'aider? Merci

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

Ces lignes de code peuvent sûrement vous aider à supprimer/annuler l'intention et l'alarme en attente.

La principale chose dont vous aurez besoin est:

  1. Créez une intention en attente avec le même identifiant et le même FLAG.
  2. Annuler cette intention en attente.
  3. Annuler l'alarme à l'aide du gestionnaire d'alarmes.
59
MKJParekh

La réponse de @MKJParekh est correcte, mais j'aimerais ajouter davantage d'informations afin que nous sachions tous ce qui fonctionnera et ce qui ne fonctionnera pas. 

Supposons que vous créez et configurez AlarmManager pour qu'il ouvre l'activité C en 30 secondes, puis que vous souhaitiez annuler une autre activité, vous souhaitez annuler AlarmManager. Ainsi, nous ferions ce qui suit:

dans activityA, nous créons et configurons 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);

dans une autre activité, nous voulons annuler quelque temps plus tard un tel AlarmManager créé dans l’activitéA auquel nous n’avons pas accès. Appelons cette activité en cours activitéZ; 

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

Quelques points importants

Les contextes que nous fournissons dans activityA in new Intent(context) et getActivity(context) sont identiques, mais ils ne doivent pas nécessairement correspondre à l'activité à partir de laquelle nous annulons la AlarmManager; dans ce cas, activitéZ a un autre contexte.

La classe que nous voulons ouvrir avec AlarmManager doit être la même dans les deux activités new Intent (context, activityB.class), le requestCode qui est un int doit être identique, j'ai utilisé 0 pour cet exemple. Enfin, le drapeau doit être identique dans les deux activités PendingIntent.FLAG_ONE_SHOT.

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); a été utilisé parce que PendingIntent.getActivity l'exige si nous démarrons une activité en dehors du contexte d'une activité existante.

0
ArtiomLK