为了便于进行系统级别的消息通知,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(一)相关推荐

  1. Android中的广播Broadcast详解

    今天来看一下Android中的广播机制,我们知道广播Broadcast是Android中的四大组件之一,可见他的重要性了,当然它的用途也很大的,比如一些系统的广播:电量低.开机.锁屏等一些操作都会发送 ...

  2. Android 广播(Broadcast)

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

  3. Android 7.0 ActivityManagerService(5) 广播(Broadcast)相关流程分析

    本篇博客旨在分析Android中广播相关的源码流程. 一.基础知识 广播(Broadcast)是一种Android组件间的通信方式. 从本质上来看,广播信息的载体是intent.在这种通信机制下,发送 ...

  4. android之广播,broadcast

    android之广播,broadcast 1.什么是广播? android四大基本组件之一. 一种全局的监听器,用于监听系统全局的广播消息 系统大部分消息都是以广播的形式发布,比如开机启动的消息,收到 ...

  5. 品茗论道说广播(Broadcast内部机制讲解)

    1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个不是本文关心的重点,我们希望探索得再深入一点儿.我想,许多人也不 ...

  6. 品茗论道说广播(Broadcast内部机制讲解)(上)

    品茗论道说广播(Broadcast内部机制讲解)(上) 侯 亮 1 概述 我们在编写Android程序时,常常会用到广播(Broadcast)机制.从易用性的角度来说,使用广播是非常简单的.不过,这个 ...

  7. android java广播,[原]Android应用程序发送广播(sendBroadcast)的过程分析

    前面我们分析了Android应用程序注册广播接收器的过程,这个过程只完成了万里长征的第一步,接下来它还要等待ActivityManagerService将广播分发过来.ActivityManagerS ...

  8. B08_NumPy 广播(Broadcast)

    NumPy 广播(Broadcast) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b ...

  9. android 通过广播唤醒被杀死的app

    今天,简单讲讲如何唤醒被杀死的app. 这个唤醒app主要通过广播来唤醒. 1. 静态广播唤醒 广播的exported属性和enabled属性 exported默认为true表示这个广播可以接收来自其 ...

最新文章

  1. DeepChem | 基于DeepChem的GCN预测化合物溶解度
  2. 复习笔记(七)——C++友元
  3. Visual C++——黄维通《 Visual C++面向对象与可视化程序设计》——例题9-3
  4. 计算机网络学习笔记-01-概念,组成,功能,分类
  5. Lucence.Net学习+盘古分词
  6. 一文彻底明白linux中的selinux到底是什么
  7. 高精度PSEnet文本检测在windows/linux运行教程
  8. 【语音识别】基于matlab GUI HMM中文语音识别【含Matlab源码 1385期】
  9. 【生信进阶练习1000days】day14-GenomicDataCommons(GDC)
  10. android webview最新版下载,AndroidWebView
  11. 830计算机软件综合大纲,2019年中国地质大学830计算机软件综合考试大纲.pdf
  12. python 完全背包问题_python背包问题
  13. c语言做游戏音效,游戏背后辛苦付出的劳动者—游戏音效师
  14. 删库跑路大神的一生,真狠人!
  15. 服务器的显示器无信号怎么解决办法,显示器无信号怎么办?显示器无信号解决办法大全...
  16. 小程序---验证input输入不能为空
  17. linux红帽子怎么配置dhcp,红帽7 配置dhcp服务器
  18. Android应用程序文件结构,Android项目文件及应用程序—目录结构详解
  19. Excel隔行插入空白行
  20. 用计算机0和1表达难舍之情,表达不舍之情的说说

热门文章

  1. 9-5日度小满金融Java研发工程师笔试
  2. tp交换机管理页面_TP-Link路由器作为无线交换机怎么设置【设置方法】
  3. 打开网页被Java拦截怎么办_应用程序已被java安全阻止怎么办
  4. Java开源技术分享交流群
  5. 推荐收藏 | 京东群体风险感知,了解风控全流程
  6. 【转】 很美的句子,句句掉泪,不知道原创是谁,感谢
  7. 该内存不能为“read”的几个解决方案
  8. HTML CSS JS基础
  9. 88个国外音乐网站推荐
  10. 执行git stash pop时的冲突解决