(七)Android基础系列之:BroadcastReceiver

Android BroadcastReceiver总结 #BroadcastReceiver综述 广播接收器,顾名思义,用来接收广播的。 一个广播关联两个角色,广播发送方、广播接收方,BroadcastReceiver是接收方角色。 广播发送方可以是应用内组件、其它应用,也可以是系统,BroadcastReceiver根据自己设置的过滤器IntentFilter来选择性接收。 BroadcastReceiver通过接收这些广播,实现了与其它组件、应用间的通信。 1.广播接收器注册时是被注册到系统,发送广播时也是... 阅读详情

一、按广播发送的特点:默认情况下,广播接收者的接收顺序就是在功能清单文件中的注册顺序

  • A:正常广播:广播在同一时刻一起发送,接收者会同时收到,其中一个接收者不能终止其它接收者接收广播。
    实例化意图对象并指定意图对象的action
    Intent intent=new Intent(“android.intent.action.hsj”);
    发送正常广播
    this.sendBroadcast(intent);

  • B:有序广播:根据广播的优先级决定哪个广播接收者先收到广播,并且可以根据需要终止广播,让优先级低的广播永远收不到广播.
    如果广播接收方的优先级相同,则接收信号的顺序和注册的顺序一致.
    如果广播接收者的优先级不同,则优先级高的接收者优先收到广播,并且高优先级的接收者可以终止广播,让优先级低的广播接收者永远收不到广播
    广播接收者的优先级的取值:-1000到1000,数字越大,优先级越高

<receiver android:name=".receivers.BroadcastReceiverOne">
    <intent-filter android:priority="100">
        <action android:name="hsj"/>
    </intent-filter>
</receiver>
<receiver android:name=".receivers.BroadcastReceiverTwo">
    <intent-filter android:priority="500">
        <action android:name="hsj"/>
        <action android:name="wcf"/>
    </intent-filter>
</receiver>
<receiver android:name=".receivers.BroadcastReceiverThree">
    <intent-filter android:priority="1000">
        <action android:name="hsj"/>
         <action android:name="wcf"/>
    </intent-filter>
</receiver>

发送有序广播:

context.sendOrderedBroadcast(intent,null);
this.sendOrderedBroadcast(intent,null);

发送有序广播并且指定最终广播对象,所谓最终广播对象是:即使前面已经最终了广播,作为最终广播对象一定会收到广播信号的.

this.sendOrderedBroadcast(
                intent,//意图对象
                null,
                new BroadcastReceiverOne(),//指定最终广播对象
                null,
                100,//初始化码,
                null,
                null
        );

终止广播信号的发送,使其后面的广播接收者收不到广播信号

this.abortBroadcast();
  • C:粘滞广播:这种广播会常驻内存,可以先发送广播,之后再注册广播接收者仍然能够收到之前发送的广播.
    注册发送粘滞广播需要的权限 发送粘滞广播,必须在功能清单文件中注册发送粘滞广播的权限
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

注册广播

IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("hsj");

通过上下文对象动态注册广播接收者

this.registerReceiver(broadCastReceiverTwo, intentFilter);

发送广播

Intent intent=new Intent("hsj");
this.sendStickyBroadcast(intent);

取消注册指定的广播接收者

this.unregisterReceiver(broadCastReceiverTwo);

二、按广播的有效期:

android四大组件中,只有广播接收者可以通过java代码进行注册,其它的都必须在功能清单文件中进行注册;

  • A:静态广播:在功能清单文件中注册的广播,即使程序退出,一旦有合适的广播发送仍然能够收到广播的消息
  • B:动态广播:在java代码中使用context.registerReceiver(receiver,interfilter);这个方法注册的广播,程序一旦退出,广播接收者就再也收不到广播
    消息了。
动态注册广播
IntentFilter intentFilter=new IntentFilter("android.intent.action.hsj");
this.registerReceiver(this.broadcastReceiverTwo, intentFilter);
发送粘滞广播
Intent intent=new Intent("android.intent.action.hsj");
this.sendStickyBroadcast(intent);
取消注册广播
this.unregisterReceiver(this.broadcastReceiverTwo);
自定义广播接收者的步骤:
  • 1.编写一个类继承BroadcastReceiver并重写它的声明周期函数:onReceive(Context context, Intent intent)
