Когда мое приложение запускается, я хочу, чтобы оно проверило, установлен ли и работает ли определенный сигнал тревоги (зарегистрированный с помощью AlarmManager). Результаты от Google, кажется, указывают, что нет никакого способа сделать это. Это все еще правильно? Мне нужно сделать эту проверку, чтобы сообщить пользователю, прежде чем предпринимать какие-либо действия для создания нового сигнала тревоги.
231
Ответы:
В продолжение комментария Рона, вот подробное решение. Допустим, вы зарегистрировали повторяющуюся тревогу с таким намерением, как это:
Чтобы проверить, активен ли он, нужно:
Ключ здесь - это,
FLAG_NO_CREATE
как описано в javadoc:if the described PendingIntent **does not** already exists, then simply return null
(вместо создания нового)источник
alarmManager.cancel(pendingIntent)
иpendingIntent.cancel()
для того, чтобы это решение вернуло false.Для тех, кому это может понадобиться, вот ответ.
использование
adb shell dumpsys alarm
Вы можете знать, что будильник был установлен, и когда они будут активированы и интервал. Также, сколько раз эта тревога была вызвана.
источник
adb shell dumpsys alarm | grep <e.g. package name of your app>
также работает на новых системах Windows (я использую Win10)Рабочий пример с получателем (верхний ответ был просто с действием).
Стоит упомянуть:
Короче говоря, ваш PendingIntent должен иметь те же функции (структура операции и намерения), чтобы контролировать его.
источник
Обратите внимание на эту цитату из документов для метода set диспетчера аварийных сигналов:
Если вы знаете, что хотите установить будильник, вам не нужно беспокоиться о том, существует ли он уже или нет. Просто создайте его каждый раз, когда загружается ваше приложение. Вы замените все прошлые тревоги тем же
Intent
.Вам нужен другой подход, если вы пытаетесь подсчитать, сколько времени остается на ранее созданной тревоге, или если вам действительно нужно знать, существует ли такая тревога. Чтобы ответить на эти вопросы, рассмотрите возможность сохранения общих преф данных во время создания будильника. Вы можете сохранить метку времени на момент, когда будильник был установлен, время, которое вы ожидаете, что будильник сработает, и период повторения (если вы устанавливаете повторяющийся будильник).
источник
У меня 2 тревоги. Я использую намерение с дополнениями вместо действия, чтобы идентифицировать события:
Дело в том, что с дополнительными возможностями намерение (и тревога) не будут уникальными. Таким образом, чтобы определить, какая сигнализация активна или нет, мне пришлось определить diff
requestCode
-s:и вот как была создана тревога:
источник
PendingIntent.getService
Просто нашел другое решение, похоже, у меня работает
источник
В то время как почти все здесь дали правильный ответ, никто не объяснил, на каком основании работают аварийные сигналы.
Вы можете узнать больше о
AlarmManager
его работе здесь . Но вот быстрый ответВы видите в
AlarmManager
основном графикиPendingIntent
на какое-то время в будущем. Таким образом, чтобы отменить запланированный будильник, необходимо отменитьPendingIntent
.Всегда помните две вещи при создании
PendingIntent
PendingIntent
Теперь, чтобы проверить, запланирован ли будильник, или отменить будильник, вам просто нужно получить к нему доступ
PendingIntent
. Это можно сделать, если вы используете тот же код запроса и используете,FLAG_NO_CREATE
как показано нижеС
FLAG_NO_CREATE
ним вернется,null
еслиPendingIntent
еще не существует. Если он уже существует, он возвращает ссылку на существующийPendingIntent
источник
Я сделал простой (глупый или нет) сценарий bash, который извлекает long из оболочки adb, конвертирует их в метки времени и показывает их красным.
попытайся ;)
источник
FLAG_NO_CREATE не создает ожидающее намерение, так что оно дает логическое значение false.
После AlarmManager проверьте значение Pending Intent, оно дает значение true, потому что AlarmManager обновляет флаг Pending Intent.
источник
Я нахожусь под впечатлением, что нет никакого способа сделать это, хотя было бы неплохо.
Вы можете достичь аналогичного результата, записав где-нибудь Alarm_last_set_time и имея On_boot_starter BroadcastReciever: BOOT_COMPLETED, что-то вроде.
источник