广播

广播(Broadcast)作为Android四大组件之一,重要性不言而喻。

什么是Android广播

系统运行时,会产生很多事件(比如:电量改变, 收发短信, 拨打电话, 屏幕解锁),那么某些事件产生时,系统就会发送一个广播来告诉应用我怎么怎么了。那么,应用就可以根据广播来做出相应的反应。

广播的分类

  • 普通广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到),消息传递的效率比较高。
    缺点:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;
    如何发送: Context.sendBroadcast()
  • 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
    • 优先级的定义:-1000~1000
    • 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
    • abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截
      缺点:消息传递的效率比较低
      如何发送:Context.sendOrderedBroadcast()
      NT:有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者,前面的接收者有权终止广播(BroadcastReceiver.abortBroadcast()),如果广播被前面的接收者终止,后面的接收者就再也无法获取到广播。对于有序广播,前面的接收者可以将处理结果存放进广播Intent,然后传给下一个接收者。

广播接收者

系统产生广播,应用通过使用广播接收者(BroadcastReceiver)就可以来收听广播, 进而产生相应的行为。

创建广播接收者

  1. 定义java类继承BroadcastReceiver,并且重写onReceive()方法。
  2. 在清单文件中定义receiver节点,定义name属性,指定广播接收者java类的全类名
  3. 在intent-filter的节点中,指定action子节点,action的值必须跟要接收的广播中的action匹配,比如,如果要接收打电话广播,那么action的值必须指定为:
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>

NT:因为打电话广播中所包含的action,就是”android.intent.action.NEW_OUTGOING_CALL”,所以我们定义广播接收者时,action必须与其匹配,才能收到这条广播
即便广播接收者所在进程已经被关闭,当系统发出的广播中的action跟该广播接收者的action匹配时,系统会启动该广播接收者所在的进程,并把广播发给该广播接收者
并且:应注意收听广播的权限问题
NT:通过在清单文件中配置接收的广播,叫做静态订阅广播

对于第2、3步,我们还可以在代码中实现,这叫动态订阅广播
IntentFilter filter = newIntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = newIncomingSMSReceiver();
registerReceiver(receiver, filter);

自定义发送广播

  1. 发送广播即发送一个intent sendBoradcast(intent);
  2. 发送时应设置action, intent.setAction(“com.suixin.mybroadcast”);

example:

        Intent intent = new Intent();//广播中的action也是自定义的intent.setAction("com.itheima.zdy");sendBroadcast(intent);

NT:
接收自定义广播时,按正常接收就OK了, 只不过在配置时应

    <receiver android:name="com.itheima.receivezdy.ZDYReceiver"><intent-filter ><action android:name="com.suixin.mybroadcast"/></intent-filter></receiver>

广播应用的举例

IP拨号器

这个应用可以在你打电话时,自动帮你在你所拨打的电话号码前面加上指定号码。
原理:接收拨打电话的广播,修改广播内携带的电话号码

1) 定义广播接收者接收打电话广播

    public class CallReceiver extends BroadcastReceiver {//当广播接收者接收到广播时,此方法会调用@Overridepublic void onReceive(Context context, Intent intent) {//拿到用户拨打的号码String number = getResultData();//修改广播内的号码setResultData("17951" + number);}}

2)在清单文件中定义该广播接收者接收的广播类型

        <receiver android:name="com.itheima.ipdialer.CallReceiver"><intent-filter ><action android:name="android.intent.action.NEW_OUTGOING_CALL"/></intent-filter></receiver>

3)接收打电话广播需要权限

        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

NT: 即使广播接收者的进程没有启动,当系统发送的广播可以被该接收者接收时,系统会自动启动该接收者所在的进程

短信拦截器

系统收到短信时会产生一条广播,广播中包含了短信的号码和内容

  • 定义广播接收者接收短信广播
        public void onReceive(Context context, Intent intent) {//拿到广播里携带的短信内容Bundle bundle = intent.getExtras();Object[] objects = (Object[]) bundle.get("pdus");for(Object ob : objects ){//通过object对象创建一个短信对象SmsMessage sms = SmsMessage.createFromPdu((byte[])ob);System.out.println(sms.getMessageBody());System.out.println(sms.getOriginatingAddress());}}
  • 系统创建广播时,把短信存放到一个数组,然后把数据以pdus为key存入bundle,再把bundle存入intent
  • 清单文件中配置广播接收者接收的广播类型,注意要设置优先级属性,要保证优先级高于短信应用,才可以实现拦截
        <receiver android:name="com.itheima.smslistener.SmsReceiver"><intent-filter android:priority="1000"><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
  • 添加权限
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  • 4.0以后广播接收者安装以后必须手动启动一次,否则不生效
  • 4.0以后广播接收者如果被手动关闭,就不会再启动了

监听SD卡状态

  • 清单文件中定义广播接收者接收的类型,监听SD卡常见的三种状态,所以广播接收者需要接收三种广播
     <receiver android:name="com.itheima.sdcradlistener.SDCardReceiver"><intent-filter ><action android:name="android.intent.action.MEDIA_MOUNTED"/><action android:name="android.intent.action.MEDIA_UNMOUNTED"/><action android:name="android.intent.action.MEDIA_REMOVED"/><data android:scheme="file"/></intent-filter></receiver>

* 广播接收者的定义public class SDCardReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 区分接收到的是哪个广播String action = intent.getAction();if(action.equals("android.intent.action.MEDIA_MOUNTED")){System.out.println("sd卡就绪");}else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){System.out.println("sd卡被移除");}else if(action.equals("android.intent.action.MEDIA_REMOVED")){System.out.println("sd卡被拔出");}}}

