Android BroadcastReceiver 收不到消息

最近项目里用到了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文件里注册,配置如下:

<receiver android:name="com.example.demo.MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.demo.YOUR_ACTION"/>
            </intent-filter>
</receiver>

静态注册和动态注册干的事其实差不多,最主要的就是为你所需要使用的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来把消息变成显式的。

否则收不到消息。

猜你喜欢

转载自blog.csdn.net/Kongou/article/details/124422544
今日推荐