发送广播:使用Intent

接收广播:广播接收器

创建广播接收器:

方法:新建一个类继承自BroadcastReceiver,并重写父类的onReceive( )方法。当有广播接收到的时候,onReceive( )中的逻辑就会得到执行

注册广播:

  1. 动态注册广播:在代码中注册
  2. 静态注册广播:在AndroidManifest.xml文件中注册

1. 动态注册广播

例子:实现监听网络变化的功能

修改MainActivity中的代码:

public class MainActivity extends Activity {private IntentFilter intentFilter ;private NetworkChangeReceiver networkChangeReceiver ;@Overrideprotected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState) ;setContentView (R.layout.activity_main);intentFilter.addAction ("android.net.conn.CONNECTIVITY_CHANGE") ;networkChangeReceiver = new NetworkChangeReceiver () ;registerReceiver (networkChangeReceiver , intentFilter) ;}@Overrideprotected void onDestroy () {super.onDestroy() ;unregisterReceiver (networkChangeReceiver) ;}class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive (Context context , Intent intent) {Toast.makeText (context , "network change" , Toast.LENGTH_SHORT).show() ;}}
}

效果:当我们开关数据的时候,就会出现提醒 “network change”

解析:

Step 1:首先,我们先创建了一个广播接收器,叫做NetworkChangeReceiver

class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive (Context context , Intent intent) {Toast.makeText (context , "network change" , Toast.LENGTH_SHORT).show() ;}
}

可见,NetworkChangeReceiver继承自BroadcastReceiver,并且我们重写了其中的onReceive ( )方法,添加了自己的逻辑—–加了一段Toast提醒

Step 2:创建一个IntentFilter对象

private IntentFilter intentFilter ;

Step 3:为IntenFilter添加action,监听某种广播

(系统网络状态发生变化时候,会发出一条action为”android.net.conn.CONNECTIVITY_CHANGE”)

intentFilter.addAction ("android.net.conn.CONNECTIVITY_CHANGE") ;

Intent和IntentFilter的区别:

初看我也很会混淆Intent和IntentFilter,不知道为什么动态注册广播使用IntentFilter.addAction( )而不使用Intent.addAction( )

Intent

一般用于启动活动,服务,组件,发送广播等等,是一种意图

所以,一个Intent只能有唯一的action,作为它启动的活动,或是组件等的唯一标识符

IntentFilter

顾名思义,是一种过滤器,Intent的过滤器。

它只有被用在动态注册广播中

看着很熟悉吧,在AndroidManifest.xml中,每一个activity中都有一个<intent-filter>的标签,它里面描述了activity的各种属性,action,category,data,可以供Intent来匹配。

发送给应用程序的广播多种多样,十分多,怎么样才可以过滤掉我们不想要的广播呢?靠的就是IntentFilter。使用它的addAction( )方法,可以为它添加过滤的字符(有点类似Logcat中的filter),从而在许多广播中找到我们需要的广播

所以,一个IntentFilter可以有多个action作为过滤标识符

Step 4:创建一个广播接收器的实例(我们Step 1创建好的广播接收器NetworkChangeReceiver)

networkChangeReceiver = new NetworkChangeReceiver () ;

Step 5:注册广播

调用registerReceiver( )方法来注册

registerReceiver (networkChangeReceiver , intentFilter) ;

该方法带有两个参数:

  1. 第一个参数是广播接收器,描述是广播是谁收到的
  2. 第二个参数是IntentFilter,描述收到哪些广播

Step 6:在活动销毁时注销广播

我们重写onDestroy( )方法,添加注销广播的代码

调用unregisterReceiver( )方法

@Override
protected void onDestroy () {super.onDestroy () ;unregisterReceiver (networkChangeReceiver) ;
}

该方法带有一个参数

  1. 参数是广播接收器,描述销毁的是哪个广播接收器

优化广播接收器:

显然,只有提醒网络变化很不人性化,应该还要提醒网络是否可用

我们这样修改NetworkChangeReceiver中的onReceive( )方法

@Override
public void onReceive (Context context , Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE) ;NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo (); if (networkInfo != null && networkInfo.isAvailable()) {Toast.makeText (context , "network is available" , Toast.LENGTH_SHORT).show() ;}else {Toast.makeText (context , "network is unavailable" , Toast.LENGTH_SHORT).show () ;}
}

首先,ConnectivityManager是一个系统服务类,专门管理网络连接。调用getSystemService ( )方法,得到它的实例

通过值为Context.CONNECTIVITY_SERVICE来找到它的实例

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE) ;

然后,NetworkInfo,从名字上看就知道,这是一个带有网络连接方面信息的对象。我们通过getActiveNetworkInfo( )方法来得到当前的NetworkInfo实例

NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo () ;

最后可以通过isAvailable( )方法来得知网络是否可用

networkInfo.isAvailable()

然后,一切看起来万事大吉,今晚吃鸡了,我们开开心心run代码。会很难过地发现,程序崩溃了。这是为什么?

原来是因为Android系统为了保证应用程序的安全性做了规定:如果程序需要访问一些系统的关键信息,必须在配置文件中声明权限才可以,否则程序会直接崩溃。

那么,我们便需要在配置文件,也就是AndroidManifest.xml中作出加入查询网络状态的权限

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

优点:灵活,可以自由地控制注册和注销

缺点:必须要在程序启动之后才能接收广播

