目录(?)[-]

  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开发相关文章

最新文章

  1. js图片拖放原理(很简单,不是框架,入门基础)
  2. vs2008主题
  3. How-to: Enable User Authentication and Authorization in Apache HBase
  4. tesseract-ocr 提高验证码识别率手段之---识别码库训练方法
  5. 【C语言入门教程】5.2 函数的作用域规则(auto, static)
  6. ASCII字符对照表 不时之需
  7. Bilateral Filtering(双边滤波) for SSAO(转)
  8. SpringMVC参数类型转化错误调试方法
  9. Eclipse3.7中搭建Android开发环境文档教程和视频教程
  10. Java学习----集合函数
  11. poj 1328 Radar Installation【贪心区间选点】
  12. iOS导航条渐变透明
  13. 字符串拼接 拆分 NameValueCollection qscoll = HttpUtility.ParseQueryString(result)
  14. pcntl_fork 导致 MySQL server has gone away 解决方案
  15. MySQL两个最简单的delimiter的使用demo
  16. C#的&quot;?&quot;修饰符和&quot;??&quot;运算符
  17. web 参考网址
  18. BUGKU login3
  19. 30_react_router基本使用
  20. C# Deldegate的使用

热门文章

  1. java 多继承的典型应用实例(不同的报文不同的方法去解析)
  2. Find Min In Rotated Sorted Array2,包含重复数字的反转序列找最小值。
  3. Pandas基本功能
  4. scala学习手记21 - 传递变长参数
  5. 在linux上用jmeter压测时出现很多异常java.net.NoRouteToHostException: Cannot assign requested address.
  6. Angular路由的定义和使用
  7. 017对象——对象 get_object_vars get_parent_class is_subclass_of interface_exists
  8. LeetCode OJ:Simplify Path(简化路径)
  9. 读书笔记-Ribbon源码分析
  10. How to use NSRequest in Delphi XE4