您的位置:首页 > 移动开发 > Android开发

《第一行代码--Android》读书笔记之广播机制

2015-11-19 17:35 393 查看

广播的类型

标准广播(Normal Broadcasts)是完全异步执行的广播,在广播发出后,几乎所有的广播接受器都同一时间接收到这条广播消息,放射性传播的消息。

有序广播(Ordered Broadcasts)是同步执行的广播,在广播发出后,只有一个广播***接收到这条广播消息,它在处理完消息后可以选择继续串型传播这条消息,也可以选择截断这条消息的传播。

接受系统广播

要接收广播,首先当然要创建广播***啦!

动态注册广播***

自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。

创建该自定义广播***的实例。

创建一个intentFilter实例,调用addAction()方法配置具体要接收什么广播消息。

调用registerReceiver()方法关联intentFilter和自定义广播***,完成注册

在onDestroy()方法调用unRegisterReceiver()解除注册。

静态注册广播***

自定义一个继承自BroadcastReceiver的类并重写其中的onReceive()方法,写处理接收到的广播的具体逻辑。

在AndroidManifest的XML文件中注册广播***。

[code]<receiver android:name=".MyBroadcastReceiver">
            <intent-filter>
                <action android:name="com.example.BROADCAST_TEST"/>
            </intent-filter>
        </receiver>


总结:无论哪一种注册方式,注册广播***都需要为之配置好intentFilter,添加action属性。

发送自定义广播

介绍自定义广播之前,我们要回顾一下,什么是Intent。intent能在运行过程中连接两个组件component(众所周知,android的四大组件吧)。Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式。

发送广播,前提肯定要先自定义一个广播接受器啦。

在AndroidManifest.XML文件中注册广播***,在< action_filter>内添加一个自定义的action属性,而这个action属性就是自定义广播的“内核”了。

new一个Intent,构造函数传入我们自定义的action属性(内核)。如果要发送标准广播就调用sendBroadcast(intent,null),而要发送有序广播就调用sendOrderedBroadcast(intent, null)发送广播。

注意,发送有序广播时,注册的广播接受器还要添加一个android:priority属性,可以在广播***的onReceive()中调用abortBroadcast()截断广播的传播。

使用本地广播

为了解决广播的安全性问题,android引入了一套本地广播机制,本地广播只能在应用程序内部进行传播。本地广播无法通过静态注册的方式来接收。

本地广播特殊的地方是它需要一个LoadBroadcastManager来对广播进行管理,如注册广播***和发送本地广播都要经由LoadBroadcastManager的手才行。

[code]localBroadcastManager=LocalBroadcastManager.getInstance(this);
        intentFilter=new IntentFilter();
        forceOfflineReceiver=new ForceOfflineReceiver();
        intentFilter.addAction("com.example.broadcasttest.FORCEOFFLINE");
        localBroadcastManager.registerReceiver(forceOfflineReceiver, intentFilter);
        Button forceOffline=(Button)findViewById(R.id.force_offline);
        forceOffline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.example.broadcasttest.FORCEOFFLINE");
                localBroadcastManager.sendBroadcast(intent);
                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
            }
        });


另外如果要在广播***中启动活动,需要给intent加入FLAG_ACTIVITY_NEW_TASK这个标志。

FLAG_ACTIVITY_NEW_TASK: 设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。


参考资料和文献:

Task与Activity详解 http://blog.csdn.net/mayingcai1987/article/details/6200909

Android Intent.FLAG_NEW_TASK详解,包括其他的标记的一些解释 http://my.oschina.net/AaronCN/blog/407461?fromerr=eCYA1KDe

android Intent机制详解 /article/1875886.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: