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. Javascript进阶篇——(DOM—节点---属性、访问节点)—笔记整理

    节点属性在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType : ...

  2. EF中的TPH、TPT、TPC

    1. Table Per Hierarchy(TPH):只建立一个表,把基类和子类中的所有属性都映射为表中的列2. Table Per Type(TPT):为基类和每个子类建立一个表,每个与子类对应的 ...

  3. Parser Error Message: Access is denied【转】

    PRB: Access Denied Error When You Make Code Modifications with Index Services Running View products ...

  4. C# Excel 读取为Datatable

    最近项目用到的读取Excel 为DataTable 兼容2003.2007.2010.记录一下,以后会用到 引用 NPOI.dll 和 EPPlus.dll using System; using S ...

  5. 内存管理pbuf.c源码解析——LwIP学习

    声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正. 本文自己尚有认为写的不完整的地方,源代码没有完全理清, ...

  6. log4net 使用步骤

    1.安装log4net 官网首页:http://logging.apache.org/log4net/ 下载地址:http://logging.apache.org/log4net/download_ ...

  7. 了不起的分支和循环01 - 零基础入门学习Python007

    了不起的分支和循环01 让编程改变世界 Change the world by program 我们今天的主题是"了不起的分支和循环",为什么小甲鱼不说C语言,不说Python了不 ...

  8. 灯塔(LightHouse)

    Description As shown in the following figure, If another lighthouse is in gray area, they can beacon ...

  9. Scala学习笔记--集合类型Queue,Set

    补充知识:http://www.importnew.com/4543.html 正文开始 scala.collection.immutable scala.collection.mutable 队列Q ...

  10. 学习Haskell的一些资料

    趣学Haskell指南: http://fleurer-lee.com/lyah/chapters.htm 对应的英文原文: http://learnyouahaskell.com/chapters ...