#android #alarmmanager
#Android #alarmmanager
Вопрос:
Когда я создаю тревогу, это результат команды «adb shell dumpsys», чтобы получить все сигналы тревоги, установленные моим приложением:
RTC_WAKEUP #0: Alarm{e99208d type 0 when 1598369880862 ir.zima.schema}
operation=PendingIntent{92c0242: PendingIntentRecord{1794253 ir.zima.schema broadcastIntent}}
Когда я использую ту же команду для проверки установленных сигналов другого приложения, я вижу это так:
RTC_WAKEUP #0: Alarm{20eda5f type 0 when 1598297400000 com.mobiliha.badesaba}
tag=*walarm*:com.mobiliha.badesaba/com.mobiliha.receiver.PrayTimeReciver
operation=PendingIntent{b561cac: PendingIntentRecord{96ecd75 com.mobiliha.badesaba broadcastIntent}}
откуда берется эта строка? Для чего он используется?
tag=*walarm*:com.mobiliha.badesaba/com.mobiliha.receiver.PrayTimeReciver
При создании тревог в качестве тега нет аргументов.
alarmManager.setExact(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
Или когда вы устанавливаете такой сигнал тревоги:
public void setExact (int type,
long triggerAtMillis,
String tag,
AlarmManager.OnAlarmListener listener,
Handler targetHandler)
Тег есть, но больше нет PendingIntent.
Я в замешательстве, но результат «аварийного сигнала adb shell dumpsys», который имеет как PendingIntent, так и tag.
Заранее спасибо за любые разъяснения
Обновление Вот как я устанавливаю аварийный сигнал на данный момент:
AlarmManager alarmManager =( AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context//same activity should be used when canceling the alarm
, AlarmReceiver.class);
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setAction("android.intent.action.NOTIFY");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1001,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar time = getTime(hour, minute);//a method that return a calendar Obj
if (Build.VERSION.SDK_INT >= 23){
alarmManager.setExact(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),pendingIntent);
}
else{ alarmManager.set(AlarmManager.RTC_WAKEUP,time.getTimeInMillis(),pendingIntent);
}
Ответ №1:
Вы можете указать тег при использовании AlarmManager#set
метода:
public void set (int type,
long triggerAtMillis,
String tag,
AlarmManager.OnAlarmListener listener,
Handler targetHandler)
тег — строка, описывающая аварийный сигнал, используемая для регистрации и использования батареи
атрибуция
UPD 0:
tag
Равно нулю, когда вы передаете PendingIntent
экземпляр. В этом случае фреймворк создает сам тег. Чтобы выяснить, как это делается, необходимо провести небольшое исследование:
-
AlarmManagerService: https://github.com/aosp-mirror/platform_frameworks_base/blob/a4ddee215e41ea232340c14ef92d6e9f290e5174/services/core/java/com/android/server/AlarmManagerService.java#L3646
-
ActivityManagerService: https://android.googlesource.com/platform/frameworks/base/ /a1f1a3c573acd91024fda0ceb3b921c73b186963/services/core/java/com/android/server/am/ActivityManagerService.java#5550
Как вы можете видеть, окончательный тег создается из действия или компонента намерения.
UPD 1:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
long alarmTime = System.currentTimeMillis() 30 * 1000;
Intent intent = new Intent(this, AlarmReceiver.class);
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setAction("myAlarmAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1001,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManagerCompat.setExact(alarmManager, AlarmManager.RTC_WAKEUP,
alarmTime, pendingIntent);
Вывод:
RTC_WAKEUP #0: Alarm{69a2b91 type 0 when 1598419056411 PendingIntent{d67ec1b: PendingIntentRecord{3759c1 com.sdex.alarmmanager broadcastIntent}}com.sdex.alarmmanager}
tag=*walarm*:myAlarmAction
type=0 wakeup=true expectedWhenElapsed= 3s733ms expectedMaxWhenElapsed= 3s733ms whenElapsed= 3s733ms maxWhenElapsed= 3s733ms when=2020-08-26 08:17:36.411
window=0 repeatInterval=0 count=0 flags=0x1
operation=PendingIntent{d67ec1b: PendingIntentRecord{3759c1 com.sdex.alarmmanager broadcastIntent}}
Комментарии:
1. Я видел это. Но этот не принимает PendingIntent. Результат adb, который я привел в качестве примера в вопросе, имеет как tag, так и PendingIntent. Я ничего не смог найти по этому поводу
2. Кроме того, тот, у которого есть упомянутый вами тег, не работает при закрытии приложения. Но приложение, разделяющее его журнал, работает отлично
3. Спасибо за разработку. Похоже, что в указанной вами ссылке есть тег walarm или alarm , основанный на типе тревоги. Однако, когда я устанавливаю будильник, я не вижу этого тега. У меня также есть действие, установленное для моего намерения. Но в результате команды adb по-прежнему нет тегов
4. Можете ли вы придумать воспроизводимый фрагмент кода, который фактически создает тег в результате команды adb? Я обновлю свой код, чтобы показать вам, как я уже создаю аварийный сигнал.
5. Я вижу тег в выводе dumpsys: tag=* walarm*:myAlarmAction