Android | BroadcastReceiver

Android BroadcastReceiver

BroadcastReceiver 概念

应用与 Android 系统或者其他应用之间可以相互收发广播消息,便于进行系统级别的消息通知。应用可以注册接收特定的广播。广播发出后,系统会自动将广播传送给同意接收这种广播的应用。

广播分类

  • 标准广播 normal broadcasts:完全异步执行的广播,广播发出之后,所有的 BroadcastReceiver 几乎会在同一时刻收到这条广播消息,之间没有任何先后顺序可言,无法被截断。
  • 有序广播 ordered broadcasts:同步执行的广播,在广播发出之后,同一时刻只会有一个 BroadcastReceiver 能够收到这条广播消息,当这个 BroadcastReceiver 中的逻辑执行完毕后,广播才会继续传递。所以此时的 BroadcastReceiver 是有先后顺序的,优先级高的 BroadcastReceiver 就可以先收到广播消息,并且前面的 BroadcastReceiver 还可以截断正在传递的广播。

广播接收

静态注册

在清单文件 AndroidManifest.xml 中声明注册

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

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

上述代码静态注册方式接收开机广播,需要注意的是对敏感操作进行权限声明。

动态注册

新建一个类,让它继承自 BroadcastReceiver,并重写父类的 onReceive() 方法。当不再需要接收器或上下文不再有效时,动态注册的 BroadcastReceiver 一定要取消注册,调用 unregisterReceiver(android.content.BroadcastReceiver)

var br : timeChangeReceiver: TimeChangeReceiver

override fun onCreate(savedInstanceState: Bundle?) {
	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_main)
	val intentFilter = IntentFilter()
	intentFilter.addAction("android.intent.action.TIME_TICK")
	timeChangeReceiver = TimeChangeReceiver()
	registerReceiver(timeChangeReceiver, intentFilter)
}

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

inner class TimeChangeReceiver : BroadcastReceiver() {
	override fun onReceive(context: Context, intent: Intent) {
		Toast.makeText(context, "changed", Toast.LENGTH_SHORT).show()
	}
}

广播发送

  • sendBroadcast(Intent):标准广播,按随机的顺序向所有接收器发送广播,接收器无法从其他接收器读取结果,无法传递从广播中收到的数据,也无法中止广播。
  • sendOrderedBroadcast(Intent, String):有序广播,一次向一个接收器发送广播。当接收器逐个顺序执行时,接收器可以向下传递结果,也可以完全中止广播,使其不再传递给其他接收器。接收器的运行顺序可以通过匹配的 intent-filter 的 android:priority 属性来控制;具有相同优先级的接收器将按随机顺序运行。
  • LocalBroadcastManager.sendBroadcast:会将广播发送给与发送器位于同一应用中的接收器。如果不需要跨应用发送广播,则应使用本地广播。

你可能感兴趣的:(Android,android,kotlin,开发语言)