👷
[Google I/O 2021 メモ] Effective background tasks on Android
動画
- ユーザーの注意を引こうとするアプリは多く、Play Storeには面白いアプリが増えている
- 重要なことはすべてのアプリのニーズのバランスを取り、ユーザーエクスペリエンスを高めること
ForegroundServices
- UIを表示したり、ユーザーが認識できる作業をするのはフォアグラウンド。アプリがバックグラウンドで作業しているときにはユーザーにはわからない。
- フォアグラウンドサービスはその中間に位置する
- ナビや音楽再生で通知に気づき、フォアグラウンドとして動作していることを認識する
- ForegroundServiceを使うべきとき
- Multitasking
- 音楽を聞きながらWeb閲覧などの体験を提供
- Completing a user action
- ユーザーが開始したタスクを優先して完了させることができる。大きな添付ファイル付きEmailの送信や写真のHDR処理など
- Multitasking
- ForegroundServiceを使うべきでないとき
- 急ぎでないタスク
- ユーザーが意識する必要のないタスク
- 不適切な理由でアプリをメモリに常駐させる
- なぜ上記の場合使うべきでないか
- ユーザーが削除できないならユーザーフレンドリーではない
- 突然StatusBarに通知が現れ何が起こったかわからないうちに消える。気が散る
- 誤って使用すると貴重なリソースを消費する
- OSが競合するタスクの優先順位を決められない
- フォアグラウンドサービスに関する統計
- ユーザーは1日に200〜500のフォアグラウンドサービス通知を受けている
- フォアグラウンドサービスの46%はバックグランドから開始されている
- フォアグラウンドサービスの70%は10秒未満で終わる
- ほとんどのセッションの継続時間が2分未満
- Android12での変更
- バックグラウンドからフォアグラウンドサービスを開始できる状況に制限をつける。targetSdk=31以降。詳しくは後ほど。
- 信頼性のあるバックグラウンドタスクのためのAPI
- 通知の明滅を防ぐため、フォアグラウンドサービスの通知表示を10秒遅延させる
- それまでにサービスが終了したら通知は表示されない
- アプリの設定で、遅延させることもすぐ表示することもできる
- できるだけ早く実行したい短いバックグラウンドタスクのために、優先Job(Expedited Jobs)を導入
- Expedited Jobs
- 低レイテンシのJob
- フォアグラウンドからもバックグラウンドからも呼び出せ、すぐに実行される
- 他のアプリからのJobもあるため、継続時間を数分に制限
- DozeモードやBatterySaverモードでも実行できる→フォアグラウンドサービスと同様
- OSが実行を引き受けるのでStandby Bucketの対象になる→使用頻度の低いアプリでは実行する機会が少なくなる
- WorkManager(バージョン2.7以降)からExpeditedJobsを実行できる
- Expedited Jobsは可能な限りWorkManagerから利用を推奨。OSにバンドルされていないのでアップデートの提供が迅速
Foreground Service Exemptions
- Android12ではフォアグラウンドサービスの制限が増えたが例外もある
- いつForegroundServiceを開始できるか
- アプリが見えているとき
- すでにフォアグラウンドにあるため。Activityの起動制限と同様。アプリがバックグラウンドに移動したあとも実行の継続が可能。
- ユーザーが操作を行ったタイミング
- NotificationやWidgetから
- 特定のシステムbroadcastとcallback
- たとえば、BOOT_COMPLETEDやMY_PACKAGE_REPLACEDからフォアグラウンドサービスを開始できる
- ジオフェンスのコールバックや優先度の高いFCMメッセージからも開始できる
- アプリが見えているとき
UseCases
- ユーザーがUIから起動するBackgroundWork
- ForegroundServiceが適切
- ナビ、音楽プレーヤー、Fitnessトラッカーなど
- メールアプリが大きな添付ファイルを送信する場合
- ForegroundServiceが適切
- 添付ファイルのアップロードとメール送信をバックグランドですぐに行いながら他の作業ができる
-
その他のほとんどのBackgroundWorkにはWorkManagerの使用を推奨
- 急を要し、数分もかからない場合はExpeditedJobが適している
- そうでない場合は通常のJobの使用
- WorkManagerでは優先/通常Jobのスケジューリングや、定期的な作業のスケジューリングを行うことができる
-
Push Notifications
- プッシュ通知はFCMが推奨
- 優先度の高い通知だとDozeモードでもプッシュ通知を受け取れる
- メッセージングアプリでは可能な限りメッセージをFCMペイロードに入れましょう。従量ネットワークを必要以上に使わずバッテリーの節約になる
- ペイロード使用が適さない場合はExpeditedJobを使ってサーバーから取得することもできる
Discussion