Android学习总结(五)———— BroadcastReceiver(广播接收器)的基本概念和两种注册广播方式
我们学完了Android四大组件的Activity和Service了,接下来我们一起来学习Android四大组件的第三个吧:BroadcastReceiver(广播接收者),计划如下图:

一.BroadcastReceiver的基本概念
举个形象的例子来理解下BroadcastReceiver,记得以前读书 的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如,开学要去搬书,广播: "每个班级找几个同学去教务处拿书",发出这个广播后,所有同学都会在同一时刻收到这条广播通知, 收到,但不是每个同学都会去搬书,一般去搬书的都是班里的"大力士",这群"大力士"接到这条 广播后就会动身去把书搬回可是!
其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,程序就只会接收到自己所关心的广播内容,这些广播可能来自于系统,也可能来自于其他应用程序。比如电量低或者充足,刚启动完,插入耳机,输入法改变等, 发生这些事件,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到 这个广播的时候做一些操作,比如:系统开机后,偷偷后台跑服务,这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver,当接收到开机广播就做些偷偷摸摸的勾当。
二.广播的使用示例
2.1 动态注册监听网络变化
广播的动态注册就是在java代码中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action,另外动态注册的广播,一定要调用unregisterReceiver()这个方法,让广播取消注册。
在onReceive()方法中完成广播要处理的事务,比如这里的提示Toast信息,如下:
package com.nyl.broadcasttest; import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends Activity { private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建IntentFilter的实例
intentFilter = new IntentFilter();
/**
* 当网络状态发生变化时,系统发出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播
* 也就是我们广播接收器想要监听什么广播,在这里添加相对应的Action就行了
*/
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
/**
* 实例化NetworkChangeReceiver的实例和IntentFilter的实例都传了进去,
* NetworkChangeReceiver就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE的广播,
* 也就实现了监听网络变化的功能
*/
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
} /**
* 动态注册的广播接收器一定都要取消注册才行,这里是在onDestroy()方法中通过调用
* unregisterReceiver()方法来实现的
*/
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
} //定义一个广播,继承自BroadcastReceiver
private class NetworkChangeReceiver extends BroadcastReceiver{
/**
* 重写了父类的onReceive()方法,
* 每当网络请求发生变化时,onReceive()方法就会得到执行
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"没有网络,请连接网络!",Toast.LENGTH_SHORT).show();
}
}
}
代码注释得很详细,现在运行一下程序,先把网络给关了,效果图如下:

2.2 静态注册实现开机启动
动态注册需程序启动后才能接受到广播,静态广播就弥补了这个短板,在AndroidManifest.xml中制定<IntentReceiver>就可以让程序在未启动的情况下接受到了广播。
程序接收一条开机广播,当收到这个广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。代码如下:
package com.nyl.broadcasttest; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class BootCompleteReceiver extends BroadcastReceiver{ private final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED"; @Override
public void onReceive(Context context, Intent intent) {
if (ACTION_BOOT.equals(intent.getAction())){
Toast.makeText(context,"开机完毕",Toast.LENGTH_SHORT).show();
}
}
}
在AndroidManifest.xml中对该BroadcastReceiver进行注册,添加开机广播的intent-filter!对了,别忘了加上android.permission.RECEIVE_BOOT_COMPLETED的权限哦!

把App安装到手机上,安装好之后我们的程序就可以接收开机广播了,为了看到效果,我把我的手机重新启动,当手机重新启动开机完毕后,我们的App就会收到系统的开机广播,弹出一个"开机完毕"的toast消息,效果如下:

这就是表示我们的App已经自动启动运行了。

Android学习总结(五)———— BroadcastReceiver(广播接收器)的基本概念和两种注册广播方式的更多相关文章
- Android 两种注册、发送广播的区别
前言:前面文章记录了Service的使用,这次来记录另一个四个组件之一的BroadcastReceiver.主要介绍两种发送和注册广播的区别. BroadcastReceiver广播接收者用于接收系统 ...
- 六、Android学习第五天——Handler的使用(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android 广播机制(两种注册方法)与中断广播
两种注册类型的区别是: 1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期.注意: 在activity结束前,移除广播接收器. 2)第二种是常驻型,也就是说当应用程序关闭后,如果有信 ...
- android环境下两种md5加密方式
在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- Android学习笔记--Broadcast, BroadcastReceiver(广播)
参考资料:http://www.cnblogs.com/playing/archive/2011/03/23/1992030.html 在 Android 中使用 Activity, Service, ...
- Android -- 简单广播接收与发送(2)--动态注册广播接收器
1. 效果图
随机推荐
- python读文件和写文件
f=open('D:\\wangdongjie\\files\\webservice\\baidu\\3.txt','r+') f.write('中国电视台1][][23qwe12f我是一个小小的石头 ...
- Linux 执行定时任务 shell脚本
Linux上面执行定时任务,我们可以利用crontab -e直接编辑定时任务 另外我们还可以写好shell脚本,定时去执行shell脚本,这两个方法都可以起到定时执行的作用 下面我详细说一下入如何执行 ...
- 极客时间_Vue开发实战_06.Vue组件的核心概念(2):事件
06.Vue组件的核心概念(2):事件 通过emit传递给父组件 我们点击了重置失败,上层的div的click=handleDivClick是接收不到.重置失败的点击的行为的 通常情况下,你不用.st ...
- sql server 2008 删除某数据库所有表
/* ------sqlserver 2008 删除某数据库所有表-------- */ declare @tname varchar(8000) set @tname='' select @tnam ...
- 环形文字 + css3制作图形 + animation无限正反旋转的一个小demo
少啰嗦,先看效果图: (注意文字和太极图均可旋转,太极图使用css写成的!) css: /*太极图css--*/ .Taiji { margin: 100px; width: 192px; heigh ...
- DP简单问题联系--最长递增子序列+最长公共子序列等
今天重温了一下dp问题,发现自己两个礼拜不写题目就什么都不会了...心态爆炸,感觉去考试怕是要gg了... 不过今天总结一下写的题目,全部都是基础的dp问题 第一个是 求最长不下降子序列的长度 第一行 ...
- 3D max模型导入unity 3D中注意事项
一.单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例.统一单位为米. ...
- 让你头晕的VR头显,背后发生了什么?
随着虚拟现实渐渐兴起,国内现在做虚拟现实的厂商也增多了起来.但是我经常听到有体验者向我表示:他戴上国外大厂诸如Oculus.Sony和Valve的VR头显的时候,体验十分出色,但是戴上国产的VR头显, ...
- jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)
这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...
- 洛谷CF895C Square Subsets(线性基)
洛谷传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题意: 给你n个数,每个数<=70,问有多少个集合,满足集合中所有数相乘是个完全平方数(空集除外) 题解: 完全看不出这玩意儿和线性基有什 ...