Broadcast Receiverは、ネットワーク状態の変化、バッテリーレベル、SMS受信、アプリインストールなどのシステムBroadcastメッセージをリッスンして処理するAndroidコンポーネントです。イベント発生時にオペレーティングシステムによって起動され、メインスレッドまたはバックグラウンドサービスを介してタスクを実行します。Android Developer Guide, 2026によると、Broadcast Receiverを使用すると、アプリケーションが実行されていない場合でもグローバルなシステムイベントに反応できるため、Androidエコシステムにおけるバックグラウンドイベント処理の主要なメカニズムとなっています。
重要なポイント
Broadcast Receiverは、オペレーティングシステムや他のアプリケーションによって配布されるIntentメッセージを受信して処理するために設計されたAndroidコンポーネントです。ActivityやServiceとは異なり、Broadcast Receiverにはユーザーインターフェースがありません—その役割は、イベント発生時に短いアクションを実行することです。
Broadcast ReceiverはIntentメカニズムを介して動作します。システムまたはアプリケーションがsendBroadcastまたはsendOrderedBroadcastを介してIntentを送信し、オペレーティングシステムがそれを登録されたレシーバーに配信します。各レシーバーはonReceiveメソッドでIntentを受信し、これはメインスレッドで実行されます。
Android Compatibility Definition Documentによると、Broadcast Receiverは10秒以内にonReceiveを完了する必要があります—そうしないと、システムはハングしたと見なしてプロセスを終了します。長時間のバックグラウンドタスクには、レシーバーからJobSchedulerまたはWorkManagerを起動してください。
Androidは2つの主要なBroadcastタイプをサポートしています:Normal BroadcastとOrdered Broadcastです。違いは配信順序と処理チェーンを中断する能力にあります。さらに、Broadcastはシステム(OSによって生成)とカスタム(アプリケーションによって作成)に分類されます。
Normal Broadcastは、順序が保証されずにすべての登録レシーバーに非同期で配信されます。システムはこれらのBroadcastを並行して処理できます—各レシーバーは独自のスレッドでIntentを受け取ります。Normal BroadcastでabortBroadcastを呼び出しても効果はありません:他のレシーバーへの配信をキャンセルできません。
Ordered Broadcastは順次配信されます—各レシーバーにandroid:priority属性の降順(0〜999)で送られます。処理後、レシーバーはsetResultExtrasを介して次のレシーバーに結果を渡すか、abortBroadcastを呼び出してチェーンを中断できます。これは処理順序が重要なシナリオ(SMSレシーバーなど)で使用されます。
Androidは多くのシステムBroadcastを生成します:ACTION_BOOT_COMPLETED(デバイス起動)、ACTION_BATTERY_LOW、ACTION_POWER_CONNECTED、CONNECTIVITY_ACTION、ACTION_PACKAGE_ADDEDなど。各IntentにはExtrasに追加データ(バッテリーレベル、接続タイプ、パッケージ名)が含まれています。
| Broadcastタイプ | 順序 | abortBroadcast | パフォーマンス |
|---|---|---|---|
| Normal | 保証なし | 機能しない | 高(並行) |
| Ordered | 優先度順 | 機能する | 中(順次) |
| Sticky | 単一値 | 該当なし | 低(API 21以降非推奨) |
Sticky Broadcastは、最後に送信された値を保持する非推奨のタイプです。代わりに、LiveData、StateFlow、または共有SharedPreferencesを使用して最新の状態を保存してください。
Broadcast Receiverは2つの方法で登録できます:静的にAndroidManifest.xmlを介して、または動的にコード内でregisterReceiverを介して。選択はシナリオに依存します:静的登録はアプリケーションが実行されていない場合でも機能しますが、動的登録は登録コンポーネントがアクティブな間のみ機能します。
静的登録は、マニフェスト内の<receiver>タグで<application>内に宣言されます。各レシーバーに対して、ハンドラークラスとインターセプトするアクションを含むIntentフィルターが指定されます。システムは、アプリケーションが実行されていない場合でも、Broadcast発生時にこれらのレシーバーをロードします。
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
動的登録は、Activity、Service、またはFragmentのコードでregisterReceiverメソッドを使用して実行されます。レシーバーは、それを登録したコンポーネントが生きている間のみ存続します。onPauseまたはonDestroyで必ずunregisterReceiverを呼び出してください—そうしないとメモリリークが発生し、システムがプロセスを終了する可能性があります。
Ordered Broadcastの場合、配信順序はandroid:priority属性によって決定されます。優先度の高いレシーバーが最初にIntentを受け取ります。処理後にabortBroadcastを呼び出すと、優先度の低いレシーバーはIntentを受信しません。静的レシーバーの場合、優先度はマニフェストのIntentフィルターで設定されます。
Ordered Broadcastのレシーバーは、setResultExtrasまたはsetResultDataを介してチェーン内の次のレシーバーにデータを渡せます。これによりパイプライン処理が可能になります:最初のレシーバーがIntentに追加データを付与し、2番目がそれを使用し、3番目がチェーンを完了します。getResultExtrasメソッドは前のレシーバーから渡されたデータを読み取ります。
Normal Broadcastの場合、順序は保証されないため、すべてのレシーバーは変更されていない元のIntentを受け取ります。レシーバーが互いに影響を与える必要がある場合は、sendBroadcastの代わりにsendOrderedBroadcastを使用してください。
Android 8(API 26、Oreo)は、バックグラウンドBroadcastに重要な制限を導入しました。ほとんどの暗黙的Broadcast—特定のアプリケーションに向けられていないもの—は静的登録では機能しなくなりました。システムは、CONNECTIVITY_ACTIONやACTION_BATTERY_LOWなどのアクションに対してマニフェストに登録されたレシーバーをブロックします。
Googleは静的登録で引き続き機能するBroadcastのリストを定めました:BOOT_COMPLETED、TIME_TICK、Alarm、パッケージ変更—合計で約12の例外です。他のすべての暗黙的Broadcastは、アプリがフォアグラウンドにある場合にのみ機能するContext.registerReceiverを介した動的登録が必要になりました。
以前はBroadcast Receiverで処理されていたバックグラウンドタスクには、AndroidはWorkManager(実行保証付きの遅延タスク)、JobScheduler(デバイス状態を考慮した定期的タスク)、NotificationListenerService(通知監視)を推奨しています。これらのコンポーネントはAndroid 8の制限なしで動作し、電力消費に最適化されています。
ネットワーク接続を追跡するBroadcast Receiverを作成しましょう。レシーバーはCONNECTIVITY_ACTION Broadcastをキャプチャし、接続タイプをログに記録します。Android 8+の場合は、静的登録から除外された暗黙的Broadcastであるため、動的に登録します。
// ネットワーク状態追跡用Broadcast Receiver
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "接続タイプ: $connectionType")
}
}
// Activityでの動的登録
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
onStopで必ずレシーバーの登録を解除してください—Activityがバックグラウンドに移行してもレシーバーが登録されたままの場合、システムはリソースを解放できません。Serviceの場合はonDestroyを使用します。フラグメントでは、フラグメントのライフサイクルに従って、onStartでレシーバーを登録し、onStopで登録を解除します。
よくある質問
Broadcast Receiverは、システムおよびカスタムBroadcastメッセージを処理するためのAndroidコンポーネントです。onReceiveメソッドでIntentを受信し、メインスレッドで実行され、10秒以内に完了する必要があります。長時間のタスクにはWorkManagerまたはJobSchedulerを使用してください。
Normal Broadcastはすべてのレシーバーに非同期かつ並行して配信されます—順序は保証されず、abortBroadcastも機能しません。Ordered Broadcastは優先度順に順次配信され、各レシーバーがチェーンを中断したり、setResultExtrasを介して次のレシーバーにデータを渡したりできます。
静的登録(マニフェスト内)は、アプリケーションが実行されていない場合でもレシーバーが機能することを可能にします。動的登録(registerReceiver経由)は、登録コンポーネントがアクティブな間のみ機能します。Android 8以降、多くの暗黙的Broadcastには動的登録が必要です。
Android 8(API 26)は、CONNECTIVITY_ACTIONやACTION_BATTERY_LOWなどのほとんどの暗黙的Broadcastに対する静的登録を禁止しました。例外にはBOOT_COMPLETED、Alarm、時刻などが含まれます。バックグラウンドタスクには、Broadcastの代わりにWorkManagerを使用してください。
LiveData、StateFlow、EventBus、またはLocalBroadcastManagerを使用して、onReceiveからUIにデータを渡します。onReceiveから直接UIを更新しようとしないでください—メインスレッドで実行されますが、レシーバーはActivityが表示可能であることを保証しません。LocalBroadcastManagerは内部通信のための非推奨のオプションです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。