IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android BroadcastReceiver 收不到消息 -> 正文阅读

[移动开发]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来把消息变成显式的。

否则收不到消息。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:00:36  更:2022-04-28 12:00:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:40:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码