• 【转】 Pro Android学习笔记(九七):BroadcastReceiver(1):基础小例子


    目录(?)[-]

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

  • 相关阅读:
    requests库之处理响应
    requests库之自定义request
    requests库之请求异常处理
    requests库之带参请求
    BFS广度优先
    分治模板
    递归模板
    数据机构与算法学习(三)- 数组
    消息队列学习笔记
    数据结构与算法学习(二)
  • 原文地址:https://www.cnblogs.com/blongfree/p/5048113.html
Copyright © 2020-2023  润新知