Подтвердить что ты не робот

Как проверить, установлен ли AlarmManager уже установленный будильник?

Когда мое приложение запускается, я хочу, чтобы он проверял, установлен ли какой-либо конкретный сигнал тревоги (зарегистрированный через AlarmManager). Результаты google, похоже, указывают на то, что нет никакого способа сделать это. Это все еще правильно? Мне нужно сделать эту проверку, чтобы сообщить пользователю, прежде чем предпринимать какие-либо действия для создания нового аварийного сигнала.

4b9b3361

Ответ 1

В ответ на комментарий, отправленный ron, вот подробное решение. Скажем, вы зарегистрировали повторяющийся сигнал тревоги с ожидающим намерения следующим образом:

Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
                                      intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.MINUTE, 1);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent);

Как вы можете проверить, активен ли он:

boolean alarmUp = (PendingIntent.getBroadcast(context, 0, 
        new Intent("com.my.package.MY_UNIQUE_ACTION"), 
        PendingIntent.FLAG_NO_CREATE) != null);

if (alarmUp)
{
    Log.d("myTag", "Alarm is already active");
}

Ключевым здесь является FLAG_NO_CREATE, который, как описано в javadoc: if the described PendingIntent **does not** already exists, then simply return null (вместо создания нового)

Ответ 2

Для тех, кому это может понадобиться, вот ответ.

Используйте adb shell dumpsys alarm

Вы можете знать, что будильник был установлен, и когда они будут тревожными и интервальными. Также сколько раз этот сигнал был вызван.

Ответ 3

Рабочий пример с приемником (верхний ответ был только с действием).

//starting
AlarmManager alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getActivity(), MyReceiver.class);
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//my custom string action name
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//used unique ID as 1001
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), aroundInterval, pendingIntent);//first start will start asap

//and stopping
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
PendingIntent pendingIntent = PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_CANCEL_CURRENT);//the same as up
alarmManager.cancel(pendingIntent);//important
pendingIntent.cancel();//important

//checking if alram is working with pendingIntent
Intent intent = new Intent(getActivity(), MyReceiver.class);//the same as up
intent.setAction(MyReceiver.ACTION_ALARM_RECEIVER);//the same as up
boolean isWorking = (PendingIntent.getBroadcast(getActivity(), 1001, intent, PendingIntent.FLAG_NO_CREATE) != null);//just changed the flag
Log.d(TAG, "alarm is " + (isWorking ? "" : "not") + " working...");

Я также описал свой blog

Ответ 4

Обратите внимание на эту цитату из документации для диспетчера аварийных сигналов:

Если для этого запланированного намерения уже есть сигнал тревоги (с равенство двух намерений определяется Intent.filterEquals), то это будет удалена и заменена этим.

Не беспокойтесь, спрашивайте, существует ли будильник, если вы пытаетесь решить, создавать ли будильник или нет. Просто создавайте его каждый раз, когда ваше приложение загружается. Вы замените все прошлые аварийные сигналы, которые вы настроили.

Вам нужен другой подход, если вы пытаетесь рассчитать, сколько времени осталось для ранее созданного аварийного сигнала, или вам действительно нужно знать, существует ли такая сигнализация. Чтобы ответить на эти вопросы, подумайте об экономии общих данных pref во время создания тревоги. Вы можете сохранить временную метку часов в тот момент, когда была установлена ​​тревога, время, в течение которого вы ожидаете, что будильник погаснет, и период повторения (если вы настроите повторяющийся сигнал).

Ответ 5

У меня есть 2 сигнала тревоги. Я использую намерение с дополнительными функциями вместо действия, чтобы идентифицировать события:

Intent i = new Intent(context, AppReciever.class);
i.putExtra("timer", "timer1");

дело в том, что с diff extras намерение (и будильник) не будет уникальным. Таким образом, чтобы определить, какой сигнал тревоги активен или нет, мне пришлось определить diff requestCode -s:

boolean alarmUp = (PendingIntent.getBroadcast(context, MyApp.TIMER_1, i, 
                    PendingIntent.FLAG_NO_CREATE) != null);

и вот как был создан сигнал тревоги:

public static final int TIMER_1 = 1;
public static final int TIMER_2 = 2;

PendingIntent pending = PendingIntent.getBroadcast(context, TIMER_1, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);
pending = PendingIntent.getBroadcast(context, TIMER_2, i,
            PendingIntent.FLAG_CANCEL_CURRENT);
setInexactRepeating(AlarmManager.RTC_WAKEUP,
            cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pending);

Ответ 6

Просто нашел другое решение, похоже, работает для меня

Intent myIntent = new Intent(MainActivity.this, MyReceiver.class);

boolean isWorking = (PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_NO_CREATE) != null);
if (isWorking) {Log.d("alarm", "is working");} else {Log.d("alarm", "is not working");}

if(!isWorking) {
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent,    PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    int timeNotif = 5 * 60 * 1000;//time in ms, 7*24*60*60*1000 for 1 week
    Log.d("Notif", "Notification every (ms): " + timeNotif);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), timeNotif, pendingIntent);
    }

Ответ 7

Я сделал простой (глупый или нет) bash script, который извлекает длинные строки из оболочки adb, преобразует их в метки времени и показывает их красным цветом.

echo "Please set a search filter"
read search

adb shell dumpsys alarm | grep $search | (while read i; do echo $i; _DT=$(echo $i | grep -Eo 'when\s+([0-9]{10})' | tr -d '[[:alpha:][:space:]]'); if [ $_DT ]; then echo -e "\e[31m$(date -d @$_DT)\e[0m"; fi; done;)

попробуйте это;)

Ответ 8

    Intent intent = new Intent("com.my.package.MY_UNIQUE_ACTION");
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    sqlitewraper.context, 0, intent,
                    PendingIntent.FLAG_NO_CREATE);

FLAG_NO_CREATE не создает ожидающее намерение, так что он дает логическое значение false.

            boolean alarmUp = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_NO_CREATE) != null);

            if (alarmUp) {
                System.out.print("k");

            }

            AlarmManager alarmManager = (AlarmManager) sqlitewraper.context
                    .getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(), 1000 * 60, pendingIntent);

После того, как AlarmManager проверит значение Pending Intent, он выдаст true, потому что AlarmManager обновляет флаг ожидающего намерения.

            boolean alarmUp1 = (PendingIntent.getBroadcast(sqlitewraper.context, 0,
                    new Intent("com.my.package.MY_UNIQUE_ACTION"),
                    PendingIntent.FLAG_UPDATE_CURRENT) != null);
            if (alarmUp1) {
                System.out.print("k");

            }

Ответ 9

Im под впечатлением, что theres не способ сделать это, было бы неплохо, хотя.

Вы можете добиться аналогичного результата, записав где-то Alarm_last_set_time, и иметь вид On_boot_starter BroadcastReciever: BOOT_COMPLETED.