当前位置: 首页 > news >正文

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:会将广播发送给与发送器位于同一应用中的接收器。如果不需要跨应用发送广播,则应使用本地广播。

相关文章:

  • wordpress访问后台/百度怎么找人工客服
  • 淘宝网做网站/茶叶网络推广方案
  • 网站搬家怎么做/关键词怎样做优化排名
  • 万网网站制作/爱链
  • 网站建设流程是什么意思/新站点seo联系方式
  • 用html5做的个人网站/精准客户软件
  • 【计算机网络】网络编程套接字
  • 分页查询数据重复的问题 (分页时数据库插入数据导致)
  • Unity 简易音乐播放系统
  • Android | Fragment
  • 代码随想录算法训练营第13天 239.滑动窗口最大值、347. 前 K 个高频元素
  • 2023-01-16 Dubbo+Zookeeper集成
  • 我的周刊(第074期)
  • WuThreat身份安全云-TVD每日漏洞情报-2023-01-16
  • 【Python学习】条件和循环
  • 寒假集训一期总结(一)–––思维训练
  • Rpc了解
  • 【开发心得】Spring Mail发送邮件