最近项目里用到了Android的BroadcastReceiver,之前做的项目UI部分内容比较多,所以四大组件其实真正好好用的场景很少。
在调试过程中发现BroadcastReceiver收不到消息,很是奇怪。
于是把BroadcastReceiver使用方法又重新学习了一下,正好写一篇文章记录一下。
文章中代码为Kotlin实现。
简单点理解,BroadcastReceiver是一个广播接收器,用于接收匹配自己Action条件的消息。
在使用时,有以下几点需要注意。
1、定义/实现 BroadcastReceiver
自己需要定义与实现自己的BroadcastReceiver,如:
class MyBroadcastReceiver: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//TODO
}
}
onReceive方法里就是接收到广播后,需要做哪些处理或相应。
2、注册BroadcastReceiver
注册分为动态注册和静态注册。
动态注册是在代码运行阶段注册,比如在Activity的onCreate方法里注册。
lateinit var myBroadcastReceiver
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intentFilter = IntentFilter()
intentFilter.addAction("YOUR_ACTION")
//Your action is a string to control which receiver to receive
myBroadcastReceiver = MyBroadcastReceiver()
registerReceiver(myBroadcastReceiver,intentFilter)
}
在注册时注意配置好Action,这样才能让BroadcastReceiver接收到指定Action的消息。
另外就是动态注册时要记得在合适的地方取消注册,比如在Activity的onDestroy方法里。
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(myBroadcastReceiver)
}
静态注册是在Manifest文件里注册,配置如下:
静态注册和动态注册干的事其实差不多,最主要的就是为你所需要使用的BroadcastReceiver配置它的ACTION,以为了让发送的消息可以准确接收到。
注意,代码里的exported属性不是必须设置的,实际上如果app内部自己使用BroadcastReceiver,这个值为false也没事。exported属性主要是为了让外部应用也可以调用它。
3、发送消息
发送消息其实很简单,代码如下:
val intent = Intent(YOUR_ACTION)
intent.setPackage(packageName)
sendBroadcast(intent)
这三行代码就能够实现发送消息的功能。
创建一个Intent并以ACTION为参数进行初始化设置。
给Intent设置包名。(这一点非常重要,因为我所使用的测试机是最新的Android 12系统,在Android 8.0 以上要求静态注册的BroadcastReceiver所接收的消息必须是显式的,我们通过设置包名的方式来告诉系统这个Intent是要发给哪个应用来接收。不设置的话就会接收不到消息)
最后sendBroadcast方法发送消息。
这些代码准备好之后,BroadcastReceiver的使用方式就介绍完了。
大家可以自己尝试着使用BroadcastReceiver了。
至于很多人发现BroadcastReceiver收不到消息的原因,其中有一条可以检查一下自己使用的测试机系统是否是Android 8以上。如果是的话,则需要设置packageName来把消息变成显式的。
否则收不到消息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)