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

news/2024/5/17 16:42:54/文章来源:https://blog.csdn.net/Tir_zhang/article/details/130118161

目录

一、什么是广播?

二、广播的类型

标准广播

有序广播

三、接收系统广播

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;@Overrideprotected 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{@Overridepublic 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 {@Overridepublic 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......................<receiverandroid: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.luyixian.cn/news_show_285760.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java高级特性 - 多线程基础(1)使用线程第1关:创建线程第2关:使用 Callable 和 Future 创建线程

目录 第1关&#xff1a;创建线程 头歌知识点总结&#xff1a; 第2关&#xff1a;使用 Callable 和 Future 创建线程 本题头歌知识点 本题详解&#xff1a; 第1关&#xff1a;创建线程 package step1; //请在此添加实现代码 //使用继承Thread类的方式创建一个名为 Thread…

【C++项目】高并发内存池

前言&#xff1a; 本篇博客大致记录基于tcmalloc实现高并发内存池的思想与实现方案。 使用语言&#xff1a;C&#xff0c;编译器&#xff1a;vs2022&#xff0c;开始时间&#xff1a;2023/4/3&#xff0c;结束时间&#xff1a;2023/4/12。 项目源码地址&#xff1a;Cproject: 我…

苹果智能戒指专利曝光,Find My技术加持不易丢

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果近日获得了一项“智能戒指”相关的设计专利&#xff0c;编号为“US 11625098 B2”。 这款智能戒指专利主要服务于增强现实&#xff08;AR&#xff09;或者虚拟现实&#xff08;VR&#xff09;场…

C语言CRC-16 MAXIM格式校验函数

C语言CRC-16 MAXIM格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同厂家通过对输入…

基于ESP32和blinker的红外小夜灯控制

一. 系统设计及框图&#xff1a; 本设计可以实现通过手机APP使用蓝牙或WIFI远程控制红外设备&#xff0c;也可以通过离线语音模块语音控制红外设备。可以控制市面上常见的NEC格式的红外设备, 这里是控制小夜灯&#xff0c;其它红外设备在控制原理上是相通的。本设计可用作课程…

如何免费使用ChatGPT 4?

自从ChatGPT发布以来&#xff0c;它就取得了巨大的成功。无论是常春藤法学考试还是商学院作业&#xff0c;ChatGPT都被用于各种试验。统计数据显示&#xff0c;ChatGPT每月吸引约9600万用户。随着ChatGPT的巨大成功&#xff0c;Open AI最近推出了它的最新版本&#xff0c;名为“…

Docker本地推送到hub,以及上传时遇到的问题解决

1.在本地创建一个 Dockerfile FROM ubuntu:latest RUN apt-get update && apt-get install -y curl CMD ["curl", "https://www.baidu.com"]2.在本地构建 Docker 镜像 在创建本地docker镜像的时候[TAG] .和[TAG] /PATH/TO 需要注意dockerfile文件…

Rust China Conf 2023 筹备启动:议题征集开始

大会介绍Rust China Conf 2023 由 Rust 中文社区发起主办、知名企业和开源组织联合协办&#xff0c;是年度国内规模最大并唯一的 Rust 线下大型会议&#xff0c;深受 Rust 中文社区开发者与相关企业的喜爱与推崇。本次大会为线下会议&#xff0c;将于6月17日-18日在上海举办&am…

企业推广常用的网络推广方法有哪些?

网络推广是指通过互联网向目标用户推广产品、服务或品牌的过程&#xff0c;其主要目的是为了扩大业务范围&#xff0c;提高企业知名度&#xff0c;增加销售额。在当今的数字化时代&#xff0c;网络推广已经成为了企业不可或缺的一部分。本文将介绍一些常见的网络推广方法和途径…

yolov5详解与改进

https://github.com/z1069614715/objectdetection_script YOLOV5改进-Optimal Transport Assignment Optimal Transport Assignment&#xff08;OTA&#xff09;是YOLOv5中的一个改进&#xff0c;它是一种更优的目标检测框架&#xff0c;可以在保证检测精度的同时&#xff0c…

一份两年前一个月的工作经历没写在简历上,背调前主动坦白,却被背调公司亮了红灯,到手的offer没了!...

只因为简历上漏写了一份一个月的工作&#xff0c;就被亮了背调红灯&#xff0c;这公平吗&#xff1f;一位网友就被狠狠坑了一把&#xff0c;来看下他的遭遇&#xff1a;他有一份两年前、时长一个月的工作经历没写在简历上&#xff0c;背调前主动和背调公司还有招聘方hr都说了这…

【Linux】浅析Input子系统

文章目录1. 框架1.1 数据结构1.2 evdev_handler1.3 evdev_init1.4 input_register_handler2. 应用如何打开节点并读取到事件数据2.1 evdev_fops2.2 evdev_open2.3 evdev_release2.4 evdev_read2.5 evdev_write2.6 evdev_poll2.7 evdev_fasync2.8 evdev_ioctl2.9 evdev_ioctl_co…

opcua 获取自定义结构体的成员值

示例中的节点值的数据类型为自定义的多层嵌套的结构体如下: 获取改结构体的成员值: import opcua from opcua import ua from opcua.ua import uatypesdef user_defined_vars(value_dict, # 自定义数据类型的变量值name_prefix, # 成员名前缀比如aa.bbdata_dict2, # 用…

API 接口设计

1、场景描述 比如说我们要做一款 APP&#xff0c;需要通过 api 接口给 app 提供数据。假设我们是做商城&#xff0c;比如我们卖书的。我们可以想象下这个 APP 大概有哪些内容&#xff1a; 1&#xff09;首页&#xff1a;banner 区域&#xff08;可以是一些热门书籍的图片做推广…

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组题解+个人总结

提示&#xff1a;此题解为本人自己解决&#xff0c;如有差错请大家多多指正。 文章目录题解总结一、幸运数1.试题2.解法3.代码二、[有奖问答](https://blog.csdn.net/A2105153335/article/details/130038980?spm1001.2014.3001.5501)三、[平方差](https://blog.csdn.net/A2105…

js flyout 2: VScroll

目录版权描述测试页面showFlyout问题1 - scroll 实现可能不准?问题2 - 容器内容重排可导致浮层错位关于重排小结附录 - 完整代码版权 本文为原创, 遵循 CC 4.0 BY-SA 版权协议, 转载需注明出处: https://blog.csdn.net/big_cheng/article/details/130101031. 文中代码属于 pu…

数据结构与算法01 稀疏数组

稀疏数组问题 当一个二维数组中大部分数据都是0&#xff0c;对这个数组直接进行存储会很浪费空间&#xff0c;因此利用稀疏数组进行压缩&#xff0c;稀疏数组第一行的第一个元素是原二维数组行数。&#xff0c;第一行的第二个元素是原二维数组的列数&#xff0c;如图为11行11列…

6.S081——虚拟内存部分——xv6源码完全解析系列(4)

0.briefly speaking 点击跳转到上一篇博客 好&#xff0c;现在进入下一个话题&#xff0c;就是物理内存分配器(kernel/kalloc.c)。在简单介绍完内核态的物理内存分配器之后&#xff0c;之后简单带过一下两个头文件riscv.h和memorylayout.h这两个头文件&#xff0c;因为它们都…

2.5d风格的游戏模式如何制作

文章目录一、 介绍二、 绘制瓦片地图三、 添加场景物体&#xff0c;添加碰撞器四、 创建玩家五、 创建玩家动画六、 玩家脚本七、 2d转换成2.5d八、 “Q”键向左转动视角、“E”键向右转动视角九、 下载工程文件一、 介绍 制作一个类似饥荒风格的2.5d游戏模板。 2.5D游戏是指以…

表id自增的方法

数据库主键id自增的方法&#xff0c;列举了几种如下 一、数据库自增&#xff08;部分数据库支持&#xff09; 创建表的时候设置id自增即可&#xff0c;或者后期修改表id自增 # mysql 语法 create table your_table_name(id bigint(20) not null auto_increment primary key …