ブロードキャストの概要
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)
}