سؤال

انا لدي alarmManager الذي أستخدمه لإرسال إشعارات إلى المستخدم في أوقات محددة. نظرًا لوجود العديد من الإنذارات ، لدي العديد من النوايا المعلقة التي أقوم بإنشائها وأعطي معرفًا فريدًا ، ولكن هناك مواقف معينة سأحتاج فيها للحصول على جميع النوايا المعلقة ثم إلغاءها ، حتى أتمكن من إعادة ضبط الإنذارات. لقد حاولت القيام بذلك وما زلت لا أستطيع أن أحصل عليه بشكل صحيح ، لذا لدي سؤالان:

هل هذه الطريقة التي ستحصل عليها بشكل صحيح وإلغاء أ PendingIntent?

Intent intent = new Intent(con, AppointmentNotificationReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, id, intent,
        PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);

هل تحتاج القصد إلى مطابقة القصد الأصلي المعلق (الإضافات وكل شيء)؟

هل PendingIntent العلم بحاجة إلى مطابقة القصد الأصلي المعلقة؟

هل كانت مفيدة؟

المحلول

اكتشفت أنك لا "تحصل" في الواقع على النية المعلقة ... يجب عليك إعادة إنشائها تمامًا كما كانت عندما قمت بإنشائها لأول مرة (نية أيضًا) ثم تمريرها إلى وظيفة إلغاء الإنذار. لذا فإن الكود أعلاه الذي نشرته ليس غير صحيح طالما أن هذا ما قمت بإنشائه لأول مرة. نأمل أن يجد شخص ما هذا مفيدًا.

نصائح أخرى

هناك مثال على تنفيذ الاختبار الخاص بي لإنشاء إنذار وإلغاءه.

    public void setTHEalarm(Calendar aCalendarToAlarm) {
    int id;
    Intent intent;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    //I create an unique ID for my Pending Intent based on fire time of my alarm:

    id = Integer.parseInt(String.format("%s%s%s%s",

            aCalendarToAlarm.get(Calendar.HOUR_OF_DAY),
            aCalendarToAlarm.get(Calendar.MINUTE),
            aCalendarToAlarm.get(Calendar.SECOND),
            aCalendarToAlarm.get(Calendar.MILLISECOND))); //HASH for ID

    intent = new Intent(this,AlarmReceiver.class);
    intent.putExtra("id",id); //Use the id on my intent, It would be usefull later.

    //Put the id on my Pending Intent:
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,0);
    alarmManager = (AlarmManager)

            this.getSystemService(Context.ALARM_SERVICE);


    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,aCalendarToAlarm.getTimeInMillis(),CustomDate.INTERVAL_MINUTE,pendingIntent);


    Log.w(TAG+" Torrancio","Created alarm id: "
            +id+" -> "
            +CustomDate.dateToHumanString(aCalendarToAlarm.getTime()));

    //Keep a reference in a previously declared field of My Activity (...)
    this.idSaved = id;

}

//Now for canceling
public void setCancel() {
    int id;
    Intent intent;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    id = this.idSaved;
    intent =  new Intent(this,AlarmReceiver.class);
    intent.putExtra("id",id);
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,PendingIntent.FLAG_CANCEL_CURRENT);

    //Note I used FLAG_CANCEL_CURRENT 

    alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);

    Log.w(TAG+" Torrancio","Canceled->"+id);


}

بحاجة إلى 3 أشياء ،

  • نفس النوع من النوايا (هذه الحالة نتحدث عن المنبه).
  • نفس المعرف المعلق (حافظ على مرجع للمعرف ، احفظه بطريقة ما).
  • العلم الصحيح (flag_cancel_current لإلغاء ، لا حاجة ولا يجب أن تكون بالضبط تلك التي استخدمتها عند إنشاء المعلقة [لأننا نستخدم علامة إلغاء Calcel ، ولكن لا ننشئ.])

لمزيد من التفاصيل يرجى التحقق هذه خارج.

أتمنى أن يساعد ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top