2. 静态注册广播

例子:我们让程序接收一条开机广播,然后出现提醒

Step 1:创建一个广播接收器

这里创建广播接收器和动态注册的时候有什么不同呢?动态注册广播,我们采用的是在MainActivity.java中定义了内部类的方式,然后在onCreate( )中使用registerReceiver( )方法来动态注册,随时随地注册。而我们这次是要接收开机广播,程序都还没启动,onCreate( )方法都还没有被调用,显然,内部类已经无法满足我们这次的需求

所以,这次我们新建了一个文件叫BootCompleteReceiver.java,里面是一个新建类继承自Broadcast,然后可以在配置文件中进行注册,从而实现开机启动,接收开机广播的功能

BootCompleteReceiver.java

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

Step 2:在配置文件中将广播接收器的类名注册进去

AndroidManifest.xml

<manifest
    ……>……<uses-permission android:name = "android.permission.RECEIVE_BOOT_COMPLETED">……<application
        ……>……<receiver android:name = ".BootCompleteReceiver"><intent-filter><action android:name = "android.intent.action.RECEIVE_BOOT_COMPLETED"/></intent-filter></receiver></application>
</manifest>

开机信息自然也是系统关键信息,所以也需要和网络连接那样声明权限

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

然后是注册广播接收器的代码,使用了<receiver>的标签;这个标签里面的android:name属性,指明了类名,说明了是哪个广播接收器;然后是这个标签之间的<intent-filter>标签(动态注册用IntentFilter对象,静态注册用<intent-filter>标签),里面的<action/>标签里的android:name属性指明了可以接收的广播的action属性,开机时系统发出的广播的值是”android.intent.action.BOOT_COMPLETED”,所以这里可以接受的广播的action就是上面这个值

<receiver android:name = ".BootCompleteReceiver"><intent-filter><action android:name = "android.intent.action.RECEIVE_BOOT_COMPLETED"/></intent-filter>
</receiver>

然后我们开开心心run代码,关机然后开机,就可以发现一开机这个程序就会自启动然后出现”Boot Complete”的提醒

优点:可以让程序在未启动的情况下接收广播

(动态注册应该和静态注册结合使用,来接收不同的广播)

创建广播接收器并注册广播相关推荐

  1. 自定义动态注册广播和静态注册广播

    一.动态注册 关键代码 class MyActivity extentds Activity{//DYNC_BROADCAST可以随意,但注册广播和发送广播时action应该保持一致private s ...

  2. 安卓应用安全指南 4.2.3 创建/使用广播接收器 高级话题

    4.2.3 创建/使用广播接收器 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC ...

  3. 安卓应用安全指南 4.2.1 创建/使用广播接收器 示例代码

    4.2.1 创建/使用广播接收器 示例代码 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC ...

  4. Android 广播接收器注册与注销源码分析

    注册广播接收器 Android系统的广播机制是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息其实就是注册广播接收器.在Android的 ...

  5. android registerreceiver传参数,Android应用程序注册广播接收器(registerReceiver)的过程分析...

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息其实就是注册广播接收器,本文 ...

  6. Android应用程序注册广播接收器 registerReceiver 的过程分析

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 前面我们 ...

  7. Android安全问题 抢先接收广播 - 内因篇之广播接收器注册流程

    导读:本文说明系统是如何注册动态广播以及静态广播,这里主要注意其注册的顺序 这篇文章主要是针对我前两篇文章 android安全问题  抢先开机启动 - 结果篇 android安全问题  抢先拦截短信 ...

  8. 安卓应用安全指南 4.2.2 创建/使用广播接收器 规则书

    4.2.2 创建/使用广播接收器 规则书 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC- ...

  9. Android组件系列----BroadcastReceiver广播接收器

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. AC日记——小书童——刷题大军 洛谷 P1926
  2. FMDB/SQLCipher数据库管理
  3. Android permission 访问权限一览
  4. 人脸登陆facelogin
  5. LeetCode(#1)————Two Sum
  6. 2016年《大数据》杂志调查问卷
  7. 【Flutter】Dart的数据类型listMap(数组和字典)
  8. 53. PHP 伪静态(2)
  9. SAP-MM MRP类型详解
  10. 计算机初始化,怎么初始化电脑 电脑要如何初始化教程
  11. ping命令显示时间
  12. CASH软件分析差异性可变剪接
  13. 中国联通广州软件研究院 软件开发岗二面(技术面)
  14. Saladict 沙拉查词
  15. 一文搞定计算机网络面试题
  16. Tkinter写一个音乐下载器
  17. ElementUI-table切页保存已勾选和被取消勾选(附默认选中)
  18. 广州公布“中国制造2025”实施方案
  19. 数理思维——数学运算
  20. 戴尔t410服务器cpu型号,戴尔PowerEdge T410 最新第11代服务器

热门文章

  1. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器
  2. C语言在子函数中调用malloc申请内存的方法【转】
  3. 全国专业技术人员计算机应用能力考试
  4. 如何通过PS把LOGO的背景色变透明
  5. SVM推导过程注解(一)
  6. MySQL EXPLAN优化成本常数简介
  7. 查到一个好用的汉字转拼音封装类
  8. centos7实现磁盘挂载,解挂,开机自动挂载,解决挂载文件覆盖问题
  9. 绿卡日记:2020-09-25
  10. SpringBoot+Vue前后端分离实战(用户注册登录)