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. SQL获取选中时间的交集

    如上图:t1,t2代表要选择的时间段,t3,t4代表系统时间. 那么如果要获取选中时间段所有的交集为: 条件1 and ((t3>t1 and t1>t2) or (t3<t2 an ...

  2. java文件读写的两种方式

    今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...

  3. HDU 4810 这道题 是属于什么类型?

    统计每一位出现1的个数  求组合数 直接贴代码 #include <iostream> #include <cstdio> #include <cmath> #in ...

  4. birt报表图标中文显示为框框的解决方法

    birt报表中图标部分的中文显示为框框,其他部分中文显示正常 解决办法:修改jdk中的字体设置/jdk1.6.0_13/jre/lib /fonts/fonts.dir 1.将宋体字体copy到/jd ...

  5. PHP学习路上的一点心得

    继学些了java后,接触php的项目后发现 php真的也是很强大的一门语言,这只是一篇回想,想到什么就写什么把,大家随便看看. 1.php其实无需等待,一般的改完代码后直接刷新页面即可,不需要像jav ...

  6. POJ3041 二分图最大匹配

    问题:POJ3041 分析: 构造二分图:令A = B = { 1, 2, ... , n }, 分别代表行号集与列号集.假如第i行第j列有一颗行星,则连接Ai与Bj, 表示必须从Ai(即第i行),B ...

  7. 最长公共子序列--nyoj36

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  8. CoreData概略

    CoreData概略 分类: IOS开发2013-10-25 16:19 178人阅读 评论(0) 收藏 举报 CoreData是IOS对数据进行对象化管理的一种高效方式,提供了对数据的增.删.查.改 ...

  9. LeetCode_Palindrome Number

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  10. Keil C51怎样将子程序段定位在固定的地址位?

    以下2问题均要用C51解决1.怎样将1个子程序段定位在1个固定的地址位置?例如将 INT BCD2HEX(INT XX)定位在1000H2.如何在EEPROM 中固定的位置存放1字符串?如在200H处 ...