SysTecevo

AndroidのForeground Serviceとは?service type・権限・起動制限・エラー対処を整理

初回掲載日:
最終更新日:

通知を表示しながら位置情報・音楽・データ転送を行うAndroid Foreground Serviceの図解

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取得
Foreground Service、WorkManager、通常Serviceの使い分けを3つの経路で示すオリジナル図解
「即時性とユーザーへの可視性」「完了保証」「アプリ内だけでよいか」で選びます。

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_PLAYBACKtype固有の実行時権限なし
cameraマルチタスク中のビデオ通話などFOREGROUND_SERVICE_CAMERACAMERA実行時権限。while-in-use制約あり
microphone録音、音声通話FOREGROUND_SERVICE_MICROPHONERECORD_AUDIO実行時権限。while-in-use制約あり
connectedDeviceBluetooth・USB・NFC等との継続通信FOREGROUND_SERVICE_CONNECTED_DEVICE対応する接続権限またはUSB許可など
dataSyncアップロード、ダウンロード、import/exportFOREGROUND_SERVICE_DATA_SYNCAndroid 15対象時は時間制限と代替APIを確認
mediaProcessingメディア変換・トランスコードFOREGROUND_SERVICE_MEDIA_PROCESSINGAndroid 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()の役割

  1. Activityなどの呼び出し側でstartForegroundService()を呼び、Serviceを開始する。
  2. Service側は起動後すぐに通知を作成する。
  3. ServiceCompat.startForeground()を呼び、通知ID、通知、実際に使用するservice typeを渡す。
  4. 処理終了時は通知を外し、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 28target 28以上FOREGROUND_SERVICE権限が必要
Android 10 / API 29target 29以上位置情報を使うFGSでlocation type宣言が必要
Android 11 / API 30target 30以上カメラ・マイク利用時に対応type宣言が必要
Android 12 / API 31target 31以上原則としてバックグラウンドからFGSを開始不可。違反時はForegroundServiceStartNotAllowedException
Android 14 / API 34target 34以上すべてのFGSでtypeとtype固有権限が必要。while-in-use権限も作成時に検査
Android 15 / API 35target 35以上dataSyncと新設mediaProcessingはバックグラウンドで各type合計6時間/24時間。BOOT_COMPLETEDやoverlay例外も厳格化
Android 16 / API 36Android 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などの代替を検討する。

よくあるエラーと直し方

例外・症状主な原因確認する場所
MissingForegroundServiceTypeExceptionManifestにtypeがない、または適切なtypeを宣言していない<service android:foregroundServiceType="...">
SecurityException共通権限・type固有権限・実行時権限・runtime prerequisiteの不足Manifest、権限付与、アプリの可視状態
ForegroundServiceStartNotAllowedExceptionバックグラウンド起動の例外条件を満たしていない、時間上限超過開始元、ライフサイクル、FCM priority、APIレベル
IllegalArgumentExceptionstartForeground()へManifest未宣言のtypeを渡したManifest宣言とtype bitの一致
ForegroundServiceDidNotStartInTimeExceptionService開始後、すぐにstartForeground()しなかったonStartCommand()の先頭付近、重い初期化の順序
timeout後のANR・crashshortServiceや時間制限typeを停止していないonTimeout()、stopForeground()、stopSelf()

起動できない場合の確認順

  1. 用途:Foreground Serviceが本当に必要か、WorkManagerや専用APIで置き換えられないか。
  2. Manifest:Service、foregroundServiceType、FOREGROUND_SERVICE、type固有権限がそろっているか。
  3. 実行時条件:カメラ、マイク、位置情報などの権限が付与され、現在利用可能か。
  4. 開始タイミング:アプリが見えているか、バックグラウンド開始の正式な例外に該当するか。
  5. 昇格:startForegroundService()後すぐに通知を作り、startForeground()しているか。
  6. type一致:実行時に渡すtypeがManifestの宣言内か。
  7. 終了処理:完了、キャンセル、timeoutでServiceと通知を確実に停止しているか。
  8. ログ:stack traceとLogcatの最初の例外、targetSdk、実機APIレベルをセットで確認する。
Manifest、権限、開始タイミング、通知昇格の順でForeground Serviceエラーを確認するオリジナル図解
エラー名だけで決め打ちせず、宣言→権限→開始条件→foreground昇格の順で切り分けます。

実装チェックリスト

  • ユーザーが認識でき、即時継続が必要な処理だけにFGSを使っている
  • 用途に最も具体的なforegroundServiceTypeを選んだ
  • FOREGROUND_SERVICEとtype固有権限をManifestへ追加した
  • 実行時権限とtypeごとのprerequisiteを開始前に満たした
  • ユーザー操作中など、許可されたタイミングでServiceを開始した
  • 開始直後に通知チャネル・通知を準備し、startForeground()した
  • 実行時typeがManifest宣言の範囲内になっている
  • Android 15の時間上限とonTimeout()を考慮した
  • 完了・失敗・キャンセルでstopForeground()とstopSelf()を呼ぶ
  • Google Play ConsoleでForeground Service typeの申告要件を確認した

関連するSysTecevo記事

まとめ

Foreground Serviceは、単なる「落ちにくいService」ではなく、ユーザーに見える継続処理のための制約付きAPIです。最初にWorkManagerや専用APIとの使い分けを決め、次にtype、共通権限、type固有権限、実行時条件をそろえます。Android 12の起動制限、Android 14のtype・権限必須化、Android 15の時間上限を分けて確認すると、例外の原因を絞り込みやすくなります。

公式情報