广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。注册广播的方式一般有两种,在代码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册。

(1)动态注册监听网络变化

1、新建类继承自BroadcastReceiver,并重写onReceive()方法
2、创建了一个IntentFilter的实例,并给它添加了action
3、创建了一个新建类的实例
4、将IntentFilter的实例、新建类的实例都传了进去registerReceiver
5、调用unregisterReceiver()方法取消注册
6、配置文件中声明权限

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;
/*** 动态注册监听网络变化* 步骤1-6*/
public class MainActivity extends Activity {private IntentFilter intentFilter;private NetworkChangeReceiver networkChangeReceiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 2、创建了一个IntentFilter的实例,并给它添加了* 一个值为android.net.conn.CONNECTIVITY_CHANGE 的action;* 为什么要添加这个值呢?* 因为当网络状态发生变化时, 系统发出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播* 也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action*/intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//3、创建了一个NetworkChangeReceiver 的实例networkChangeReceiver = new NetworkChangeReceiver();//4、将NetworkChangeReceiver 的实例和IntentFilter 的实例都传了进去registerReceiver(networkChangeReceiver, intentFilter);}/*** 1、内部类继承自BroadcastReceiver,并重写onReceive()方法* 每当网络状态发生变化时,onReceive()方法就会得到执行**/class NetworkChangeReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//先通过getSystemService()方法得到了ConnectivityManager的实例//这是一个系统服务类,专门用于管理网络连接的ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);//调用它的getActiveNetworkInfo()方法可以得到NetworkInfo 的实例NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();//接着调用NetworkInfo 的isAvailable()方法,就可以判断出当前是否有网络了if (networkInfo !=null&&networkInfo.isAvailable()) {Toast.makeText(context, "network is available",Toast.LENGTH_LONG).show();}else {Toast.makeText(context, "network is unavailable",Toast.LENGTH_LONG).show();}}}/*** 5、动态注册的广播接收器一定都要取消注册才行* 这里我们是在onDestroy()方法中通过调用unregisterReceiver()方法来实现的。*/@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}/*** 6、Android系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则* 程序将会直接崩溃, 比如这里查询系统的网络状态就是需要声明权限的。打开AndroidManifest.xml 文件,* 在里面加入如下权限就可以查询系统网络状态了:* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>*/
}

(2)静态注册实现开机启动

动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。

静态注册使用步骤
1、新建类继承自BroadcastReceiver,并重写onReceive()方法
2、AndroidManifest.xml中标签,所有静态注册的广播接收器都是在这里进行注册的
3、通过android:name来指定具体注册哪一个广播接收器,
4、标签里加入想要接收的广播就行了,由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们在这里添加了相应的action。
5、监听系统开机广播也是需要声明权限的

/*** 1、新建一个BootCompleteReceiver 继承自BroadcastReceiver*/
public class BootCompleteReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();}
}
/*** 2、AndroidManifest.xml 中将这个广播接收器的类名注册进去*///监听系统开机广播也是需要声明权限的<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>//通过android:name来指定具体注册哪一个广播接收器<receiver android:name=".BootCompleteReceiver"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter>
</receiver>

(3)注意事项
不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive()方法运行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。

广播接收器动静态注册相关推荐

  1. android的动态注册,Android应用开发之BroadcastReceiver(广播)的静态注册和动态注册 --Android开发...

    本文将带你了解Android应用开发之BroadcastReceiver(广播)的静态注册和动态注册 --Android开发,希望本文对大家学Android有所帮助 BroadcastReceiver ...

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

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

  3. Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动

    为了便于进行 系统级别的消息通知,Android引入了一套广播消息机制. 1.广播机制简介: 因为Android中的每个应用程序都可以对自己感兴趣的广播尽心注册,这样程序只会接收自己所关心的广播内容, ...

  4. 创建广播接收器并注册广播

    发送广播:使用Intent 接收广播:广播接收器 创建广播接收器: 方法:新建一个类继承自BroadcastReceiver,并重写父类的onReceive( )方法.当有广播接收到的时候,onRec ...

  5. android 静态注册wifi广播,Android中BroadcastReceiver详解

    BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式.这些广播被发送当重要的事件发生的时候.例如,安卓系统发送广 ...

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

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

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

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

  8. 《第一行代码》学习笔记19-广播接收器Broadcast_Receiver(2)

    1.解决广播的安全性问题,Android引入了一套本地广播机制,使用该机制发出的广播只能够在应用程序内部进行传递,并且广播接收器只能 接收来自本应用程序发出的广播. 2.本地广播无法通过静态注册来接收 ...

  9. Android的广播接收器BroadcastReceiver

    一.广播分为标准广播,有序广播,本地广播.Android内置了很多系统广播,我们可以监听这些广播来得到系统信息,如开机完成后的广播,电池电量变化广播等等. 标准广播:系统内广播,任何应用几乎同时收到 ...

最新文章

  1. android realmax sdk,RealMax推出全新开源AR SDK 框架ARToolKit
  2. bzoj4427【Nwerc2015】Cleaning Pipes清理管道
  3. 《C++ Primer》13.1.6节练习(部分)
  4. mysql5.7.22打不开_windows下mysql-5.7.22-winx64突然启动不了,报错Could not open log file
  5. python 读取地震道头数据_【Python】OGR库(1):读取矢量数据
  6. 未转变者服务器未正常运行,未转变者Battleye服务不能正常运行 | 手游网游页游攻略大全...
  7. C++ 拷贝构造 与 赋值运算符重载
  8. url编码解码的三种方式
  9. Qt总结之十八:总结
  10. GdiPlus使用方法
  11. python出入库_基于Python对Excel数据入库的处理
  12. JavaWeb毕业生就业管理系统项目实战教程
  13. 电脑报独家报道:宽带升级全国真相调查
  14. 浅析桌面虚拟化给企业带来的价值
  15. htpp-server开启https服务终端报错问题
  16. 舍弗勒、斯凯孚、阿尔斯通、默沙东、联合利华、洲际、希尔顿、盖璞等外企在中国 | 美通社头条...
  17. 基础操作案例:ArcGIS PRO基础教程(二)
  18. 3分钟短文:Laravel路子真野啊!路由昵称前缀中间件
  19. 金融数量分析2:Markowitz均值方差模型
  20. 猿链猿哥:IKO,Initial Keepsake Offering,首次纪念品发行

热门文章

  1. 火狐浏览器无法打开本地php,php网站程序里setcookie在IE浏览器不能用,火狐浏览器可以浏览的问题...
  2. 【Java爬虫】学爬虫从简单的开始,无门槛小白都能学会,带你爬取豆瓣电影Top250
  3. keil忽略警告操作
  4. Pandas 导出excel表取消表头与行号方法详解
  5. 安卓OpenCV开发(五)小狗识别
  6. linux php mkfifo,Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close() - 52php - 博客园...
  7. 3D物联网之机房监控3D可视化解决方案
  8. Generics (泛型)
  9. 35岁了,还在投简历找工作?
  10. 你所不知道的js语言细节---1、函数的形参赋值