Broadcast Receiverとは:Broadcastの種類と動作原理

著者: IT Sectr 公開日: 2026-06-17 読了時間: 7 分

Broadcast Receiverは、ネットワーク状態の変化、バッテリーレベル、SMS受信、アプリインストールなどのシステムBroadcastメッセージをリッスンして処理するAndroidコンポーネントです。イベント発生時にオペレーティングシステムによって起動され、メインスレッドまたはバックグラウンドサービスを介してタスクを実行します。Android Developer Guide, 2026によると、Broadcast Receiverを使用すると、アプリケーションが実行されていない場合でもグローバルなシステムイベントに反応できるため、Androidエコシステムにおけるバックグラウンドイベント処理の主要なメカニズムとなっています。

重要なポイント

  • Broadcast Receiverは、システムおよびカスタムBroadcastメッセージを非同期処理するためのAndroidコンポーネントです。
  • Ordered Broadcastは優先度に従って順次配信され、任意のレシーバーによって中断される可能性があります。
  • Normal Broadcastはすべてのサブスクライバーに同時に配信されます—処理順序は保証されません。
  • 登録は静的(マニフェスト内)または動的(コード内でregisterReceiverを使用)のいずれかです。
  • 制限 Android 8+では、多くの暗黙的Broadcastに対する静的登録が禁止され、バックグラウンド負荷が軽減されます。

Broadcast Receiverとは?

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のBroadcastの種類

Androidは2つの主要なBroadcastタイプをサポートしています:Normal BroadcastとOrdered Broadcastです。違いは配信順序と処理チェーンを中断する能力にあります。さらに、Broadcastはシステム(OSによって生成)とカスタム(アプリケーションによって作成)に分類されます。

Normal Broadcast

Normal Broadcastは、順序が保証されずにすべての登録レシーバーに非同期で配信されます。システムはこれらのBroadcastを並行して処理できます—各レシーバーは独自のスレッドでIntentを受け取ります。Normal BroadcastでabortBroadcastを呼び出しても効果はありません:他のレシーバーへの配信をキャンセルできません。

Ordered Broadcast

Ordered Broadcastは順次配信されます—各レシーバーにandroid:priority属性の降順(0〜999)で送られます。処理後、レシーバーはsetResultExtrasを介して次のレシーバーに結果を渡すか、abortBroadcastを呼び出してチェーンを中断できます。これは処理順序が重要なシナリオ(SMSレシーバーなど)で使用されます。

システムBroadcast

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の登録

Broadcast Receiverは2つの方法で登録できます:静的にAndroidManifest.xmlを介して、または動的にコード内でregisterReceiverを介して。選択はシナリオに依存します:静的登録はアプリケーションが実行されていない場合でも機能しますが、動的登録は登録コンポーネントがアクティブな間のみ機能します。

静的登録

静的登録は、マニフェスト内の<receiver>タグで<application>内に宣言されます。各レシーバーに対して、ハンドラークラスとインターセプトするアクションを含むIntentフィルターが指定されます。システムは、アプリケーションが実行されていない場合でも、Broadcast発生時にこれらのレシーバーをロードします。

xml
<!-- 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以降の制限

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の代替

以前はBroadcast Receiverで処理されていたバックグラウンドタスクには、AndroidはWorkManager(実行保証付きの遅延タスク)、JobScheduler(デバイス状態を考慮した定期的タスク)、NotificationListenerService(通知監視)を推奨しています。これらのコンポーネントはAndroid 8の制限なしで動作し、電力消費に最適化されています。

KotlinでのBroadcast Receiverの例

ネットワーク接続を追跡するBroadcast Receiverを作成しましょう。レシーバーはCONNECTIVITY_ACTION Broadcastをキャプチャし、接続タイプをログに記録します。Android 8+の場合は、静的登録から除外された暗黙的Broadcastであるため、動的に登録します。

kotlin
// ネットワーク状態追跡用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で登録を解除します。

よくある質問

AndroidのBroadcast Receiverとは?

Broadcast Receiverは、システムおよびカスタムBroadcastメッセージを処理するためのAndroidコンポーネントです。onReceiveメソッドでIntentを受信し、メインスレッドで実行され、10秒以内に完了する必要があります。長時間のタスクにはWorkManagerまたはJobSchedulerを使用してください。

Normal BroadcastとOrdered Broadcastの違いは?

Normal Broadcastはすべてのレシーバーに非同期かつ並行して配信されます—順序は保証されず、abortBroadcastも機能しません。Ordered Broadcastは優先度順に順次配信され、各レシーバーがチェーンを中断したり、setResultExtrasを介して次のレシーバーにデータを渡したりできます。

静的登録と動的登録の違いは?

静的登録(マニフェスト内)は、アプリケーションが実行されていない場合でもレシーバーが機能することを可能にします。動的登録(registerReceiver経由)は、登録コンポーネントがアクティブな間のみ機能します。Android 8以降、多くの暗黙的Broadcastには動的登録が必要です。

Android 8でBroadcast Receiverに導入された制限は?

Android 8(API 26)は、CONNECTIVITY_ACTIONやACTION_BATTERY_LOWなどのほとんどの暗黙的Broadcastに対する静的登録を禁止しました。例外にはBOOT_COMPLETED、Alarm、時刻などが含まれます。バックグラウンドタスクには、Broadcastの代わりにWorkManagerを使用してください。

Broadcast ReceiverからActivityにデータを渡すには?

LiveData、StateFlow、EventBus、またはLocalBroadcastManagerを使用して、onReceiveからUIにデータを渡します。onReceiveから直接UIを更新しようとしないでください—メインスレッドで実行されますが、レシーバーはActivityが表示可能であることを保証しません。LocalBroadcastManagerは内部通信のための非推奨のオプションです。

まとめ

  • Broadcast Receiverは、OSや他のアプリケーションからのIntentメッセージを介してグローバルイベントを受信および処理するためのシステムAndroidコンポーネントです。
  • Normal Broadcastは順序保証なしで並行配信されます。Ordered Broadcastはチェーンを中断可能で優先度順に順次配信されます。
  • マニフェストでの静的登録はまだ実行されていないプロセスでも機能しますが、Android 8+ではほとんどの暗黙的Broadcastで制限されています。
  • registerReceiverを介した動的登録では、メモリリークを防ぐためにunregisterReceiverの呼び出しが必須です。
  • システムBroadcastにはBOOT_COMPLETED、CONNECTIVITY_ACTION、BATTERY_LOWが含まれ—各IntentのExtrasに追加データが含まれています。
  • onReceiveの実行時間は10秒に制限されています—長時間のタスクには、レシーバーからWorkManagerまたはJobSchedulerを起動してください。
  • Android 8+でのBroadcast Receiverの代替:バックグラウンドタスクにはWorkManager、定期的タスクにはJobScheduler、通知監視にはNotificationListenerService。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください