アラームを適切に設定し、アラームをキャンセルおよび再スケジュールするメカニズムを理解することに苦労しています。
デバイスでスケジュールされたすべてのアラームを取得するadbコマンドがあることがわかりましたが、出力の形式を説明するドキュメントは見つかりませんでした。
私はここで多くの説明を求めていることを理解していますので、誰かが「adb Shell dumpsys alarm」についての詳細な説明を含むリンクを投げたら、本当に感謝しています。
そこで、質問は次のとおりです。
保留中のアラームバッチ:23
a。 「23」は現在アクティブなスケジュール済みアラームの数ですか?
バッチ{4293d3a8 num = 1 start = 1369361 end = 1407261}:
RTC#0:アラーム{4293d358タイプ1 com.Android.chrome}
type = 1 whenElapsed = 1369361 when = + 19s304ms window = -1 repeatInterval = 0 count = 0
operation = PendingIntent {429e4500:PendingIntentRecord {429dbbc8 com.Android.chrome broadcastIntent}}
a。 「num = 1」、「start = 1369361」、「end = 1407261」とは何ですか?
b。 「RTC」はRTCアラームを表します。
c。 「#0」とは何ですか?
d。 「タイプ= 1」とはどういう意味ですか?
e。 「when = + 19s304ms」は、アラームが19秒でトリガーされることを意味しますか?
f。 「window = -1」とはどういう意味ですか?
g。 「repeatInterval = 0」は、これが非繰り返しアラームであることを意味していますか?
h。 「count = 0」は、電話のスリープ状態が原因でこのアラームが延期されなかったことを意味しますか?
私。 「operation = PendingIntent {...}」は保留中のインテントを表し、アラームによってトリガーされます。
ブロードキャスト参照カウント:0
a。これは何ですか?
上位アラーム:
a。これは何ですか?
+ 47s271ms実行、0ウェイクアップ、2アラーム:com.username.weatherinfo
act = com.username.receivers.CyclicWeatherUpdater.WEATHER_UPDATE_ACTION
cmp = {com.username.weatherinfo/com.username.receivers.CyclicWeatherUpdater}
a。 「+ 47s271ms」は、このアラームが47秒でトリガーされることを意味しますか?
b。 「0ウェイクアップ」とは何ですか-アラームはトリガーされませんでしたか?
c。 「2アラーム」とは何ですか?
d。 'com.username.weatherinfo'は、コンテキストフィールドの保留中の意図に与えられたパッケージの名前を表しますか?
e。 「行為」とは、意図的に送られた行為を意味しますか?
f。 「cmp」とは何ですか?パッケージ名とクラス名から構成されていることがわかりますが、どこから取得されますか?インテントコンストラクターから? g。アラームの一部に「act」または「cmp」のみがあるのはなぜですか? 「cmp」フィールドのないアラームは、暗黙的なブロードキャストインテント用であると想定しています。それでも、「act」フィールドのないアラームがあるのはなぜですか?
アラーム統計:
a。これは何ですか?
私はこのスレッドが古いことを知っていますが、答えは簡単に見つけられず、役に立つかもしれません。私はこれらのメッセージが何を意味するのかをかなりの時間を費やしてきました。
_Pending alarm batches: 23
_
アラームはバッチに編成されます。 ドキュメントに記載されているとおり :
API 19以降、このメソッドに渡されるトリガー時間は不正確なものとして扱われます。アラームはこの時間より前には配信されませんが、しばらくして遅延して配信される場合があります。 OSはこのポリシーを使用して、システム全体で "batch"アラームを一緒に使用し、デバイスが「ウェイクアップ」する必要がある回数を最小限に抑えます。バッテリーの使用を最小限に抑えます。一般的に、近い将来にスケジュールされたアラームは、遠い将来にスケジュールされたアラームである限り、延期されません。
バッチごとに複数のアラームが存在する場合があります。この場合、23のアラームバッチがあります。これは、おそらく23を超えるアラームがスケジュールされていることを意味します。 _dumpsys alarm
_出力では、各バッチを説明する行は次のようになります。
_Batch{4293d3a8 num=1 start=1369361 end=1407261}:
_
その中で:
4293d3a8
_は、バッチに関連付けられた内部IDです。num=1
_は、このバッチ内のアラームの数です。この場合、バッチにはアラームが1つしかありません。start
およびend
の数値は、システムが最後にリブートされてから経過したミリ秒数を この投稿で説明 で表し、おおよその時間枠も表しますバッチ内のアラームがトリガーされます。各アラームは、次のような3行で記述されます。
_RTC #0: Alarm{4293d358 type 1 com.Android.chrome}
type=1 whenElapsed=1369361 when=+19s304ms window=-1 repeatInterval=0 count=0
operation=PendingIntent{429e4500: PendingIntentRecord{429dbbc8 com.Android.chrome broadcastIntent}}
_
その中で:
RTC_WAKEUP
_、RTC
、_ELAPSED_WAKEUP
_、またはELAPSED
のいずれかで、アラームのtype
を表し、整数値0- 3、それぞれ#0
_はバッチ内のアラームの番号です。番号は0から_n-1
_になります。ここで、n
はバッチ内のアラームの数です。アラームが他のアラームとバッチ処理される場合、将来最も遠い「when =」は、バッチ内の時間allアラームを定義します。4293d358
_は、アラームに関連付けられた内部ID番号ですcom.Android.chrome
_は、アラームを設定したクラスのパッケージ名ですtype=1
_、アラームのタイプ、上記の最初の箇条書きを参照whenElapsed=1369361
_は、システムが起動してからこのアラームがトリガーされるまでのミリ秒数を示します(概算)when=+19s304ms
_は、_dumpsys alarm
_が呼び出された時点から304ミリ秒で19秒間にアラームがトリガーされることを意味します。同様に、_+2d13h29m03s882ms
_のような値は、2日、13時間、29分などの相対的な時間を指します...window=
_は、アラームがバッチ処理される方法に関係する2つの内部定数のいずれかを指します。 _AlarmManager.WINDOW_EXACT=0
_およびsetExact()
またはsetAlarmClock()
でアラームがスケジュールされるときに設定されます。 _AlarmManager.WINDOW_HEURISTIC=-1
_およびsetInexactRepeating()
でアラームがスケジュールされたときに設定されます。それ以外の場合、値はAPIバージョンによって決定されます。 API <19(KitKat)の場合、_WINDOW_EXACT
_が使用され、API> = 19の場合、_WINDOW_HEURISTIC
_が使用されます。 (私は _AlarmManager.Java
_ソースコードを調べる でこれを理解する必要がありました。)repeatInterval=900000
_は、アラームが繰り返される頻度です。 900000msまたは15分ごと。値0は、アラームが繰り返されないことを意味します。count=
_は、アラームshouldがトリガーされた回数を指しますが、 は何らかの理由でではありませんでした。ここでは0が適切な数値です。 > 0は、何らかの理由でアラームがスキップされたことを意味します。operation=PendingIntent{...}
_は、アラームによってトリガーされる PendingIntent
への参照です。 PendingIntent
がgetService
、getBroadcast
、getActivity
、またはgetActivities
を使用してインスタンス化されたかどうかに応じて、アラームはサービスを開始、ブロードキャストを送信、または開始します1つ以上のアクティビティ。これとこの後の他の出力項目について調べるには、 _AlarmManagerService.Java
_ソースコードを掘り下げなければなりませんでした 。
一部のアラームが機能するためには、デバイスを起動する必要があり、必要なブロードキャストがすべて送信されるまでスリープ状態に戻らないでください。内部変数mBroadcastRefCount
は0で初期化され、送信されるブロードキャストがキューに入れられると増分されます。各ブロードキャストが送信されるとデクリメントされ、0に戻るとwakeLock
が解放され、デバイスがスリープ状態に戻ることは問題ありません。
_Broadcast Ref Count: 0
_は、単に_dumpsys alarm
_が実行された時点で、ブロードキャストを送信している最中でなかったことを意味します。
これは、アラームコードが実行された総計時間で降順にランク付けされた上位10個のアラームです。これを使用して、システムリソースを最も消費しているアラームを見つけることができます。バッテリ寿命を消耗させる原因となる可能性のあるプロセスを見つけます。
このセクションには、システムが最後に再起動されてから実行されたすべてのアラームの統計が表示されます。ここで、過去に設定したアラームがトリガーされたかどうか、電話が起動したかどうかなどを確認できます。これらのエントリの形式については、次に説明します。
アラーム統計エントリは次のようになります。
_com.example.someapp +1s857ms running, 0 wakeups:
+1s817ms 0 wakes 83 alarms: cmp={com.example.someapp/com.example.someapp.someservice}
+40ms 0 wakes 1 alarms: cmp={com.example.someapp/com.example.someapp.someotherservice}
_
最初の行の場所:
com.example.someapp
_は、アラームをトリガーしたプロセスのパッケージ名です+1s857ms running
_は、プロセスによって消費される合計システム時間です0 wakeups
_は、これらのアラームのいずれかによってデバイスが起動された回数ですそして、その後の各行は、設定されたアラームの1つを参照します。
+1s817ms
_は消費された合計システム時間です0 wakes
_は、デバイスをウェイクアップする必要があった回数です83 alarms
_は、アラームがトリガーされた回数です。これは、アラームを繰り返す場合にのみ> 1になりますcmp={...}
_アラームがトリガーされたときに開始されたサービスまたは、アラームがブロードキャストをトリガーした場合、エントリは次のようになります。
_Android +4m51s566ms running, 281 wakeups:
+2m46s583ms 0 wakes 1224 alarms: act=Android.intent.action.TIME_TICK
+1m25s624ms 89 wakes 89 alarms: act=Android.content.syncmanager.SYNC_ALARM
+52s898ms 0 wakes 41 alarms: act=com.Android.server.action.NETWORK_STATS_POLL
...
_
で:
act=...
_はブロードキャストされた意図の名前ですアラームには_cmp={...}
_と_act=...
_の両方のエントリを含めることができます。つまり、アラームはインテントをブロードキャストし、サービスを開始します。
デバッグAndroid _adb Shell dumpsys alarm
_の出力を使用したアラームは注意が必要な場合があり、dumpsys
メッセージが完全に説明されている中心的な場所はありません。一緒にバッチ処理され、必要なときにサービスやアクティビティを正確にトリガーすることが困難な場合があります。これは、アラームをデバッグしようとする人々にとって役立つリファレンスになることを願っています。
アラームにも苦労した人として、ここに2つのヒントがあります。
シェル出力のデバッグ:
負の時間または巨大な時間(例:-2hr57m20s311ms、14d5hr23m07s500ms)が表示されたのは、クロックのタイプを混同したためです(例RTC with ELAPSED)。これはドキュメントで明らかです。 "RTC_WAKEUP: Alarm time in System.currentTimeMillis()
" https://developer.Android.com/reference/Android/app/AlarmManager.html#RTC_WAKEUP
アラームをリアルタイムで(作成後)キャンセルします。キャンセルを使用します。保留中のインテントをスケジュールした場合、alarmManager.cancel(pendingIntent)
とpendingIntent.cancel()
の両方が必要です。
Morphaticの答えはあなたが知る必要があるすべてですが、GUIのオープンソースプロジェクトを作成して、同じ情報を視覚的に表示しました。そもそも私にとってはそうだったからです。