フォアグラウンド サービスのタイムアウト

Android 15 以降をターゲットとするアプリの場合、アプリがバックグラウンドにあるときに特定のフォアグラウンド サービスの実行が許可される時間に制限が適用されます。現在、この制限は dataSync と mediaProcessing フォアグラウンド サービス タイプのフォアグラウンド サービスにのみ適用されます。shortService フォアグラウンド サービス タイプには、より厳しい制限があります。詳しくは、そのサービスタイプのドキュメントをご覧ください。

タイムアウトの動作

システムは、dataSync フォアグラウンド サービスと mediaProcessing フォアグラウンド サービスを 24 時間以内に合計 6 時間実行することを許可します。その後、システムは実行中のサービスの Service.onTimeout(int, int) メソッド(Android 15 で導入)を呼び出します。(mediaProcessing フォアグラウンド サービス タイプは Android 15 で追加されました)。6 時間の制限時間は、dataSync サービスと mediaProcessing サービスで個別に追跡されます。たとえば、dataSync サービスが 1 時間実行された場合、アプリは dataSync フォアグラウンド サービスを 5 時間しか使用できませんが、mediaProcessing サービスは 6 時間すべて使用できます。

フォアグラウンド サービスが 6 時間の上限に達すると、サービスは数秒以内に Service.stopSelf() を呼び出す必要があります。システムが Service.onTimeout() を呼び出すと、サービスはフォアグラウンド サービスとみなされなくなります。サービスが Service.stopSelf() を呼び出さない場合、システムは内部例外をスローします。例外は Logcat に次のメッセージとともに記録されます。

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

この動作変更による問題を回避するには、次のいずれかを行います。

  1. サービスに新しい Service.onTimeout(int, int) メソッドを実装させます。アプリがコールバックを受信したら、数秒以内に stopSelf() を呼び出すようにしてください。(アプリをすぐに停止しないと、システムでエラーが発生します)。
  2. アプリの dataSync サービスと mediaProcessing サービスが、24 時間の間に合計 6 時間を超えて実行されないようにします(ユーザーがアプリを操作してタイマーをリセットした場合を除く)。
  3. dataSync または mediaProcessing フォアグラウンド サービスは、ユーザーが直接操作した結果としてのみ開始します。サービスが開始されるとアプリはフォアグラウンドになるため、アプリがバックグラウンドに移行してから 6 時間はサービスが継続されます。
  4. これらのフォアグラウンド サービスを使用する代わりに、WorkManager などの代替 API を使用します。特に、dataSync フォアグラウンド サービスを使用する代わりに、代替 API の使用を検討してください。

アプリの dataSync フォアグラウンド サービスが過去 24 時間に 6 時間実行された場合、ユーザーがアプリをフォアグラウンドに移動しない限り(タイマーがリセットされます)、別の dataSync フォアグラウンド サービスを開始することはできません。別の dataSync フォアグラウンド サービスを開始しようとすると、システムは ForegroundServiceStartNotAllowedException をスローし、「フォアグラウンド サービス タイプ dataSync の制限時間がすでに切れています」のようなエラー メッセージが表示されます。

テスト

アプリの動作をテストするには、アプリが Android 15 をターゲットとしていなくても、データ同期のタイムアウトを有効にできます(アプリが Android 15 デバイスで実行されている場合)。タイムアウトを有効にするには、次の adb コマンドを実行します。

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

タイムアウト期間を調整して、上限に達したときのアプリの動作を簡単にテストすることもできます。dataSync フォアグラウンド サービスに新しいタイムアウト期間を設定するには、次の adb コマンドを実行します。

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

mediaProcessing フォアグラウンド サービスの新しいタイムアウト期間を設定するには、次のコマンドを実行します。

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds