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)的更多相关文章

  1. Android学习笔记之Broadcast Receiver

    可程序间通信 注册通信,注销通信,发送消息 package com.jiahemeikang.helloandroid; import com.jiahemikang.service.EchoServ ...

  2. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

  3. 【转】Pro Android学习笔记(十二):了解Intent(下)

    解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...

  4. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  5. 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...

  6. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

  7. 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期

    在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...

  8. Android学习笔记:Home Screen Widgets(2):关于Widget

    通过widget定义,我们在widget列表中看到了我们的TestWidget.当我们拖拽widget到主页时,假设在appwidet-provider中定义了android:configure的ja ...

  9. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

随机推荐

  1. JS高级程序设计学习笔记之Date类型

    日期对象的创建:var now =new Date(),不传递参数时,对象自动获取当前时间.(若要创建特定日期与时间的对象,必须传入该日期距离1970/1/1零点的毫秒数). Date.parse() ...

  2. HTML页面之间跳转与传值(JS代码)

    跳转的方法如下: 方法一: window.location.href = "b.html"; 方法二(返回上一个页面,这个应该不算,先放在这): window.history.ba ...

  3. Asp.net实现在线人数统计功能代码实例

    application最经典的一个方法:统计在线人数,这需要借助于我们的全局应用程序类来对登录的用户信息进行统计: 以下是代码片段:    void application_start(object ...

  4. apache将请求转发到到tomcat应用

    映射: 1.开启apache中的proxy模块(proxy.conf,proxy.load,proxy_http.load) 2.配置apache配置文件,<VirtualHost *:80&g ...

  5. log在线生成器 html中如何设置浏览器中标题前的logo

    制作logo的地址:http://www.logomaker.com.cn/ 设置网站logo的方法 在<head></head>标签之间输入<link rel=&quo ...

  6. 在Eclipse中运行Nutch2.3

    参考http://wiki.apache.org/nutch/RunNutchInEclipse 一.环境准备 1.下载nutch2.3源代码 wget http://mirror.bit.edu.c ...

  7. LibSvm介绍---调用方法及参数介绍

        libsvm是著名的SVM开源组件,目前有JAVA.C/C++,.NET 等多个版本,本人使用的是2.82 libsvm命名空间下主要使用类: svm_model 为模型类,通过训练或加载训练 ...

  8. 【转】gcc warning: braces around scalar initializer (标量初始化的括号)

    原文网址:http://stackoverflow.com/questions/3462513/gcc-warning-braces-around-scalar-initializer I have ...

  9. hdu 1011 Starship Troopers_树状dp

    题目链接 题意:给你一棵树(必须从根节点出发),每个节点上都有bug和value,你有m个骑士,每个骑士能消灭20个bug,你必须消灭该节点的全部bug才能拿到该节点的value,问最多能拿到valu ...

  10. Java宝典(二)

    --String s = "a" + "b" + "c" + "d"; 一共创建了多少个对象? --对于如下代码: St ...