【Android入门到项目实战-- 5.1】—— 广播(一):接收系统广播

news2024/11/25 3:56:31

目录

一、什么是广播?

二、广播的类型

标准广播

有序广播

三、接收系统广播

1、动态注册监听网络变化

        如何注册广播接收器?

2、静态注册实现开机启动

使用快捷方式创建广播接收器

实现开机广播


一、什么是广播?

        android广播机制就是在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。

二、广播的类型

        Android中的广播主要可以分为两种类型:标准广播和有序广播。

标准广播

完全异步执行的广播,在广播发出之后, 所有的广播接收器 几乎 同一时刻收到
广播效率高 ,但 无法被截断

 

有序广播

同步执行的广播,发出后 同一时刻只有一个广播接收器能够收到 这条消息
优先级 :一个广播接收器逻辑 执行完毕之后 广播才会 继续传递 ,或被 截断不传

 

三、接收系统广播

        Android内置了很多系统级别的广播,可以在应用程序中通过监听这些广播来得到各种系统的状态信息,如:手机开机后、电池电量发生变化时发出的广播,如果要接收到这些广播,需要使用广播接收器。

1、动态注册监听网络变化

        注册广播的方式一般有两种:代码中注册和AndroidManifest.xml中注册,前者称为动态注册,后者称为静态注册。

        如何注册广播接收器?

        新建一个类继承BroadcastReceiver,并重写父类的onReceive()方法。每当有广播到来时,onReceive()方法会自动执行,具体逻辑在此方法中实现。

        下面尝试实现一个监听网络变化的广播,新建一个BroadcastTest项目,然后修改MainActivity代码,如下:

        首先定义了一个内部类NetworkChangeReceiver继承自BroadcastReceiver,并重写onReceive()方法,当网络变化时此方法会执行,getSystemService()方法得到了 ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接。

        onCreate()中有个android.net.conn.CONNECTIVITY_CHANGE,为什么添加这个,当网络发生变化时,系统发出的是一个值为android.net.conn.CONNECTIVITY_CHANGE的广播,这样实现了监听网络变化的功能。

        最后不要忘记,动态注册的广播接收器一定要取消注册!这里在onDestory()方法中通过unregisterReceiver()方法实现。

        另外,系统为保护用户设备的安全和隐私,必须在配置文件中声明权限才可以使用,否则直接崩溃。

        打开AndroidManifest.xml文件,加入以下代码即可:

        

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...............

    <uses-permission android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
