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来把消息变成显式的。

否则收不到消息。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓的BroadcastReceiver可以被用来接收系统发送的广播消息,而AlarmManager则可以用来触发在特定时间触发的定时任务。然而,在某些情况下,我们可能会遇到AlarmManager无法将广播发送给BroadcastReceiver的问题。 出现这种情况的原因可能有多个。一种可能性是未正确注册BroadcastReceiver。在AndroidManifest.xml文件中,需要添加正确的intent-filter来指定BroadcastReceiver接收的广播类型。如果没有正确添加intent-filter,那么AlarmManager发送的广播就无法被BroadcastReceiver接收到。 另一种可能性是未正确设置AlarmManager的PendingIntent。在设置AlarmManager时,我们需要为PendingIntent指定BroadcastReceiver的类。如果未正确设置PendingIntent,那么AlarmManager发送的广播就无法正确地被指定的BroadcastReceiver接收到。 此外,还有可能是由于权限问题导致BroadcastReceiver无法接收AlarmManager发送的广播。当AlarmManager发送广播时,需要确保应用程序具有相应的权限。如果没有正确配置权限,那么BroadcastReceiver将无法接收到AlarmManager发送的广播。 解决这个问题的步骤包括: 1. 在AndroidManifest.xml文件中确保正确注册BroadcastReceiver,并添加正确的intent-filter。 2. 在设置AlarmManager时,确保为PendingIntent正确指定BroadcastReceiver的类。 3. 确认应用程序具有相应的权限来接收AlarmManager发送的广播。 通过以上步骤的检查和调整,应该能够解决AndroidBroadcastReceiver收不到AlarmManager发送的广播的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值