class BroadcastReceiverOne extends BroadcastReceiver {
   @Override
    public void onReceive(Context context, Intent intent) {
    }
}
  • 2.在功能清单文件中注册广播接收者,这种广播成为静态广播;通过Java代码进行注册,这种广播成为动态广播
<receiver android:name=".receiver.BroadcastReceiverOne">
    <intent-filter>
    <action android:name="android.intent.action.hsj"/>
    </intent-filter>
</receiver>

广播接收者的生命周期就是onReceive(Context context, Intent intent)方法的执行期间,这个方法默认运行在主线程中,因此不能做耗时
操作,另外广播接收者的生命周期最长不要超过10秒,因为超过10秒后可能作为被杀死的候选对象,因此不安全.

可以在广播接收者的生命周期函数onReceive(Context context, Intent intent)中启动服务做耗时操作.

三、应用

1、自定义检查手机网络状态是否切换的广播接收者
public class PhoneNetStateCheckBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action=intent.getAction();
        //ConnectivityManager.CONNECTIVITY_ACTION即android.net.conn.CONNECTIVITY_CHANGE
        if(ConnectivityManager.CONNECTIVITY_ACTION.equals(action)){//说明手机的网络状态发生了化
            testConnectionState(context);
        }else{
            Toast.makeText(context, "当前的广播不是手机网络状态切换的广播!",Toast.LENGTH_LONG).show();
        }
    }
    /**
     * 检查手机网络状态的变化
     * @param context
     */
    private void testConnectionState(Context context) {
        ConnectivityManager connectivityManager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo= connectivityManager.getActiveNetworkInfo();
        if(networkInfo!=null&&networkInfo.isConnected()){
            if(networkInfo.getType()==ConnectivityManager.TYPE_WIFI){
                Toast.makeText(context, "当前手机连接了WIFI网络!", Toast.LENGTH_LONG).show();
            }else if(networkInfo.getType()==ConnectivityManager.TYPE_MOBILE){
                Toast.makeText(context, "当前手机连接了3G网络!", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(context, "当前手机连接了未知网络!", Toast.LENGTH_LONG).show();
            }
        }else{
            Toast.makeText(context, "当前无网络!", Toast.LENGTH_LONG).show();
        }
    } 
}
2、短信拦截
  • 需要的权限:
<!-- 注册接收短信的权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 注册发送短信的权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
  • 注册广播
<!--注册短信拦截器的广播接收者-->
<receiver android:name=".receivers.SmsInterceptorBroadcastReceiver">
    <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>
  • 自定义短信拦截器的广播接收者
public class SmsInterceptorBroadcastReceiver extends BroadcastReceiver {
    /**
     * 当手机收到短信时系统会发送一个广播,这个广播对应的意图的动作为android.provider.Telephony.SMS_RECEIVED
     */
    private String action="android.provider.Telephony.SMS_RECEIVED";
    @Override
    public void onReceive(Context context, Intent intent) {
        String strAction=intent.getAction();
        System.out.println("SmsInterceptorBroadcastReceiver.onReceive(Context context, Intent intent).strAction="+strAction);
        //说明手机收到短信并且系统发送了广播
        if(action.equals(strAction)){
            //通过意图得到Bundle对象
            Bundle bundle=intent.getExtras();
            //通过bundle对象调用get()方法传递的键为pdus则得到一个短信对象数组对应的对象
            Object[] objs=(Object[]) bundle.get("pdus");
            for(Object obj:objs){
                //将短信对象转化成字节数组
                byte[] data=(byte[]) obj;
                //根据字节数组得到短信消息对象
                SmsMessage smsMessage=SmsMessage.createFromPdu(data);
                //得到发送短信手机的电话号码
                String senderAddress=smsMessage.getOriginatingAddress();
                //得到短信内容
                String body=smsMessage.getMessageBody();
                //得到接收短信的时间
                long ldate=smsMessage.getTimestampMillis();
                //格式化日期
                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date=new Date(ldate);
                String strDate=simpleDateFormat.format(date);
                String receiveSms=senderAddress+"在"+strDate+"时间发送了短信内容为【"+body+"】的短信内容!";
                //Toast.makeText(context, receiveSms, Toast.LENGTH_LONG).show();
                //终止接收短信的广播
                this.abortBroadcast();
                //得到短信管理器对象
                SmsManager smsManager=SmsManager.getDefault();
                String text="zhe niu shi wo de,zai gei lao zi qiang xiao xin lao zi fei le ni!";
                //发送短信
                smsManager.sendTextMessage(senderAddress, null, text, null, null);
            }
        }else{
            Toast.makeText(context, "并非收到短信的广播!", Toast.LENGTH_LONG).show();
        }
    }
}
3、电话拦截
  • 所需权限
