Foreground Serviceは、ステータスバーに必須の通知を表示し、ユーザーに認識される長時間実行操作を実行するAndroidサービスです。リソースが不足したときにシステムが停止できるBackground Serviceとは異なり、Foreground Serviceは高い優先度を受け取り、メモリが制限された状態でも動作を継続します。Android Developers, 2025のドキュメントによると、Foreground ServiceはAndroid 12以降を実行するデバイスで長時間のタスクを実行するための唯一の信頼できる方法です。
重要なポイント
Foreground Serviceは、ユーザーが認識して確認できる操作を実行するために設計されたAndroidコンポーネントです。通知パネルに永続的な通知を表示し、スワイプして消すことはできません — サービスが実行されている間、アクティブなままです。これが、ユーザーに気付かれずに動作するバックグラウンドサービスとの主な違いです。
AndroidシステムはForeground Serviceを重要なプロセスとして扱います。RAMが不足すると、プラットフォームは最初にBackground Serviceを終了し、次にキャッシュされたActivity、そして例外的な場合にのみForeground Serviceを終了します。OOM KillerはこのようなサービスにADJレベル2を割り当てるため、強制終了は実質的に不可能です。
Foreground Serviceを起動するには、開発者はサービス作成後数秒以内にstartForeground()メソッドを呼び出す必要があります。そうしないと、システムはForegroundServiceDidNotStartInTimeException例外をスローします。これは、宣言されていないバックグラウンドタスクを防ぐために導入されたプラットフォームの厳格な要件です。
Foreground ServiceメカニズムはAndroid 1.0で最初のSDKとともに導入されましたが、必須の通知はAndroid 9(API 28)で登場しました。それ以前は、サービスはユーザーに表示されるインジケーターなしでフォアグラウンドで実行できました。Android 9以降、Googleは要件を厳格化しました:startForegroundを呼び出すアプリケーションは、サービス開始から5秒以内に通知を提供する必要があります。
Android 12(API 31)では、バックグラウンドコンテキストからのForeground Serviceの起動に制限が追加されました — 現在、多くのシナリオでFOREGROUND_SERVICE_SPECIAL_USE権限が必要です。Android 14(API 34)では、マニフェストでのforegroundServiceTypeの必須宣言が導入され、サービスアーキテクチャがより透明で予測可能になりました。
Foreground Serviceの動作メカニズムは、サービス作成、通知のバインド、タスク実行の3つの主要な段階に基づいています。サービスはServiceクラスを継承し、onStartCommand()メソッドをオーバーライドします。このメソッドで、識別子とNotificationオブジェクトを指定してstartForeground()が呼び出されます。
startForeground()を呼び出した後、システムはサービスプロセスを高い生存優先度を持つフォアグラウンドグループに移動します。つまり、AndroidはRAM負荷に関係なくプロセスを実行し続けようとします。Foreground Serviceは通常の状態ではシステムによって停止できません — ユーザーが通知を消去するか、明示的にstopSelf()を呼び出した場合のみです。
Foreground Serviceのライフサイクルは、onCreate()、onStartCommand()、onDestroy()メソッドを通じて管理されます。onStartCommand()で、開発者はプロセスが強制終了された後の再起動戦略を定義します — START_STICKY定数はリソース回復後にシステムにサービスの再作成を強制し、START_NOT_STICKYは自動再起動を防ぎます。
Foreground Serviceが開始されると、startService()の呼び出し、onCreate()でのServiceオブジェクトの作成、onStartCommand()でのIntentの処理、Notificationオブジェクトを使用したstartForeground()の呼び出しが順次実行されます。サービスがすでに実行中で新しいIntentが到着した場合、onStartCommand()のみが再度呼び出されます — onCreate()はサービスの存続期間中に1回だけ実行されます。
Foreground Serviceの停止は、REMOVE_NOTIFICATIONフラグを指定したstopForeground()によって行われ、ステータスバーから通知を非表示にします。通知を削除するとすぐに、システムはサービスをフォアグラウンドと見なさなくなり、その優先度をBackground Serviceに下げる可能性があり、プロセスが終了に対して脆弱になります。
PowerManagerは、Androidの省電力モード(Doze、App Standby)がタスク実行能力を制限する可能性があるため、Foreground Serviceの動作において重要な役割を果たします。フォアグラウンドステータスにある場合でも、サービスはバッテリーポリシーの対象となります — ネットワークリクエストが遅延され、タイマーがDozeウィンドウと同期される可能性があります。遅延に耐性のある長時間の操作には、WorkManagerと組み合わせてForeground Serviceを使用することをお勧めします。
Android 14(API 34)以降、GoogleはマニフェストでのForeground Serviceタイプの必須宣言を導入しました。各タイプは許可された使用シナリオを定義します — システムは宣言されたタイプと実際のサービス動作の間の準拠を検証します。合計9つのタイプがありますが、最も一般的に使用されるものは以下の通りです。
dataSyncタイプは、デバイスとサーバー間のデータ同期、ファイル転送、バックアップ用に設計されています。例としては、クラウドストレージへの写真のアップロード、Firebaseとのデータベース同期、リモートサーバーへのログのアップロードなどがあります。このタイプでは、属性android:foregroundServiceType="dataSync"を使用してマニフェストに正当性を指定する必要があります。
mediaPlaybackタイプは、バックグラウンドでのオーディオおよびビデオ再生に使用されます — ミュージックプレーヤー、ポッドキャストクライアント、ビデオプレーヤーなど。これはユーザーの介入なしに無期限に実行できる唯一のタイプです。通知チャネルは高い優先度を持ち、MediaStyleを介して再生コントロールボタン(再生、一時停止、次へ、前へ)を表示する必要があります。
locationタイプは、位置情報サービス — ナビゲーションアプリ、アクティビティトラッキング、ジオフェンシング — を対象としています。Android 14+では、FOREGROUND_SERVICE_LOCATION権限を宣言し、マニフェストでタイプを指定する必要があります。アプリケーションは実行時にアクティブな位置情報の許可を持っている必要があります。そうしないと、システムはサービスの開始を拒否します。
| タイプ | 権限 | 使用例 |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | クラウドとのファイル同期 |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | バックグラウンドのミュージックプレーヤー |
| location | FOREGROUND_SERVICE_LOCATION | 運転中のGPSナビゲーション |
| camera | FOREGROUND_SERVICE_CAMERA | ビデオ監視アプリケーション |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | BLEデバイスとの連携 |
主な違いは、Foreground ServiceとBackground Serviceの間で、表示可能な通知と生存優先度の有無です。Background Serviceはメモリ不足時にシステムによっていつでも停止される可能性がありますが、Foreground ServiceはAndroidのLow Memory Killerメカニズムにおけるプロセスのadjレベルの向上により実行を継続します。
Background Serviceは通知を必要とせず、ユーザーに気付かれずに実行できます。ただし、Android 8(API 26)以降、Googleはバックグラウンドサービスを大幅に制限しています: バックグラウンドコンテキストからのstartService()は機能しなくなり、フォアグラウンドに移行する予定のサービスを開始するにはContext.startForegroundService()が必須になりました。システムはバックグラウンド実行制限も導入しました — タイマー(現在10分)の後にBackground Serviceは強制的に停止されます。
一方、Foreground Serviceには時間制限がありません。サービスは数時間または数日間実行できます — ユーザーが明示的に停止するか、デバイスを再起動するまで。これにより、Foreground Serviceは継続的なバックグラウンド作業を必要とするアプリケーション(ミュージックプレーヤー、アクティビティトラッカー、VoIP通話アプリ)に最適な選択肢となります。
| パラメータ | Foreground Service | Background Service |
|---|---|---|
| 通知 | 必須 | 不要 |
| 存続時間 | 制限なし | 最大10分(API 26+) |
| システム優先度 | 高(ADJ 2) | 低(ADJ 8+) |
| API 26+起動 | startForegroundService() | バックグラウンドから禁止 |
Android 12(API 31)以降、GoogleはForeground Serviceの起動に重要な制限を導入しました。主な変更点は、ほとんどのサービスタイプについてバックグラウンドコンテキストからのstartForegroundService()の呼び出し禁止です。例外は、ユーザーが明示的に同意した場合(たとえば、FOREGROUND_SERVICE_SPECIAL_USE権限を通じて)またはBOOT_COMPLETEDブロードキャストインテントに応答してサービスが開始される場合のみ適用されます。
API 34+をターゲットとするアプリケーションのマニフェストには、宣言された各サービスにforegroundServiceTypeブロックが含まれている必要があります。たとえば、データ同期サービスの場合はandroid:foregroundServiceType="dataSync"を指定します。タイプが指定されていない場合、システムはサービスを無効と見なし、起動時にMissingForegroundServiceTypeExceptionをスローします。Google Playもタイプの準拠をチェックし、不一致がある場合は公開を拒否する可能性があります。
Android 14(API 34)では、Foreground Serviceの各タイプに個別の権限があります。開発者はマニフェストでそれらを宣言し、サービスを開始する前に実行時に要求する必要があります。dataSyncにはFOREGROUND_SERVICE_DATA_SYNC、mediaPlaybackにはFOREGROUND_SERVICE_MEDIA_PLAYBACKが必要です。ユーザーは設定で権限を取り消すことができ、アクティブなサービスが停止します。
GoogleはAndroid 14でForeground Service通知タイムアウトメカニズムも導入しました: サービスが作成後10秒以内にstartForeground()を呼び出さない場合、システムは例外をスローします。この厳格化は、通知呼び出しを遅延またはスキップし、フォアグラウンドのふりをしてBackground Serviceとして効果的に動作するアプリケーションに対抗することを目的としています。
Foreground Serviceは、バックグラウンドでの確実な実行を必要とする幅広いタスクで使用されます。最も一般的なシナリオには、メディア再生、位置情報追跡、データ同期、周辺機器との連携が含まれます。それぞれを詳しく見てみましょう。
典型的な例は、アプリを最小化した後も再生を続けるミュージックプレーヤーです。サービスはMediaStyle通知とコントロールボタンで開始され、mediaPlaybackタイプを使用します。ユーザーはステータスバーにトラック情報を表示し、アプリを開かずに再生を制御できます。
ナビゲーションアプリは、locationタイプのForeground Serviceを使用して継続的な座標追跡を行います。サービスは現在の速度、移動時間、追跡停止ボタンを含む通知を表示します。Foreground Serviceがないと、システムは数分後にバックグラウンドでの座標受信を停止し、ナビゲーションが不可能になります。
音声およびビデオ通話アプリケーション — VoIPクライアント — は、アクティブな接続を維持するためにForeground Serviceを使用します。phoneCallタイプ(Android 14以降)のサービスは、アプリを最小化しても通話が切断されないことを保証します。通知には通話時間とマイクおよびスピーカーのコントロールが表示されます。
データ同期のためにKotlinでForeground Serviceを作成する方法を見てみましょう。サービスはActivityから起動され、進行状況を示す通知を表示し、完了後に適切に終了します。この例では、マニフェスト宣言、通知チャネル、startForeground()呼び出し、foregroundServiceTypeの処理など、すべての必須要素を示しています。
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"同期",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "データ同期チャネル"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("同期")
.setContentText("サーバーへのデータアップロード")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// 同期のエミュレーション
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Android 12+でサービスを正しく動作させるには、Foreground ServiceをAndroidManifest.xmlでタイプと必要な権限を指定して宣言する必要があります。foregroundServiceType属性はターゲットAPI 34+で必須であり、FOREGROUND_SERVICE_DATA_SYNCとPOST_NOTIFICATIONSの権限は実行時に要求する必要があります。
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
高い信頼性にもかかわらず、Foreground Serviceには制限があります。主なものはユーザーへの可視性です。アプリケーションは通知なしでバックグラウンドで長時間のタスクを実行できず、UXの観点から常に受け入れられるとは限りません。さらに、いくつかのタイプでは時間制限を超えた場合、システムはForeground Serviceでさえ強制的に停止する可能性があります — たとえば、dataSyncは数時間の動作に制限されています。
Foreground Serviceの代替手段としてWorkManagerがあります。これは、遅延タスクおよびバックグラウンドタスク用のAndroid Jetpackライブラリです。WorkManagerはデバイスの再起動後でもタスクの実行を保証し、タスクチェーン、定期的な操作、ネットワークおよびバッテリーの制約をサポートします。ほとんどのバックグラウンド操作では、Googleは直接サービスではなくWorkManagerを推奨しています。
JobSchedulerは、タスクをスケジュールするためのAndroid組み込みAPIです。これは遅延可能な操作に適しています: Wi-Fi同期、充電器接続時のデータダウンロード。JobSchedulerはバッテリー節約のためにタスクをウィンドウにグループ化します。一方、Foreground Serviceは省電力状態に関係なく継続的に実行されます。
短いタスク(最大10〜15秒)には、遅延実行を使用してWorkManagerのCoroutineWorkerを使用できます。タスクを特定の時間に厳密に実行する必要がある場合は、BroadcastReceiverとともにAlarmManagerを使用します。このように、Foreground Serviceは長時間の継続的な操作のためのソリューションであり、すべてのバックグラウンドシナリオのための汎用ツールではありません。
よくある質問
Foreground Serviceは、ステータスバーに永続的な通知を表示し、ユーザーに認識される長時間のタスクを実行するAndroidサービスです。高い生存優先度を持ち、Background Serviceとは異なり、メモリ不足時にシステムによって停止されません。
Foreground Serviceは必須の通知を表示し、時間制限がなく、システムによる終了から保護されています。Background Serviceはユーザーから見えず、最大10分間(API 26+)動作し、いつでもLow Memory Killerによって停止される可能性があります。
Android 14は9つのタイプを定義しています: dataSync、mediaPlayback、location、camera、connectedDevice、phoneCall、microphone、health、remoteMessaging。各タイプには対応する権限と、foregroundServiceType属性を使用したマニフェストでの宣言が必要です。
サービスが作成後10秒以内にstartForeground()を呼び出さない場合(Android 14)、システムはForegroundServiceDidNotStartInTimeException例外をスローし、サービスを強制的に停止します。操作がメインスレッドで実行されている場合、アプリケーションはANR(Application Not Responding)も受け取ります。
いいえ、Foreground Serviceの通知をプログラムで非表示にすることはできません。Android 9(API 28)以降、通知は必須であり、ユーザーがスワイプして消去することはできません。削除する唯一の方法は、stopForeground(REMOVE_NOTIFICATION)とstopSelf()を呼び出してサービスを停止することです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。