Что такое «тег» в результате «аварийного сигнала adb shell dumpsys»?

#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)
  

тег — строка, описывающая аварийный сигнал, используемая для регистрации и использования батареи
атрибуция

https://developer.android.com/reference/android/app/AlarmManager#set (int, long, java.lang.Строка, android.app.AlarmManager.OnAlarmListener, android.os.Handler)

UPD 0:

tag Равно нулю, когда вы передаете PendingIntent экземпляр. В этом случае фреймворк создает сам тег. Чтобы выяснить, как это делается, необходимо провести небольшое исследование:

  1. AlarmManagerService: https://github.com/aosp-mirror/platform_frameworks_base/blob/a4ddee215e41ea232340c14ef92d6e9f290e5174/services/core/java/com/android/server/AlarmManagerService.java#L3646

  2. PendingIntent: https://github.com/aosp-mirror/platform_frameworks_base/blob/a4ddee215e41ea232340c14ef92d6e9f290e5174/core/java/android/app/PendingIntent.java#L1146

  3. 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