<!-- 注册处理外拨电话的权限 -->
 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
  • 功能清单注册广播
<!-- 注册电话拦截器的广播接收者
        android.intent.action.NEW_OUTGOING_CALL:当用户外拨电话时anroid系统会发送一个广播,这个广播对应的意图中的action即为:
        android.intent.action.NEW_OUTGOING_CALL
         -->
<receiver android:name=".receivers.PhoneInterceptorBroadcastReceiver">
       <intent-filter>
             <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
       </intent-filter>
</receiver>
  • 自定义电话拦截器的广播接收者
public class PhoneInterceptorBroadcastReceiver extends BroadcastReceiver {
 
    private String action="android.intent.action.NEW_OUTGOING_CALL";
    @Override
    public void onReceive(Context context, Intent intent) {
        String strAction=intent.getAction();
        //外拨电话的广播
        if(action.equals(strAction)){
            //得到外拨电话的电话号码
            String phone=this.getResultData();
            if(phone.contains("5556")){
                //将电话号码置空
                this.setResultData(null);
            }
        }else{
            Toast.makeText(context, "并不是外拨电话的广播",Toast.LENGTH_LONG).show();
        }
     
    }
}
SAP成本计划BAPI接口BAPI_COSTACTPLN_POSTPRIMCOST深度解析与实战指南 在SAP ERP系统中,成本计划是财务与控制模块的核心功能,它涉及对企业未来成本支出的预测与规划。其原理是通过结构化数据模型,将成本要素分配到具体的成本对象上,以实现预算编制和成本控制。这一技术的核心价值在于实现成本数据的标准化、自动化处理,从而提升财务流程效率与数据准确性。在应用场景上,成本计划广泛应用于年度预算编制、项目成本预测、系统间数据集成以及历史数据迁移等关键业务环节。本文聚焦于实现上述流程自动化的关键技术——SAP标准接口BAPI_COSTACTPLN_POSTPRIMCOST,并深入探讨其在高 阅读详情

相关推荐

高分系列卫星轨道、传感器参数等信息

遥感卫星数据简介-高分系列

中遥科 3309

Android四大组件——BroadcastReceiver

安卓中广播接收器BroadcastReceiver的初级使用,重点是Bundle信息的传递

weixin_43240212的博客 1347

OFDM基本原理

OFDM基础介绍,包括OFDM的核心思想,数学推导了OFDM信号的调制解调过程。

伊丽莎白的学习之路 8908

国内目前最全面的介绍——Android中的BroadCastReceiver

Android 中的BroadCastReceiver                                                 作者:阿福 BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: frame

ycjunhua的专栏 1484

聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

在112G SerDes高速通道下的400G/800G高速以太网端口下,如何保障通信速率,验证SerDes的数据完整性和链路余量,自动协商(AN)和链路训练(LT)功能显得尤其重要,其在DAC、ACC、AEC铜缆连接或高速背板通信上,自动协商(AN)和链路训练(LT)的工作与否将决定高速链路传输质量的优劣。本文将系统的讨论介绍自动协商(AN)和链路训练(LT)的测试流程,其可以独立使用,也可以与teledynelecroy SierraNet M1288配合使用。

