Android 30. 广播-Broadcast(一)
为了便于进行系统级别的消息通知,Android 引入了Broadcast
机制。
Android 中每个应用程序都可以对自己感兴趣的Broadcast
进行注册,其消息可能来自系统,也可能来自其他应用程序。
Android 的Broadcast 主要分为两种:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)
Normal broadcasts
在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会较高,但同时也意味着它是无法被截断的。
Ordered broadcasts
在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。
所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
接收系统广播
在代码中注册和在AndroidManifest.xml 中注册分别称为动态注册和静态注册
动态注册监听网络变化
例如我们想要接收当网络连接发生变化时系统发出的网络变化广播:
先定义一个继承自BroadcastReceiver
的类NetworkChangeReceiver
:
class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "network change", Toast.LENGTH_SHORT).show();}
}
在这个类中,我们可以做当我们收到系统广播后想做的事。
那我们该如何从大量的系统广播中滤出网络变化的广播呢?
实例化一个IntentFilter
,并为之添加action
:
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
(android.net.conn.CONNECTIVITY_CHANGE
就是当网络发生变化时系统发出的广播)
最后再将刚刚创建的类实例化,并根据intentFilter
注册接收器即可:
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
注意:动态注册的广播接收器一定都要取消注册
所以,最后,我们在onDestroy() 方法中完成取消注册操作
protected void onDestroy(){super.onDestroy();unregisterReceiver(networkChangeReceiver);
}
若要对网络具体连接状态进行响应:
(首先在AndroidManifest.xml 文件中添加访问网络状态权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
)
class NetworkChangeReceiver extends BroadcastReceiver{@RequiresApi(api = Build.VERSION_CODES.M)@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = null;if (connectivityManager != null) {networkInfo = connectivityManager.getActiveNetworkInfo();}if(networkInfo != null && networkInfo.isAvailable()){Toast.makeText(context, "network Yes", Toast.LENGTH_SHORT).show();}else {Toast.makeText(context, "network No", Toast.LENGTH_SHORT).show();}}
}
我们首先通过getSystemService()
方法得到ConnectivityManager
的实例,这是一个系统服务类,专门用于管理网络连接。
然后通过getActiveNetworkInfo()
方法得到networkInfo
的实例。
最后调用isAvailable()
方法判断当前是否已经有网络了
静态注册实现开机自启
在Project 视图中右击包名,然后New -> Other -> Broadcast Receiver
Exported
选择是否允许这个广播接收器接收本程序以外的广播,Enabled
选择是否启用这个广播接收器
创建好后会发现在AndroidManifest.xml 文件中:
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"></receiver>
但现在还并不能接收到开机广播,要修改一下:
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter>
</receiver>
修改过后还需要添加权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Android 30. 广播-Broadcast(一)相关推荐
- Android中的广播Broadcast详解
今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低.开机.锁屏等一些操作都会发送 ...
- Android 广播(Broadcast)
Android 广播Broadcast 1.小声嘀咕 2.广播机制简介 3.接收系统广播 3.1动态注册 3.2静态注册 4.发送自定义广播 4.1标准广播 4.2有序广播 5.使用本地广播 1.小声 ...
- Android 7.0 ActivityManagerService(5) 广播(Broadcast)相关流程分析
本篇博客旨在分析Android中广播相关的源码流程. 一.基础知识 广播(Broadcast)是一种Android组件间的通信方式. 从本质上来看,广播信息的载体是intent.在这种通信机制下,发送 ...
- android之广播,broadcast
android之广播,broadcast 1.什么是广播? android四大基本组件之一. 一种全局的监听器,用于监听系统全局的广播消息 系统大部分消息都是以广播的形式发布,比如开机启动的消息,收到 ...
- 品茗论道说广播(Broadcast内部机制讲解)
1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个不是本文关心的重点,我们希望探索得再深入一点儿.我想,许多人也不 ...
- 品茗论道说广播(Broadcast内部机制讲解)(上)
品茗论道说广播(Broadcast内部机制讲解)(上) 侯 亮 1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个 ...
- android java广播,[原]Android应用程序发送广播(sendBroadcast)的过程分析
前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来.ActivityManagerS ...
- B08_NumPy 广播(Broadcast)
NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b ...
- android 通过广播唤醒被杀死的app
今天,简单讲讲如何唤醒被杀死的app. 这个唤醒app主要通过广播来唤醒. 1. 静态广播唤醒 广播的exported属性和enabled属性 exported默认为true表示这个广播可以接收来自其 ...
最新文章
- DeepChem | 基于DeepChem的GCN预测化合物溶解度
- 复习笔记(七)——C++友元
- Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——例题9-3
- 计算机网络学习笔记-01-概念,组成,功能,分类
- Lucence.Net学习+盘古分词
- 一文彻底明白linux中的selinux到底是什么
- 高精度PSEnet文本检测在windows/linux运行教程
- 【语音识别】基于matlab GUI HMM中文语音识别【含Matlab源码 1385期】
- 【生信进阶练习1000days】day14-GenomicDataCommons(GDC)
- android webview最新版下载,AndroidWebView
- 830计算机软件综合大纲,2019年中国地质大学830计算机软件综合考试大纲.pdf
- python 完全背包问题_python背包问题
- c语言做游戏音效,游戏背后辛苦付出的劳动者—游戏音效师
- 删库跑路大神的一生,真狠人!
- 服务器的显示器无信号怎么解决办法,显示器无信号怎么办?显示器无信号解决办法大全...
- 小程序---验证input输入不能为空
- linux红帽子怎么配置dhcp,红帽7 配置dhcp服务器
- Android应用程序文件结构,Android项目文件及应用程序—目录结构详解
- Excel隔行插入空白行
- 用计算机0和1表达难舍之情,表达不舍之情的说说