最近项目里用到了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 myBroadcastReceiveroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val intentFilter = IntentFilter()intentFilter.addAction("YOUR_ACTION")
//Your action is a string to control which receiver to receivemyBroadcastReceiver = 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来把消息变成显式的。

否则收不到消息。

Android BroadcastReceiver 收不到消息相关推荐

  1. 简述在android中如何发送广播消息,Android Intent发送广播消息实例详解

    Android Intent发送广播消息 Intent的另一种用途是发送广播消息,应用程序和Android系统都可以使用Intent发送广播消息,广播消息的内容是可以与应用程序密切相关的数据信息,也可 ...

  2. Android BroadcastReceiver总结

    #BroadcastReceiver综述 广播接收器,顾名思义,用来接收广播的. 一个广播关联两个角色,广播发送方.广播接收方,BroadcastReceiver是接收方角色. 广播发送方可以是应用内 ...

  3. Android BroadcastReceiver中播放提示语音有时失效问题

    Android BroadcastReceiver 千万不要做耗时的操作,如果有耗时的操作,请让OnReceive 中调用service. @Override public void onReceiv ...

  4. Android BroadcastReceiver示例教程

    Today we'll discuss and implement Android BroadcastReceiver that is a very important component of An ...

  5. windows 组播收不到消息_只需2步,轻松解决登录微信电脑版后,手机收不到消息提醒的问题...

    因为可以用手机号搜索的原因,我们在和客户沟通时,往往会通过电话号码添加对方的微信,便于收发文件资料,久而久之,就养成了通过微信传输文件的习惯. 但有一个一直困扰我们的问题,登录微信电脑版后,手机端往往 ...

  6. android 仿微信demo————微信消息界面实现(移动端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

  7. android融云消息提示,如何解决 嵌入融云SDK后, Android 手机收不到消息推送?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 很多人在嵌入融云SDK之后,遇到过Android手机收不到消息推送问题.下面来给大家一些干货.解决Android类手机收不到消息推送的解决方法.供大家参考 ...

  8. android物理按键输入法,Android输入法框架中按键消息的处理流程

    最近研究了一下Android输入法,发现Android输入法框架中按键消息的处理流程和一般应用程序的处理流程有很大的不同,故在此做个总结. 一.一些名词缩写 IMF(Input MethodFrame ...

  9. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

最新文章

  1. 乐嘉性格色彩分析测试题
  2. 连接查询中where子句的执行
  3. GlusterFS配置管理(五)
  4. [ASP.NET MVC] 利用动态注入HTML的方式来设计复杂页面
  5. powertoys中文版
  6. java星际小战_首届中国星际战队联赛:TSG夺冠,小hero刘建宏大战惊天地泣鬼神...
  7. ​坚持写代码,这是晋级大师的唯一方法。
  8. oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中
  9. 字符串比较函数实现,超简单的面试题,回过头来发现原来我的c多么的薄弱
  10. 数据处理能力相差 2.4 倍?Flink 使用 RocksDB 和 Gemini 的性能对比实验
  11. Net设计模式实例之观察者模式(Observer Pattern)
  12. 计算机体系结构的分类
  13. 型材行业ERP-MES应用点滴
  14. mes系统服务器连接失败,mes系统如何连接其他系统设备?
  15. ContentProvider跨进程通信
  16. 架构-大数据架构-阿里
  17. Java中的parallelStream
  18. 聊一聊进程、线程和协程以及线程的那些“锁“事
  19. BRD、MRD、PRD
  20. linux升级gfortran,linux的gfortran的code到IVF,需要做哪些处理??急!

热门文章

  1. 操作系统1——引导扇区的理解
  2. SystemVerilog学习-06-类的封装
  3. noj 2068 爱魔法的露露 [线性扫一遍]
  4. SQL SERVER 使用作业自动备份及删除过往备份
  5. 2016计算机国二试题,全国计算机等级考试一级考试试题及答案(二)
  6. 董秘、董助与董事长秘书区别?“三董”如何提高工作效率?
  7. 动手学习数据分析-task01
  8. DS查找—折半查找求阶乘函数后K个零
  9. 主线程阻塞导致子线程里bindService或者handler的handleMessage被阻塞
  10. ontology本体