[Google I/O 2021 メモ] Effective background tasks on Android

3 min read読了の目安(約2700字

動画

https://youtu.be/IqnCqHyu1E4
  • ユーザーの注意を引こうとするアプリは多く、Play Storeには面白いアプリが増えている
  • 重要なことはすべてのアプリのニーズのバランスを取り、ユーザーエクスペリエンスを高めること

ForegroundServices

  • UIを表示したり、ユーザーが認識できる作業をするのはフォアグラウンド。アプリがバックグラウンドで作業しているときにはユーザーにはわからない。
  • フォアグラウンドサービスはその中間に位置する
  • ナビや音楽再生で通知に気づき、フォアグラウンドとして動作していることを認識する
  • ForegroundServiceを使うべきとき
    • Multitasking
      • 音楽を聞きながらWeb閲覧などの体験を提供
    • Completing a user action
      • ユーザーが開始したタスクを優先して完了させることができる。大きな添付ファイル付きEmailの送信や写真のHDR処理など
  • 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を使ってサーバーから取得することもできる