目录(?)[-]

  1. 基础小例子
  2. 发送Broadcast intent
  3. 运行情况
  4. 应用间的广播

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/

和activity、content provider以及service一样,BraodcastReceiver是Android的组件。广播接收器接收广播消息,并进行相应地处理。广播消息就是Android的broadcast intent。一个broadcast intent可以触发多个接收器。

基础小例子

小例子很简单,通过菜单触发发送Broadcast,然后通过Logcat观察接收器情况。

发送Broadcast intent

private void sendBroadcast(){ 
    //为了保证action的唯一性,通常采用包名的namespace。 
    String actionString = "cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc";
    Intent bcIntent = new Intent(actionString); 
    bcIntent.putExtra("message", "No " + (count ++)); 
    Log.v("Main","Before send"); 
    //组件(acivity或者service)使用sendBrocast()进行发送广播消息,参数则是intent。
    sendBroadcast(bcIntent); 
    Log.v("Main","After send"); 
}

Broadcast接收器

接收器实现很简单,继承BroadcastReceiver,同时要在manifest文件中通过<receiver>的tag来注册要监听的广播intent,我们也可以在运行时在代码中进行注册。

public class TestReceiver extends BroadcastReceiver{ 
    private String tag = "TestReceiver"; 
    @Override //收到广播的回调函数
    public void onReceive(Context context, Intent intent) { 
        Utils.logThreadSignature(tag); //显示Thread的信息
        Log.v(tag,"context = " + context); 
        Log.v(tag,"this = " + this); 
        Log.v(tag,"intent = " + intent); 
        String message = intent.getStringExtra("message"); 
        Log.v(tag,"message : " + message); 
    } 
}

需要通过AndroidManifest.xml告诉系统需要接受broadcast消息。<receiver>和其他组件一样是<application>的node。

<receiver android:name=".TestReceiver"> 
    <intent-filter > 
        <action android:name="cn.flowingflying.proandroid.testbrocastreceiver.intent.testbc" />
    </intent-filter> 
</receiver>

运行情况

我们看看运行的接口,接收器运行在主线程中。

广播是可以被多个接收器接收的,我们copyTestReceiver的代码创建另一个接收器TestReceiver2,如下,并在AndroidManifest.xml中进行注册:

public class TestReceiver2 extends BroadcastReceiver{ 
    private String tag = "TestReceiver2"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
        Utils.logThreadSignature(tag); //显示Thread的信息
        Log.v(tag,"context = " + context); 
        Log.v(tag,"this = " + this); 
        Log.v(tag,"intent = " + intent); 
        String message = intent.getStringExtra("message"); 
        Log.v(tag,"message : " + message); 
    } 
}

运行结果如下。当发出广播时,所有注册的接收器都会收到。由于这两个接收器的onReceive()都运行在主线程,即同一个线程中,他们是顺序处理,而不是另行处理。可以猜测广播是放在消息队列中,处理时依次触发各接收器。我们可以将TestReceiver的处理时间增加,例如sleep()上几秒,依次处理会更明显。处理的顺序和Manifest中的登记顺序一致。

应用间的广播

同一应用和不同应用都可以通过Manifest注册对同一广播的监听,在代码上区别,分别触发运行在各自的主线程的回调函数。

小例子代码在:Pro Android学习:Broadcast小例子

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(九七):BroadcastReceiver(1):基础小例子的更多相关文章

  1. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  2. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  3. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  4. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  5. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  6. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  7. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  8. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  9. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  10. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

随机推荐

  1. 比较好的SQL

    DECLARE @Data NVARCHAR(30);DECLARE @Data2 NVARCHAR(30);SET @Data = @DataDate;SET @Data = CONVERT(CHA ...

  2. scjp考试准备 - 11 - 类型转换2

    题目如下: interface Foo{} class Alpha implements Foo{} class Beta extends Alpha{} public class Delta ext ...

  3. JSP导入包

    1. <%@page import="java.util.Date, mianBao.*, z_utils.*"%> 2. 3.

  4. chrome跨域拓展工具

    下载chrome跨域扩展工具 1) http://crx.2333.me/ 扩展程序id:nlfbmbojpeacfghkpbjhddihlkkiljbi

  5. 智课雅思词汇---二十三、名词性后缀mony

    智课雅思词汇---二十三.名词性后缀mony 一.总结 一句话总结:Latin: action, result of an action or condition; a suffix that for ...

  6. IOS-SQLite3

    iOS中的数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding(NSKeyedArchiver\NSk ...

  7. eclipse配置及常用快捷键

    1. eclipse查看一个方法被谁引用(调用)的快捷键四种方式 1.(首推)双击选中该方法,Ctrl+Alt+H  如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ct ...

  8. css: 基础一

    1.display有哪些值?说明他们的作用 @1.block:设定元素为块级元素,占据一整行,可设置宽高. @2.inline-block: 设定元素行内块元素,可设置宽高,一行能显示多个. @3.i ...

  9. 【机器学习基石笔记】九、LinearRegression

    [一] 线性回归直觉上的解释 得到Ein = mean(y - wx)^2 [二] w的推导 Ein = 1/N || xw - y||^2 连续.可微.凸函数 在各个方向的偏微分都是0 Ein = ...

  10. js鼠标拖动(转自刘68)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...