web-gelistirme-sc.com

Bekleyen bir AlarmManager’ı iptal et Başka bir beklemede

Bir hizmeti tanımlayan AlarmManager'ın iptalini istiyorum, bu hizmette yeni bir AlarmManger başlatabilir veya önceden tanımlanmış bir alarmı iptal edebilir. Ve alarmManager.cancel'de (PendingIntent) beklemede olan paragrafların aynı olması gerektiğini biliyorum. ama hala işe yaramadı. işte benim kodum

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 ve GerRoundNormalService start_am_normal () veya start_am_silence; Biri bana yardım edebilir mi? Teşekkürler

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

Bu kod satırları kesinlikle bekleyen amacı ve alarmı kaldırmanıza/iptal etmenize yardımcı olabilir.

İhtiyacınız olacak en önemli şey:

  1. Aynı kimliğe ve uygun niyet FLAG’a sahip bekleyen bir niyet oluşturun.
  2. Bekleyen amacı iptal et.
  3. Alarm yöneticisini kullanarak alarmı iptal edin.
59
MKJParekh

@MKJParekh cevabı doğru, ancak neyin işe yarayıp neyin işe yaramadığını bilmek için daha fazla bilgi eklemek istiyorum.

EtkinlikA'da AlarmManager'ı 30 saniye içinde etkinlikC'yi açacak şekilde ayarlayıp oluşturacağınızı ve ardından herhangi bir diğer etkinlikte, bu AlarmManager'ı iptal etmek istediğimizi varsayalım. Böylece, aşağıdakileri yapardık;

activityA'da, AlarmManager'ı yaratır ve ayarlarız;

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

bir süre sonra Another Activity’de, aktivitesi olmayan ve bizim erişemediğimiz AlarmManager’ı iptal etmek istiyoruz. Buna şu anki aktivite etkinliği diyelim;

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

Bazı önemli noktalar

new Intent(context) ve getActivity(context)'daki activityA içinde sunduğumuz içerik aynıdır, ancak AlarmManager öğesini iptal ettiğimiz etkinlikle eşleşmeleri gerekmez, bu durumda activityZ'nin başka bir içeriği vardır.

AlarmManager ile açmak istediğimiz sınıf her iki aktivitede de aynı olmalıdır new Intent (context, activityB.class), int olan requestCode aynı olmalıdır, bu örnek için 0 kullandım. Son olarak, bayrak her iki faaliyette de aynı olmalıdır: PendingIntent.FLAG_ONE_SHOT.

myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); kullanıldı çünkü PendingIntent.getActivity , var olan bir faaliyetin kapsamı dışında bir faaliyete başlıyorsak bunu gerektirir.

0
ArtiomLK