アプリが 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]"
この動作の変更による問題を回避するには、次のいずれかを行います。
- サービスに新しい
Service.onTimeout(int, int)
メソッドを実装します。アプリがコールバックを受け取ったら、数秒以内にstopSelf()
を呼び出すようにしてください。(アプリをすぐに停止しないと、システムでエラーが発生します)。 - アプリの
dataSync
サービスとmediaProcessing
サービスが、24 時間の間に合計 6 時間を超えて実行されないようにしてください(ユーザーがアプリを操作してタイマーをリセットした場合を除く)。 dataSync
またはmediaProcessing
フォアグラウンド サービスは、ユーザーの直接操作の結果としてのみ開始します。サービスが開始されるときにアプリがフォアグラウンドにあるため、アプリがバックグラウンドに移行してから 6 時間はサービスが継続されます。- これらのフォアグラウンド サービスを使用する代わりに、WorkManager などの代替 API を使用してください。特に、
dataSync
フォアグラウンド サービスを使用する代わりに、代替 API の使用を検討してください。
アプリの dataSync
フォアグラウンド サービスが過去 24 時間に 6 時間実行された場合、ユーザーがアプリをフォアグラウンドに移動しない限り(タイマーがリセットされます)、別の dataSync
フォアグラウンド サービスを開始することはできません。別の dataSync
フォアグラウンド サービスを開始しようとすると、システムは「フォアグラウンド サービス タイプ dataSync の時間制限がすでに超過しています」のようなエラー メッセージとともに ForegroundServiceStartNotAllowedException
をスローします。
テスト
アプリの動作をテストするには、アプリが 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