Android学习笔记--广播(Broadcast)
1、Android广播分类
android的广播类型分为两类:标准广播和有序广播。
标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播。打个比方:做地铁过程中的语音播报,当列车员(广播发出者)进行语音播报(发送广播)时,所有乘客(注册接收该广播的程序)都可以同时听到语音,不分先后顺序。 在android系统中存在此类的广播有启动完成、电量变化等;
有序广播:同步发送,广播发出后,按照注册了的广播接收器的优先级顺序广播,优先级的范围是-1000~1000,数字越大,优先级越高,最先接收到该广播,接收器的优先级通过android:priority设置。打个比方:在接力赛中,接力棒就是广播的内容,需要运动员依次传递,优先级高的运动员位置靠前,优先级的运动员位置靠前,运动员接力的过程就是广播的过程。当然,要是有个运动员觉得:哎,这个接力棒当门栓不错,兜里一装回家了,后面的运动员自然不能接收到这个广播了。android系统中的短信就是以这种形式进行广播,我们手机上安装的XX卫士,XX安全大师的短信拦截功能就是把自身接收短信的优先级高于系统的短信应用,达到拦截短信的目的。
2、接收广播(BroadcatReceiver)
接收广播前需要注册自身关心那些广播,注册方式有两种,动态注册和静态注册。
2.1 动态注册
动态检测即当程序开始运行后进行注册接收,在程序未启动的状态在,不接受此广播,
下面以检测网络状态为例,实现其核心代码
1、实现广播接收器
/*所有广播接收器都需要继承BroadcastReceiver*/
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*do something*/
}
}
2、注册广播接收器
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 = new IntentFilter();
/*设置监听网络状态变化的广播*/
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
/*注册该广播*/
registerReceiver(networkChangeReceiver, intentFilter);
}
…
}
3、在AndroidMainfest.xml中声明申请获取网络状态权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
/*声明申请获取网络状态权限*/
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
...
</manifest>
4、注销广播接收器
public class MainActivity extends Activity {
…
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
…
}
2.2 静态注册
静态注册是指在程序未运行的情况下同样可以接收该广播,从而启动程序。
1、实现广播接收器(需要单独建文件实现)
/*所有广播接收器都需要继承BroadcastReceiver*/
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*do something*/
}
}
2、在AndroidMainfest.xml中声明申请获取网络状态权限和声明广播接收器
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
/*声明申请获取网络状态权限*/
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
...
<application>
...
/*声明广播接收器*/
<receiver android:name=".NetworkChangeReceiver">
<intent-filter android:priorit="1000">
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
...
</application>
</manifest>
3、发送广播(sendBroadcast)
3.1 发送标准广播
发送标准广播代码
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.putExtra(“XLZH”, “this is a user-defined broadcast!”)
sendBroadcast(intent);
com.example.broadcast.MY_BROADCAST是自定义的广播,如要有其他应用程序需要监听该广播,则需要进行动态或者静态注册
3.1 发送有序广播
发送有序广播代码
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.putExtra(“XLZH”, “this is a user-defined broadcast!”)
sendOrderedBroadcast(intent);
4、本地广播(LocalBroadcast)
如果广播有带有用户的敏感消息,不想让其他应用程序监听,此时可以使用本地广播,仅在应用程序内部进行广播和接收操作
1、实现广播接收器
/*所有广播接收器都需要继承BroadcastReceiver*/
class LocalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/*do something*/
}
}
2、注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
LocalBroadcastReceiver localReceiver = new LocalBroadcastReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
3、发送本地广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
intent.putExtra("XLZH", "This is a localBroadcast!");
localBroadcastManager.sendBroadcast(intent);
com.example.broadcasttest.LOCAL_BROADCAST是自定义的本地广播,与标准广播不同的是需要调用LoaclBroadcastManager的Instance()方法获得实例,发送自定义的注册广播接收器的时候分别使用的LocalBroadcastManager的sendBroadcast()方法和registerReceiver()方法
另外本地广播只能动态注册,不能静态注册
Android学习笔记--广播(Broadcast)的更多相关文章
- Android学习笔记之Broadcast Receiver
可程序间通信 注册通信,注销通信,发送消息 package com.jiahemeikang.helloandroid; import com.jiahemikang.service.EchoServ ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】Pro Android学习笔记(十二):了解Intent(下)
解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- Android学习笔记:Home Screen Widgets(2):关于Widget
通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的ja ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
随机推荐
- Javascript进阶篇——(DOM—节点---获取浏览器窗口可视区域大小+获取网页尺寸)—笔记整理
浏览器窗口可视区域大小获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:一.对于IE9+.Chrome.Firefox.Opera 以及 Safari: • window.innerH ...
- C# byte[]与char[]、string与char[]、byte[] 与 string 互转
1. byte array -> char array Byte[] b=new byte[5]{0x01,0x02,0x03,0x04,0x05}; Char[] c=Encoding.AS ...
- 如何安装windows7系统
在XP时代,光驱对于我们而言仅仅是装系统用,不过在Win7发布之后,可以用U盘直接安装,省时省力. 首先在互联网下载UltraISO光盘映像文件制作/编辑/格式转换工具,(当然还有其它如WinIS ...
- FineUI按钮控件
按钮的状态与大小 按钮有启用/禁用,按下/正常几种状态,对应的属性分别为Enabled.EnablePress.Pressed三个属性. 按钮有大中小三个尺寸,对应的属性为Size. 按钮上的图标 按 ...
- CUICatalog: Invalid asset name supplied:
[UIImage imageNamed:name];但是这个name却是空的,所以就报了这个错了. 解决方法,在项目中搜索UIImage imageNamed:,然后打印看看所谓的name是否为空.找 ...
- 洛谷 P3392 涂国旗
P3392 涂国旗 题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(> ...
- 医院设置 codevs 2577
Floyd+二叉树 #include<iostream>#include<cstdlib>#include<cstdio>#include<cstring&g ...
- c#按键Up和Down对Textbox的内容加1减1
private void textBox_proc1value_KeyDown(object sender, KeyEventArgs e) { Keys key = e.KeyCode; if (e ...
- 使用json常用到的包有以下六个
使用json常用到的包有以下六个 1. commons-logging-1.0.4.jar 2. commons-lang-2.3.jar 3. commons-collections-3.2.jar ...
- editor.md实现Markdown编辑器
editor.md实现Markdown编辑器 Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可 ...