AndroidのForeground Serviceとは?service type・権限・起動制限・エラー対処を整理
初回掲載日:
最終更新日:
AndroidのForeground Service(フォアグラウンドサービス)は、ユーザーが認識できる継続処理を、通知を表示しながら実行する仕組みです。ただし「長時間動かしたいから使う」だけでは不十分で、用途に合うforegroundServiceType、権限、開始タイミングをそろえないと例外やANRにつながります。
先に結論:ナビゲーション、音楽再生、通話など、ユーザーが今まさに認識していて中断されると困る処理に使います。延期できる同期や再試行が必要な処理はWorkManager、画面内だけで完結する処理は通常の非同期処理を優先し、Foreground Serviceは必要な場合だけ選びます。
この記事で分かること
- Foreground Serviceと通常Service、WorkManagerの使い分け
- 用途に合う
foregroundServiceTypeと必要権限の選び方 - Manifest宣言から
startForeground()までの実装順 - Android 12・14・15で追加された主要な制限
MissingForegroundServiceTypeExceptionやSecurityExceptionの確認順
Foreground Serviceとは
Foreground Serviceは、アプリの画面が見えていない間も継続する、ユーザーにとって明確な処理のためのServiceです。実行中は原則として継続通知を表示し、ユーザーが「何が動いているか」を把握できるようにします。音楽再生、ランニング中の位置記録、通話、接続中デバイスとの通信などが代表例です。
名前に「Foreground」とありますが、Activityが画面前面にあるという意味ではありません。通知を伴う重要な処理として、通常のバックグラウンド処理より高い優先度で扱われるという意味です。それでもプロセスが絶対に終了しない保証ではなく、用途・権限・システム制限への適合が必要です。
Foreground Service・WorkManager・通常Serviceの使い分け
| 選択肢 | 向いている処理 | 開始・継続の特徴 | 代表例 |
|---|---|---|---|
| Foreground Service | 今すぐ開始し、中断がUXを損なうユーザー認識可能な処理 | 継続通知が必要。type・権限・起動制限に従う | ナビ、音楽再生、通話、運動記録 |
| WorkManager | アプリ終了や再起動をまたいでも完了させたい永続的な処理 | 実行条件、再試行、遅延・定期実行を管理できる | ログ送信、定期同期、バックアップ |
| 通常Service | アプリプロセス内でコンポーネントから分離した処理 | バックグラウンド実行制限を受け、永続完了は保証されない | 画面表示中のバインド処理など |
| Coroutine等 | 画面やアプリのライフサイクル内で終わる非同期処理 | プロセス終了後の継続は不要 | DB読み込み、画面用API取得 |
foregroundServiceTypeとは
foregroundServiceTypeは、Foreground Serviceが何のために動くかをAndroidへ宣言する分類です。Android 14(API 34)以降を対象にするアプリでは、すべてのForeground Serviceに適切なtypeを宣言し、基本のFOREGROUND_SERVICEに加えてtype固有権限をManifestへ追加する必要があります。typeによっては、カメラ・位置情報・マイクなどの実行時権限や事前操作も必要です。
代表的なservice typeと必要権限
| type | 主な用途 | type固有権限 | 主な追加条件 |
|---|---|---|---|
location | ナビゲーション、位置共有、運動ルート | FOREGROUND_SERVICE_LOCATION | 位置情報ONとACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATION |
mediaPlayback | 音楽・動画のバックグラウンド再生 | FOREGROUND_SERVICE_MEDIA_PLAYBACK | type固有の実行時権限なし |
camera | マルチタスク中のビデオ通話など | FOREGROUND_SERVICE_CAMERA | CAMERA実行時権限。while-in-use制約あり |
microphone | 録音、音声通話 | FOREGROUND_SERVICE_MICROPHONE | RECORD_AUDIO実行時権限。while-in-use制約あり |
connectedDevice | Bluetooth・USB・NFC等との継続通信 | FOREGROUND_SERVICE_CONNECTED_DEVICE | 対応する接続権限またはUSB許可など |
dataSync | アップロード、ダウンロード、import/export | FOREGROUND_SERVICE_DATA_SYNC | Android 15対象時は時間制限と代替APIを確認 |
mediaProcessing | メディア変換・トランスコード | FOREGROUND_SERVICE_MEDIA_PROCESSING | Android 15で追加。時間制限あり |
shortService | 延期できない短時間の重要処理 | type固有権限なし | 約3分。sticky不可、他のFGSを開始不可 |
このほかにhealth、mediaProjection、phoneCall、remoteMessaging、specialUse、systemExemptedがあります。似た名前で選ばず、公式の各type説明と代替API、Google Playの申告要件まで確認してください。
Manifest宣言の最小例
次は音楽再生の例です。共通権限、type固有権限、Serviceのtypeを3点セットで宣言します。外部アプリから起動させないServiceならandroid:exported="false"にします。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<application ...>
<service
android:name=".PlaybackService"
android:exported="false"
android:foregroundServiceType="mediaPlayback" />
</application>
</manifest>
複数の用途が同時に必要なら、Manifestではcamera|microphoneのように|で宣言します。実行時にstartForeground()へ渡すtypeは、Manifestで宣言した範囲内でなければなりません。
startForegroundService()とstartForeground()の役割
- Activityなどの呼び出し側で
startForegroundService()を呼び、Serviceを開始する。 - Service側は起動後すぐに通知を作成する。
ServiceCompat.startForeground()を呼び、通知ID、通知、実際に使用するservice typeを渡す。- 処理終了時は通知を外し、
stopSelf()でService自体も停止する。
// Activityなど、開始する側
val intent = Intent(this, PlaybackService::class.java)
ContextCompat.startForegroundService(this, intent)
// PlaybackService.onStartCommand()など、Service側
ServiceCompat.startForeground(
this,
NOTIFICATION_ID,
buildPlaybackNotification(),
ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
)
startForegroundService()を呼んだだけではForeground Serviceにはなりません。Serviceが数秒以内にstartForeground()を呼ばないと、ForegroundServiceDidNotStartInTimeExceptionの原因になります。重い初期化より先に通知とforeground昇格を完了させます。
APIレベル別の主な変更点
| Android / API | 対象条件 | 重要な変更 |
|---|---|---|
| Android 9 / API 28 | target 28以上 | FOREGROUND_SERVICE権限が必要 |
| Android 10 / API 29 | target 29以上 | 位置情報を使うFGSでlocation type宣言が必要 |
| Android 11 / API 30 | target 30以上 | カメラ・マイク利用時に対応type宣言が必要 |
| Android 12 / API 31 | target 31以上 | 原則としてバックグラウンドからFGSを開始不可。違反時はForegroundServiceStartNotAllowedException |
| Android 14 / API 34 | target 34以上 | すべてのFGSでtypeとtype固有権限が必要。while-in-use権限も作成時に検査 |
| Android 15 / API 35 | target 35以上 | dataSyncと新設mediaProcessingはバックグラウンドで各type合計6時間/24時間。BOOT_COMPLETEDやoverlay例外も厳格化 |
| Android 16 / API 36 | Android 16上で動作 | FGSから開始したJobScheduler・WorkManager等のJobも実行quotaに従う |
バックグラウンドからの起動制限
Android 12以降を対象にするアプリは、アプリがバックグラウンドにいる状態からForeground Serviceを自由には開始できません。代表的な例外には、ユーザーが通知・ウィジェット・Activityなどを操作した直後、高優先度FCM、ユーザーが要求したexact alarm、位置・アクティビティ遷移などがあります。ただし例外の条件や有効時間を満たさなければ開始できません。
さらにAndroid 14以降では、camera、microphone、locationなどwhile-in-use権限を必要とするtypeに注意が必要です。権限が「許可済み」に見えても、アプリがバックグラウンドなら現在利用可能とは限らず、Service作成時にSecurityExceptionになります。原則として、画面が見えている間のユーザー操作から開始してください。
Android 15以降で特に確認すること
dataSyncとmediaProcessingは、アプリがバックグラウンドにいる間、typeごとに合計6時間/24時間の上限がある。- 上限時は
Service.onTimeout(int, int)が呼ばれるため、数秒以内にstopSelf()する。 dataSync、mediaPlayback、mediaProjection、phoneCallなど、BOOT_COMPLETEDから開始できないtypeを確認する。SYSTEM_ALERT_WINDOWだけを理由にバックグラウンド起動する場合、Android 15以降は可視overlay windowが必要。- 大容量のユーザー開始転送はUser-Initiated Data Transfer Job、延期可能な同期はWorkManagerなどの代替を検討する。
よくあるエラーと直し方
| 例外・症状 | 主な原因 | 確認する場所 |
|---|---|---|
MissingForegroundServiceTypeException | Manifestにtypeがない、または適切なtypeを宣言していない | <service android:foregroundServiceType="..."> |
SecurityException | 共通権限・type固有権限・実行時権限・runtime prerequisiteの不足 | Manifest、権限付与、アプリの可視状態 |
ForegroundServiceStartNotAllowedException | バックグラウンド起動の例外条件を満たしていない、時間上限超過 | 開始元、ライフサイクル、FCM priority、APIレベル |
IllegalArgumentException | startForeground()へManifest未宣言のtypeを渡した | Manifest宣言とtype bitの一致 |
ForegroundServiceDidNotStartInTimeException | Service開始後、すぐにstartForeground()しなかった | onStartCommand()の先頭付近、重い初期化の順序 |
| timeout後のANR・crash | shortServiceや時間制限typeを停止していない | onTimeout()、stopForeground()、stopSelf() |
起動できない場合の確認順
- 用途:Foreground Serviceが本当に必要か、WorkManagerや専用APIで置き換えられないか。
- Manifest:Service、
foregroundServiceType、FOREGROUND_SERVICE、type固有権限がそろっているか。 - 実行時条件:カメラ、マイク、位置情報などの権限が付与され、現在利用可能か。
- 開始タイミング:アプリが見えているか、バックグラウンド開始の正式な例外に該当するか。
- 昇格:
startForegroundService()後すぐに通知を作り、startForeground()しているか。 - type一致:実行時に渡すtypeがManifestの宣言内か。
- 終了処理:完了、キャンセル、timeoutでServiceと通知を確実に停止しているか。
- ログ:stack traceとLogcatの最初の例外、targetSdk、実機APIレベルをセットで確認する。
実装チェックリスト
- ユーザーが認識でき、即時継続が必要な処理だけにFGSを使っている
- 用途に最も具体的な
foregroundServiceTypeを選んだ FOREGROUND_SERVICEとtype固有権限をManifestへ追加した- 実行時権限とtypeごとのprerequisiteを開始前に満たした
- ユーザー操作中など、許可されたタイミングでServiceを開始した
- 開始直後に通知チャネル・通知を準備し、
startForeground()した - 実行時typeがManifest宣言の範囲内になっている
- Android 15の時間上限と
onTimeout()を考慮した - 完了・失敗・キャンセルで
stopForeground()とstopSelf()を呼ぶ - Google Play ConsoleでForeground Service typeの申告要件を確認した
関連するSysTecevo記事
- Google PlayのAPI 36対応が必須に。新規・更新・既存アプリの違いを整理
- Androidの「Cleartext HTTP traffic not permitted」とは?原因・HTTPS移行・Network Security Configの対処法
- AndroidのversionCodeとversionNameの違いは?Google Play更新時の決め方・重複エラーまで解説
まとめ
Foreground Serviceは、単なる「落ちにくいService」ではなく、ユーザーに見える継続処理のための制約付きAPIです。最初にWorkManagerや専用APIとの使い分けを決め、次にtype、共通権限、type固有権限、実行時条件をそろえます。Android 12の起動制限、Android 14のtype・権限必須化、Android 15の時間上限を分けて確認すると、例外の原因を絞り込みやすくなります。
公式情報
- Android Developers: Changes to foreground services
- Android Developers: Declare foreground services and request permissions
- Android Developers: Foreground service types
- Android Developers: Restrictions on starting a foreground service from the background
- Android Developers: Launch a foreground service
- Android Developers: Foreground service timeouts
- Android Developers: Troubleshoot foreground services
- Android Developers: Background tasks overview