勒索软件—开机广播

  • 接收开机广播,在广播接收者中启动勒索的Activity
  • 清单文件中配置接收开机广播
        <receiver android:name="com.itheima.lesuo.BootReceiver"><intent-filter ><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>
  • 权限
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  • 定义广播接收者
        @Overridepublic void onReceive(Context context, Intent intent) {//开机的时候就启动勒索软件Intent it = new Intent(context, MainActivity.class);        context.startActivity(it);}
  • 以上代码还不能启动MainActivity,因为广播接收者的启动,并不会创建任务栈,那么没有任务栈,就无法启动activity
  • 手动设置创建新任务栈的flag
        it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

监听应用的安装、卸载、更新

原理:应用在安装卸载更新时,系统会发送广播,广播里会携带应用的包名
* 清单文件定义广播接收者接收的类型,因为要监听应用的三个动作,所以需要接收三种广播

        <receiver android:name="com.itheima.app.AppReceiver"><intent-filter ><action android:name="android.intent.action.PACKAGE_ADDED"/><action android:name="android.intent.action.PACKAGE_REPLACED"/><action android:name="android.intent.action.PACKAGE_REMOVED"/><data android:scheme="package"/></intent-filter></receiver>
  • 广播接收者的定义
        public void onReceive(Context context, Intent intent) {//区分接收到的是哪种广播String action = intent.getAction();//获取广播中包含的应用包名Uri uri = intent.getData();if(action.equals("android.intent.action.PACKAGE_ADDED")){System.out.println(uri + "被安装了");}else if(action.equals("android.intent.action.PACKAGE_REPLACED")){System.out.println(uri + "被更新了");}else if(action.equals("android.intent.action.PACKAGE_REMOVED")){System.out.println(uri + "被卸载了");}}

NT:本博文参考传智博客培训笔记

Android——广播相关推荐

  1. Android 广播的生命周期

    一:Android 广播的生命周期          一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一 ...

  2. android广播接收器

    Android程序创建广播接收器继承BroadcastReceiver Android广播接收器需要在AndroidManifest.xml文件中声明: <recevie android:nam ...

  3. Android广播机制:Broadcast

    转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...

  4. Android广播接实现电话的监听(电话的状态,拦截)

    Android广播接实现电话的监听 1:需要在AndroidManifest.xml清单中添加权限 <uses-permission android:name="android.per ...

  5. 图解 Android 广播机制

    从现实生活中理解广播机制 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同. ...

  6. android 广播观察者,作业三——观察者模式在Android广播机制上的应用

    观察者模式在Android广播机制上的应用 点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git 一.观察者模式在Android ...

  7. Android 广播(Broadcast)

    Android 广播Broadcast 1.小声嘀咕 2.广播机制简介 3.接收系统广播 3.1动态注册 3.2静态注册 4.发送自定义广播 4.1标准广播 4.2有序广播 5.使用本地广播 1.小声 ...

  8. Android——广播(BroadcastReceiver)

    1. 简介 BroadcastReceiver (广播接收器),属于Android四大组件之一 Android 广播分为两个角色:广播发送者.广播接收者 用于监听 / 接收 应用发出的广播消息,并做出 ...

  9. Android广播(Broadcast)

    Android广播(Broadcast) 一.Broadcast简介 Broadcast是android中的四大组件之一,是在组件之间传播数据(Intent)的一种机制.广播的发送者和接收者事先是不需 ...

最新文章

  1. 函数传参涉及到副本的创建与拷贝问题分析
  2. Linux串口原理与编程
  3. 摘要: Nginx 网络多并发请求的TCP网络参数做简单说明。
  4. mybatis.xml中sql编写规范
  5. mysql大数据分库和分表 php解决方案
  6. 门当户对真的很重要吗?
  7. ES6学习笔记六(Iterator和for..of)
  8. 如何查看apache,php,mysql的编译参数
  9. “云栖直播”升级为“公开课”
  10. tesseract库
  11. aws redshift_AWS Redshift入门
  12. spring-boot-starter-parent 包maven依赖报错
  13. Hosts 文件切换工具
  14. 淘宝中的一些基本CSS代码
  15. 抽样分布(卡方分布、t分布、F分布)
  16. 115网盘如何打开php文件格式,115网盘真实地址解析工具
  17. 手机浏览网页或打开app时莫名弹出支付宝领红包界面的原因及预防措施
  18. python简易网络验证(零成本)
  19. 算法——动态规划(DP)
  20. 单片机入门——单片机的基本构成及工作原理(1)

热门文章

  1. web移动端安卓和ios兼容问题
  2. 2019年度总结,憧憬2020
  3. Blender 制作刀光特效所用模型
  4. 东方财富股票接口解析优缺点
  5. Win10开了hdr灰蒙蒙的怎么办?
  6. 服务器准系统diy,网易科技频道--DIY自己的低价“准系统”:之MICRO ATX主板篇
  7. 微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频) 发布流程
  8. type-aliases-package不生效问题记录
  9. php去除英文和标点,php实现过滤中文标点符号及过滤英文标点符号的示例代码
  10. 机器学习(一) 贝叶斯法则与概念学习