Androidにおけるブロードキャストの基本と実装

ブロードキャストの概要

IPネットワークでは、ブロードキャストアドレスに対して送信されたデータがネットワーク内の全ノードに配信されます。Androidアプリケーションでは、特定のブロードキャストを登録することで、システムや他のアプリケーションからの通知を受信できます。BroadcastReceiverクラスを継承したクラスを作成することでブロードキャストを処理します。

ブロードキャストの種類

  • 標準ブロードキャスト: 非同期で配信され、登録された全レシーバーがほぼ同時に受信します。効率的で途中での遮断が不可
  • 順序付きブロードキャスト: 同期方式で順次伝搬され、一度に一つのレシーバーのみが処理します

システムブロードキャストの受信

動的登録による時間変化の監視

class MainActivity : AppCompatActivity() {

    private var timeObserver: BroadcastReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        timeObserver = object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.JAPAN)
                val currentTime = LocalDateTime.now()
                Toast.makeText(context, "現在時刻: ${formatter.format(currentTime)}", Toast.LENGTH_SHORT).show()
            }
        }
        val filter = IntentFilter(Intent.ACTION_TIME_TICK)
        registerReceiver(timeObserver, filter)
    }

    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(timeObserver)
    }
}

システムのACTION_TIME_TICKブロードキャストを監視し、毎分更新される時刻情報を表示します。動的登録ではレシーバーの登録解除を忘れないでください。

静的登録による起動完了通知

class StartupReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "システム起動が完了しました", Toast.LENGTH_LONG).show()
    }
}

AndroidManifest.xmlへの登録:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<receiver
    android:name=".StartupReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

onReceive内での長時間処理は避けてください。ブロードキャストレシーバーではスレッド起動が制限されています。

カスタムブロードキャストの送信

標準ブロードキャストの送信

fun sendCustomBroadcast(context: Context) {
    val broadcastIntent = Intent("com.example.CUSTOM_ACTION")
    context.sendBroadcast(broadcastIntent)
}

独自のアクション文字列を定義してブロードキャストを送信します。

順序付きブロードキャストの送信

fun sendOrderedBroadcast(context: Context) {
    val orderedIntent = Intent("com.example.ORDERED_ACTION")
    context.sendOrderedBroadcast(orderedIntent, null)
}

タグ: BroadcastReceiver IntentFilter AndroidManifest システムブロードキャスト カスタムブロードキャスト

6月6日 19:21 投稿