Android | BroadcastReceiver

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

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会将广播发送给与发送器位于同一应用中的接收器。如果不需要跨应用发送广播则应使用本地广播。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android