
Android的广播接收者
发布日期:2021-05-10 06:29:15
浏览次数:5
分类:技术文章
本文共 2566 字,大约阅读时间需要 8 分钟。
介绍
广播接收者是Android的四大组件,与其他组件不同,广播接收者可以动态注册,用于接收到广播后处理,也可起着进程间通信作用,了解到Android用多种通信方式,那为什么还要搞个广播接收者让我们学呢?
广播机制有着牢固的地位,广播接收者和发送者是无需知道对方的存在和位置,使用简单,使得应用程序高内聚低耦合,简化代码,降低使用风险,减少维护工作。工作原理:

生命周期注意事项:
广播的生命周期极其短暂,最好不要做耗时操作,超过10s会弹出ANR,而且在如果是动态注册,则必须在Activity销毁前使用unregisterReceiver注销广播,否则报异常
ANR原理使用方法
静态注册
1、继承BroadcastReceiver,重写onReceive()class MyBroadcastReceiver: BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.i("receiver",intent?.getStringExtra("msg")) }}
2、清单文件:
动态注册
class MainActivity : AppCompatActivity() { var myBroadcastReceiver:MyBroadcastReceiver? = MyBroadcastReceiver() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val filter = IntentFilter() filter.addAction("android.intent.action.MyBroadcast") registerReceiver(myBroadcastReceiver, filter) } override fun onDestroy() { unregisterReceiver(myBroadcastReceiver) myBroadcastReceiver = null super.onDestroy() }}
两种注册方式区别:
- 静态注册的广播运行一次后,就一直会处于广播接收状态,即使应用程序退出。
- 动态注册无需再清单文件写(同时他是andorid四大组件中唯一一个可以不用在清单文件注册的),注销后就不能再接收广播了。
- 如果是静态注册的广播,onReceive里的context为ReceiverRestrictedContext对象实例,所在如果在这里要启动一个Activity的话(调用startActivity),需要在intent中添加Intent.FLAG_ACTIVITY_NEW_TASK;
- 如果是动态注册,registerReceiver是android.content.ContextWrapper类中的方法,Activity 和Service都继承了ContextWrapper,onReceive里的context即是调用者的上下文,所以可以直接调用。
- 对于动态广播,有注册就必然得有注销,否则会导致内存泄露,假设我们将广播的注销放在onStop(),onDestory()方法里的话,有可能在Activity被销毁后还未执行onStop(),onDestory()方法,即广播仍还未注销,从而导致内存泄露。但是,onPause()一定会被执行,从而保证了广播在App死亡前一定会被注销,从而防止内存泄露。
特殊的广播接收者:
频繁发广播的需要动态注册,如锁屏,电量变化,网络连接,如果是静态注册会无效。发送广播
1. 无序广播
val intent = Intent("android.intent.action.MyBroadcast")intent.putExtra("msg", "普通广播")sendBroadcast(intent)
2. 有序广播
需要在intent-filter里设置优先级 静态广播需要再清单文件设置:动态注册的这样设置:
filter.setPriority(100);
数字越大优先级越高,同优先级的广播接收者,动态优先于静态
发送:val intent = Intent("android.intent.action.MyBroadcast")intent.putExtra("msg", "有序")sendOrderedBroadcast(intent,null);
之后即可在自个儿广播接收者拦截:
class MyBroadcastReceiver: BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.i("receiver",intent?.getStringExtra("msg")) abortBroadcast() resultData = "有序广播版本2" }}
可见MyBroadcastReceiver拦截后修改了resultData,之后广播继续往下传递,只不过传到另一个广播接收者的参数变成了"有序广播版本2"。
全局广播和应用内广播
注册广播时intent-filter的exported属性设置可以设置,默认true为全局广播转载地址:https://blog.csdn.net/weixin_43860530/article/details/105979000 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2023年11月12日 03时39分29秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ROS远程控制(PC机+TX2进行ROS远程通讯)
2019-03-28
TX2使用pyserial建立串口通讯
2019-03-28
ROS通过话题发布订阅Image类型的视频帧(python)
2019-03-28
ubuntu开机自动打开终端并执行程序
2019-03-28
ROS 中 rosbag 相关命令介绍
2019-03-28
NumPy 文件存取 tofile,fromfile, load,save
2019-03-28
ubuntu远程桌面连接windows系统
2019-03-28
科研神器(高效开发工具)
2019-03-28
悬臂式连接环的应力与变形分析——ansys
2019-03-28
超静定桁架的有限元建模与分析--ansys
2019-03-28
Python实现kMeans(k均值聚类)
2019-03-28
PCL实现区域增长算法(代码详细解析)
2019-03-28
C/C++常用函数总结以及在ubuntu和vs中运行
2019-03-28
基于tensorflow的一元线性回归详细讲解
2019-03-28
tensorflow简单二维分类 simple_classification
2019-03-28
tensorflow的CNN
2019-03-28
tensorflow的regress(超详细教程)
2019-03-28
tensorflow的dropout 防止过拟合
2019-03-28
PCL包围盒(详细介绍)
2019-03-28
c++调用函数,返回字符串数组
2019-03-28