专注有线以太网性能测试--丹麦信雅纳网络(Xena Networks) 9402

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

Innovus Flexible H-tree and Multi-tap Clock Flow Lab实操系列教程(Day1)

weixin_37584728的博客 2637

Android中的BroadcastReceiver:深入理解与应用

这些广播消息可以是系统级别的,如网络状态变化、电池电量变化等,也可以是应用级别的,如自定义的广播事件。BroadcastReceiver通过监听特定的广播意图,并在接收到匹配的广播时执行相应的操作,如更新UI、执行后台任务等。通过深入理解BroadcastReceiver的基本概念、工作原理和注册方式,开发者可以更加高效地利用这一组件实现应用间的通信、系统事件监听以及定时任务等功能,从而提升应用的用户体验和功能丰富性。:随着应用的增长和功能的增加,可能需要管理大量的BroadcastReceiver。

weixin_42487687的博客 1729

卡尔曼滤波五步拆解:用Excel手推姿态解算全过程

本文通过Excel手推演示,详细拆解了卡尔曼滤波在姿态解算中的五步核心流程。文章以融合陀螺仪与加速度计数据估算角度为例,从状态预测、协方差更新到增益计算,逐步展示如何将抽象的矩阵运算转化为可视化的表格计算,帮助读者直观理解滤波器的“预测-修正”机制,并为算法实现与参数调优提供清晰指导。

hhh00的博客 978

Android基础 - BroadcastReceiver全面解析

简介 BroadcastReceiver,同样是Android四大组件之一,有两个重要角色:广播发布者、广播接受者。 使用场景及作用 作用 用于接受或者监听应用发出来的广播,并作出相应的响应。 使用场景 用于不同组件间的通信,包括应用内和不同应用间的交互通信。 监听系统资源的变化,如网络变化、SD卡状态等 多进程的通信 实现原理 是典型观察者模式的应用,基于消息发布...

学习,思考,输出 3096

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具链中的sgdc约束文件解决跨时钟域(CDC)报错问题。从基础约束文件架构到复杂场景调试,涵盖了时钟域定义、复位信号约束、Waiver策略等关键技巧,并附有常见错误排查方法,帮助工程师高效处理CDC验证挑战。

loss4bartender的博客 1148

首发!谷歌倾斜摄影数据转换生成OSGB格式

全球首发,谷歌倾斜摄影模型文件能直接转换成OSGB格式!

cyber_room的博客 2287

【Android】四大组件之BroadcastReceiver

BroadcastReceiver用于监听系统或应用发出的广播事件,实现跨组件通信。

贫道绝缘子的博客 2070

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

深入分析 Android BroadcastReceiver (七)

广播机制在 Android 中是一个非常灵活和强大的组件通信方式,适用于多种应用场景。通过系统广播、自定义广播、有序广播和本地广播,可以实现多样化的通信需求。在实际应用中,开发者需要结合具体需求,选择合适的广播机制,并通过优化策略提升应用的性能和安全性。动态权限请求:使用广播机制监听权限变化,及时处理权限授予或拒绝后的操作。应用内更新通知:通过广播实现模块间的数据更新通知,保持组件间的松耦合。安全性优化:通过设置权限和使用 LocalBroadcastManager 提升广播的安全性,避免广播攻击。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[安卓] 深度掌握Android BroadcastReceiver:全局事件监听与响应

BroadcastReceiver是一种用于接收广播消息的组件,它允许应用监听系统级或应用级的事件,并在事件发生时执行相应的操作。广播是一种广泛使用的应用间通信机制。轻量级,生命周期短暂可以跨应用通信支持有序广播和无序广播可以设置优先级和权限控制。

2301_77946674的博客 1226

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓之BroadcastReceiver的应用与展望

BroadcastReceiver是Android操作系统中一个核心的组件,负责在应用间传递消息。本文旨在对BroadcastReceiver进行概述,探讨其应用场景、高级特性以及局限性,并就性能优化和未来发展趋势提出建议。此外,本文还将提供代码实例以供实践参考。

wlred1980的博客 1752

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

安卓BroadcastReceiver总结

