読者です 読者をやめる 読者になる 読者になる
AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

【Android】App Standbyがわからない

App StatndbyはAndroid 6.0になって追加された省電力の機能である。

Optimizing for Doze and App Standby | Android Developers

アプリが以下の場合でないとき、そのアプリは"Idle"状態になり、"Idle"状態が長時間続くとバックグラウンドでの通信を1日1回しか行うことができなくなる。

  • ユーザがアプリを明示的に起動する
  • アプリのプロセスがフォアグラウンドにある (アクティビティまたはサービスがフォアグラウンドにある、または他のアクティビティやフォアグラウンドサービスからアプリが使わている時)
  • アプリが生成した通知をユーザがロック画面または通知領域で見る

また、端末が充電中の時は"Idle"状態から解放される。

以上である。


全然わからない。


例えば以下のようなことである。


  • "Idle"状態にはどの程度の時間でなるのか
  • 常駐Serivceが動いている場合は"Idle"状態に移らないのか
  • "Idle"状態が何時間続けばバックグラウンド通信を1日1回しかできなくなるのか
  • 1日1回とは1リクエストのことなのか
  • 1日でバックグラウンド通信規制→解放→バックグラウンド通信規制となった場合、2回目の規制は1回目から通信が規制されるのか


この辺りがわからないせいでどうテストを行えばいいのかがさっぱりわからない。 特に気になるのはバックグラウンド通信の規制に入る方法である。 一応GoogleにはApp Standbyをシュミレートする方法が載っているが、肝心のバックグラウンド通信規制にする方法は載っていない。


$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true


テスト終了後に戻す。


$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>  ← falseならOK


アプリが"Idle"状態かどうかはPowerManager#isDeviceIdleMode()で取得できるので、実機にて1時間ごとにAlarmでこの状態をログに出力し、2~3時間放置して様子を見てみたが、常にfalseだった(充電できないし、AlarmがDozeモードで規制されないようにしないといけないのでクソ面倒)。

PowerManager | Android Developers


その他海外含め色々調査してみたが、上記のApp Standbyの条件とGoogleが出しているシュミレート方法を載せている記事がほとんどで、App Standbyの詳細がわかる記事は見つからなかった(もっと探せばあるのかもしれない)。


この辺りをはっきりさせるのなら自分で全部調査するしかないのかな・・・ ただそこまでやる必要は無い気はする。


皆様はどう対応しているんでしょう。。。