Android: احصل على جميع المناطق المعلقة مع الإنذار

StackOverflow https://stackoverflow.com/questions/4315611

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أقوم بإعداد إنذار مثل هذا:

alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingEvent);

أنا مهتم بإزالة جميع الإنذارات التي تم تعيينها سابقًا ، وقم بتطهيرها.

هل هناك طريقة لي للقيام بذلك أو للحصول على جميع الإنذارات التي يتم تعيينها حاليًا حتى أتمكن من حذفها يدويًا؟

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

المحلول

تحتاج إلى إنشاء نية معلقة ثم إلغاءها

 AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent updateServiceIntent = new Intent(context, MyPendingIntentService.class);
    PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);

    // Cancel alarms
    try {
        alarmManager.cancel(pendingUpdateIntent);
    } catch (Exception e) {
        Log.e(TAG, "AlarmManager update was not canceled. " + e.toString());
    }

نصائح أخرى

ليس عليك الاستمرار في الإشارة إليها. ما عليك سوى تحديد مكان جديد مثل تلك التي حددتها بالضبط في إنشائها.

فمثلا:

إذا قمت بإنشاء معلقة لإطلاقها من قِبل جهاز الإنذار مثل هذا:

   Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
    alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
    alarmIntent.setAction(String.valueOf(alarm.ID));
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

    alarmManager.set(AlarmManager.RTC_WAKEUP, alarmDateTime, displayIntent);

ثم في مكان ما في الكود الآخر (حتى نشاط آخر) يمكنك القيام بذلك لإلغاء:

Intent alarmIntent = new Intent(getApplicationContext(), AlarmBroadcastReceiver.class);
alarmIntent.setData(Uri.parse("custom://" + alarm.ID));
alarmIntent.setAction(String.valueOf(alarm.ID));
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

PendingIntent displayIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, alarmIntent, 0);

alarmManager.cancel(displayIntent);

الشيء المهم هنا هو ضبط المعلقة مع نفس البيانات والإجراءات والمعايير الأخرى كما هو مذكور هنا http://developer.android.com/Reference/android/app/alarmmanager.html#cancel٪28android.app.pendingint٪29

لإلغاء إنذار ، تحتاج إلى إعادة إنشاء نفس المعلقة وتمرير رمز الطلب نفسه.

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

  • addAlarm لإضافة إنذار جديد وتمرير رمز الطلب.
  • cancelAlarm لإزالة الإنذار ، تحتاج إلى إعادة إنشاء نفسه
    نية وتمرير نفس رمز الطلب.
  • hasAlarm للتحقق مما إذا كان هذا المنبه كما تمت إضافته ، تحتاج إلى إعادة إنشاء نفس النية وتمرير نفس رمز الطلب.
  • cancelAllAlarms لإزالة جميع الإنذارات التي تم تعيينها.

المنبهات بلدي

public class AlarmUtils {

    private static final String sTagAlarms = ":alarms";

    public static void addAlarm(Context context, Intent intent, int notificationId, Calendar calendar) {

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
        }

        saveAlarmId(context, notificationId);
    }

    public static void cancelAlarm(Context context, Intent intent, int notificationId) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();

        removeAlarmId(context, notificationId);
    }

    public static void cancelAllAlarms(Context context, Intent intent) {
        for (int idAlarm : getAlarmIds(context)) {
            cancelAlarm(context, intent, idAlarm);
        }
    }

    public static boolean hasAlarm(Context context, Intent intent, int notificationId) {
        return PendingIntent.getBroadcast(context, notificationId, intent, PendingIntent.FLAG_NO_CREATE) != null;
    }

    private static void saveAlarmId(Context context, int id) {
        List<Integer> idsAlarms = getAlarmIds(context);

        if (idsAlarms.contains(id)) {
            return;
        }

        idsAlarms.add(id);

        saveIdsInPreferences(context, idsAlarms);
    }

    private static void removeAlarmId(Context context, int id) {
        List<Integer> idsAlarms = getAlarmIds(context);

        for (int i = 0; i < idsAlarms.size(); i++) {
            if (idsAlarms.get(i) == id)
                idsAlarms.remove(i);
        }

        saveIdsInPreferences(context, idsAlarms);
    }

    private static List<Integer> getAlarmIds(Context context) {
        List<Integer> ids = new ArrayList<>();
        try {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
            JSONArray jsonArray2 = new JSONArray(prefs.getString(context.getPackageName() + sTagAlarms, "[]"));

            for (int i = 0; i < jsonArray2.length(); i++) {
                ids.add(jsonArray2.getInt(i));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return ids;
    }

    private static void saveIdsInPreferences(Context context, List<Integer> lstIds) {
        JSONArray jsonArray = new JSONArray();
        for (Integer idAlarm : lstIds) {
            jsonArray.put(idAlarm);
        }

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(context.getPackageName() + sTagAlarms, jsonArray.toString());

        editor.apply();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top