概述 BroadcastReceiver是安卓中四大组件之一,用于接受广播通知。常用于监听系统的事件,比如:开机、锁屏、解锁屏、电量变化、网络变化、短信收发等。有时候还有收发自定义的广播的需求。     广播注册方式 静态注册: 在AndroidManifest.xml文件中配置 简单

宇不语的博客 1397

Android安卓实验十 BroadcastReceiver

编写一个广播的Activity,里面有一个文本框和一个按钮,文本框用于输入要广播的内容,按钮用于发送广播,即把文本框中输入的内容广播出去。 编写2个接收广播的Receiver类,用于接收上面广播的内容,并用Toast方法显示出收到的广播的内容。

2301_77412448的博客 1010

安卓广播 BroadcastReceiver 及一些传值的方法

广播:BroadcastReceiver,是安卓四大组件之一 一、使用广播进行传值 使用广播要进行注册: 1.静态注册,在清单文件注册 2.动态注册,在使用的时候注册 静态注册 <receiver android:name=".com.Receiver1"> <intent-filter android:priority="1000"> <action and...

yuhui77268769的博客 2482

BroadcastReceiver

BroadcastReceiver组件本质上是一个全局监听器,用于监听系统全局的广播消息。它可以非常方便地实现系统中不同组件之间的通信。

810

Android安卓——BroadcastReceiver广播组件

之间讲解过Activity组件之间的使用Intent通信,而本次学习的安卓四大组件之一的BroadcastReceiver组件,进行的则是广播通信。然而这都是以Intent通信为基础的。 一、广播通信的简介1、是Intent的另一种用途——发送广播通信 2、应用程序和安卓程序都可以使用Intent发送广播消息 3、广播消息的内容可以与应用程序密切相关的数据信息,也可以是Android系统的信息。

Deniece_X的博客 633

安卓BroadcastReceiver基础

1.作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景 a. 不同组件之间通信(包括应用内 / 不同应用之间) b. 与 Android 系统在特定情况下的通信 ​ 如当电话呼入时、网络可用时 c. 多线程通信 2.原理 Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。 因此,Android将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展 模型中有3个角色: 消息订阅者(广播接收者) 消息发布者(广播发布者) 消息

lentolove的博客 230

Android 四大组件之 ContentProvider 与 BroadcastReceiver

四大组件里,Activity 是"看得见的脸"、Service 是"看不见的腿",剩下两个是搭起整个系统协作骨架的"管道"。

2301_76797664的博客 521

Android基础知识巩固系列 Android之四大组件——BroadcastReceiver(广播)

因为最近要面试,于是打算整理整理一下Android的基础知识,由于之前本人已经学习过大概的Android基础知识,这里主要讲这四大组件、五大存储、六大布局、网络请求等这些内容,其他一些等有时间再整理,话不多说。 应用组件(官方解释,需科学上网) 应用组件是 Android 应用的基本构建基块。每个组件都是一个不同的点,系统可以通过它进入您的应用。 并非所有组件都是用户的实际入口点,有些组件相...

Peter__Li的博客 844

Android - BroadcastReceiver 广播

Android - 广播 静态: ① 编写主类 sendBroadcast(intent); ② 编写接收类继承 BroadcastReceiver 重写onReceive方法 ③ 写AndroidManifest.xml 主类: public class MainActivity extends Activity { Button button_send; @Override protected void onCreate(Bundle savedInstance

南花_的博客 2616

安卓基础之BroadcastReceiver

BroadcastReceiver 广播接收者 Android系统在运行过程中会产生很多事件,比如说打电话、开机、开关机等,为了让应用知道系统产生了这个事件,就需要发送一条对应的广播, 我们的App只要注册了广播接收者就可以接收到系统广播。 系统通过intent来发送广播,在发送时会遍历系统中清单文件,自定义广播接收者需要定义筛选器intent-filter来让系统进行匹配,如果系统发送广播时没有...

wygsqsj的博客 316
上一篇: (六)Android基础系列之:Service
下一篇: XML解析
azhoufeng
博客等级 码龄10年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值