........

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }
    protected void onDestroy(){
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            if(networkInfo != null && networkInfo.isAvailable()){
                Toast.makeText(context,"当前有网络",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(context,"当前没有网络",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

效果如下:

 

2、静态注册实现开机启动

        动态注册的广播接收器可以自由控制注册和注销,很灵活,但是它有个缺点:必须在程序启动后才能接收到广播,因为逻辑注册在onCreate()中。

        有什么方法可以让程序在未启动时就能接收到广播?静态注册可以解决。

        下面让程序接收一条开机广播;

使用快捷方式创建广播接收器

        使用Android Studio提供的快捷方式来创建一个广播接收器:右键com.example.broadcasttest包--> New  --> Other --> Broadcast Receiver,弹出如下窗口:

        这里将广播命名为BootCompleteReceiver,Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enabled属性表示是否启用这个广播接收器。

 然后修改其代码,如下:

public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
    }
}

        另外,静态广播接收器一定在AndroidManifest.xml中注册才能使用,我们是使用的快捷方式创建的广播接收器,注册这一步已经自动完成。

实现开机广播

        目前,BootCompleteReceiver还不能接收开机广播,需要修改AndroidManifest.xml文件,如下:

        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 是声明权限;

          <intent - filter>标签里加入了相应的action。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    ....................

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

    <application
      
    ......................

        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

     ...................
    </application>

</manifest>

广播还没有完成,下篇文章将要讲解自定义广播和使用本地广播。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/417576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最详细,Jmeter性能测试-性能进阶, 多协议实战Websocket/Dubbo(七)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 Jmeter是目前主流的…

自行车及电动自行车出口美国GCC认证要求

所有进口商和美国本土制造商都必须签发普通合格证书&#xff08;GCC&#xff09;证明其产品符合具体规定要求。进口商和本土制造商应向认可的第三方实验室提交样品测试其产品是否符合相关安全法规。提供第三方实验室测试报告&#xff0c;合格证书由进口商和本土制造商提供。在外…

pytorch通过不同的维度提高cifar10准确率

各个维度通过模型通过优化器通过batchsize通过数据增强总结当前网络的博客上都是普遍采用某个迁移学习训练cifar10&#xff0c;无论是vgg&#xff0c;resnet还是其他变种模型&#xff0c;最后通过实例代码&#xff0c;将cifar的acc达到95以上&#xff0c;本篇博客将采用不同的维…

九龙证券|300亿空袭,港股吓懵了!

港股再度大幅回调&#xff0c;腾讯成了“导火索”。 当地时刻4月11日&#xff0c;腾讯大股东Prosus发布公告称拟再度进行回购&#xff0c;作为回购方案的一部分&#xff0c;Prosus本周将采纳行动&#xff0c;把9600万股腾讯股票以凭据方式移入香港中心结算系统&#xff0c;以便…

八、市场活动-创建

需求分析 用户在市场活动主页面,点击"创建"按钮,弹出创建市场活动的模态窗口; 用户在创建市场活动的模态窗口填写表单,点击"保存"按钮,完成创建市场活动的功能. *所有者是动态的(//在现实市场活动主页面时&#xff0c;就从数据库中查询出所有用户并且…

基于ChatGLM-6b+Streamlit+QDrant+DuckDuckGo搭建本地问答机器人及缓解时效性问题方案

本地部署chatglm及缓解时效性问题的思路&#xff1a; 模型使用chatglm-6b 4bit&#xff0c;推理使用hugging face&#xff0c;前端应用使用streamlit或者gradio。 微调对显存要求较高&#xff0c;还没试验。可以结合LoRA进行微调。 缓解时效性问题&#xff1a;通过本地数据库…

word页码从指定页开始,具体设置步骤

word页码从指定页开始&#xff0c;具体设置步骤1、在文档页面&#xff0c;以目录后第一页为页码开始页为例&#xff0c;也就是正文第一页&#xff0c;首先将鼠标光标定位到目录页最后的位置2、在【布局】选项下点击【分隔符】选项。3、在分隔符中选择【分节符】下的【下一页】。…

深度学习-第T4周——猴痘病识别

深度学习-第T4周——猴痘病识别深度学习-第T4周——猴痘病识别一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签2、数据可视化3、检查数据4、配置数据集五、搭建CNN网…

Day943.持续集成流水线 -系统重构实战

持续集成流水线 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于持续集成流水线的内容。 从团队协作的角度上来看&#xff0c;在版本发布过程中&#xff0c;经常出现测试依赖开发手工生成制品、版本发布也从开发本地出版本的问题。而且项目架构如果从单体演进至组件…

MySQL-双主高可用

目录 &#x1f341;拓扑环境 &#x1f341;配置两台MySQL主主同步 &#x1f343;修改MySQL配置文件 &#x1f343;配置主从关系 &#x1f343;测试主主同步 &#x1f341;keepalived高可用 &#x1f343;keepalived的安装配置 &#x1f343;master配置 &#x1f343;slave配置 …

R -- 用psych包做因子分析

因子分析 因子分析又称为EFA&#xff0c;是一系列用来发现一组变量的潜在结构的办法。它通过寻找一组更小的&#xff0c;潜在的结构来解释已观测到的显式的变量间的关系。这些虚拟的、无法观测的变量称为因子&#xff08;每个因子被认为可以解释多个观测变量间共有的方差&…

【回眸】ChatGPT Plus(GPT4体验卡)

前言 没忍住诱惑&#xff0c;开了个GPT4.0的会员&#xff0c;给大家表演一波 开通成功 开始问问题 写一个CNN疲劳驾驶监测代码&#xff0c;要求{使用Python语言&#xff0c;使用包&#xff0c;能成功运行&#xff0c;需要调用电脑摄像头&#xff0c;要求GUI界面有一些参数…

Python爬虫框架的介绍

爬虫框架的介绍Scrapy框架Crawley框架Portia框架Newspaper框架Python-goose框架随着网络爬虫的应用越来越多&#xff0c;一些爬虫框架逐渐涌现&#xff0c;这些框架将爬虫的一些常用功能和业务逻辑进行封装。这些框架的基础上&#xff0c;根据自己的需求添加少量的代码&#xf…

【操作系统 os学习笔记】

操作系统一、第一章&#xff1a;操作系统概述Ⅰ. 操作系统的基本概念1.操作系统的概念1.1 什么是操作系统&#xff1f;1.2 计算机系统的构成1.3 OS是一种系统软件1.4 OS作为系统软件&#xff0c;做了哪些事情2.操作系统的目标和功能2.1 目标2.2 功能3.操作系统的特征3.1 并发3.…

C#基础学习--接口

目录 什么是接口 ​编辑声明接口 实现接口 接口是引用类型 接口和as运算符 实现多个接口 实现具有重复成员的接口 多个接口的引用 派生成员作为实现 ​编辑显式接口成员实现 接口可以继承接口 什么是接口 接口是指定一组函数成员而不实现它们的引用类型 要实现一个接口…

DevOps实践分享:4个实施步骤与6个关键设计

本文介绍了普元DevOps平台在金融行业实施落地的常用方法&#xff0c;以及在项目管理&#xff0c;代码管理&#xff0c;构建管理&#xff0c;制品管理&#xff0c;部署管理等模块针对一些典型客户场景的关键设计。目 录01 平台简介‍‍02 实施方法‍‍‍‍‍‍03 关键设计01平…

项目管理的误区之追着别人做监工

有的项目经理拿到一个项目&#xff0c;上来就开始各种努力&#xff0c;恨不得把十八般武艺都套上去。 有的项目经理急于推进项目&#xff1a;“活都分出去了&#xff0c;我要监督大家把事情做好吧。 我先在心里设定一个目标&#xff0c;然后费尽心力地把大家往一处赶&#xff…

( “树” 之 DFS) 617. 合并二叉树 ——【Leetcode每日一题】

617. 合并二叉树 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两…

css实现缺角功能、渐变、旋转、clip-path属性、矩形、边框、折角

文章目录1、缺角矩形2、缺角边框3、折角矩形4、clip-path属性1、缺角矩形 使用css3渐变实现缺角矩形&#xff0c;关于linear-gradient属性的介绍请移步至MDN。 ☺☺☺html部分☺☺☺ <div class"rectangle_box"><div class"left_top"></d…

【数据库】索引必知必会

什么是索引索引的好处索引的坏处创建索引的三种方式索引类型索引数据结构Hash表B树B树B树和B树的区别B树的最大优点面试题为什么索引结构默认使用B树&#xff0c;而不是B-Tree&#xff0c;Hash哈希&#xff0c;二叉树&#xff0c;红黑树?聚簇索引非聚簇索引聚簇索引和非聚簇索…