ForegroundService
を使用して位置情報の更新をサーバーに送信するアプリケーションがあります。基本的にトラッカー。
これForegroundService
には、 ( postDelayedHandler
を使用して) 定期的にコード ブロックを実行して位置情報を送信する があります。
これは、アプリがフォアグラウンドにあり、バックグラウンドにある場合でも完全に正常に機能しますが、電話がロックされ、画面が約 15 分間オフになっていると、遅延に気付き始めました。つまり、ユーザーの操作がなく、充電器が接続されていない状態が 15 分間続くということです。
これは、Android Q (v10)デバイスで発生しています。これは、Oreo 以降を実行しているすべてのデバイスでも発生すると想定しています。
明確にしましょう...私のアプリは30秒ごとに場所を送信しますが、DozeModeまたはAppStandByModeであると思われるものを入力すると、場所を送信し続けますが、2分ごと(多かれ少なかれ)です。画面をオンにするか、充電器を差し込むと、すぐに 30 秒のペースに戻ります。それが、DozeModeまたはAppStandByModeについて私が気にする理由です。さらに、充電器を差し込んだまま電話をそのままにしておくと、これは決して起こりません.
前述のように、DozeModeまたはAppStandByModeが作動していることは確かであり、それを防ぐためにアプリをホワイトリストに登録できることはわかっています。しかし、さらに先に進む前に、アプリの動作をテストするたびに 15 分間待たずにこれを再現したいと考えています。
だから私はこれを強制する方法を「ググって」、ここに私が見つけたものがあります:
用DozeMode
(ソースを参照)
adb shell dumpsys バッテリーの取り外し
adb shell dumpsys deviceidle step deep
そして、 IDLE状態になるまで最後のコマンドを実行し続けます。
用AppStandByeMode
(ソースを参照)
adb shell dumpsys バッテリーの取り外し
adb shell am set-inactive packageName true
そして、この別のコマンドで状態を照会します。
adb shell am get-inactive packageName
Idle = trueを返すことを確認しました
また、この他のブログが示唆するように、以下を発行しています。
adb shell dumpsys deviceidle 強制アイドル
私はこのモードに入っていなかったのですが、今はそうなっているようで、抜け出せません... アップデートを参照してください
アップデート
最初は DozeMode に入っていないと思っていました...今は入っていることを確認できますが、常にすぐにトリガーされます。(もう15分待つ必要はありません)
電話をロックして画面がオフになると、自動的に居眠りモードになり、位置情報の更新間隔が開始されます。充電器を差し込んで、30 秒後にもう一度送信します。
私は試しました:
adb shell dumpsys deviceidle unforce
adb shell dumpsys deviceidle 無効化
adb shell dumpsys バッテリーリセット
それでも同じです。
また:
- 電話の電源を落として電源を入れる
- アプリをアンインストールする
- アプリの設定内でバッテリーの最適化を NOT OPTIMZE に変更します
私はステップを逃しましたか?