广播的概念
Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。
Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁
广播的类型
(1)无序(标准)广播 :是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎同一时间接收到这条广播消息,他们之间没有任何顺序可言.这种广播效率更高,但是意味着无法截断.
(2)有序广播:则是一种同步执行的广播,在广播发出去之后,同一时间只有一个广播接收器能够接受这条广播的信息,当这个广播接收器中的逻辑执行完毕后广播才会继续传递.
核心
广播分为两个角色,广播发送者,广播接受者
实现原理
在android中的 BroadcastReceiver使用的设计模式则是观察者模式基于消息发布/订阅事件模型
模型中有三个角色:
消息订阅者(广播接收者)
消息发布者(广播发布者)
消息中心(AMS,即Activity Manager Service)
广播接收者 通过 Binder机制在 AMS 注册
广播发送者 通过 Binder 机制向 AMS 发送广播
AMS 根据 广播发送者 要求,在已注册列表中,寻找合适的广播接收者
寻找依据:IntentFilter / Permission
AMS将广播发送到合适的广播接收者相应的消息循环队列中;
广播接收者通过 消息循环 拿到此广播,并回调 onReceive()
广播的注册
广播的注册分为静态注册与动态注册
静态注册:这种方法是在配置AndroidManifest.xml配置文件中注册,通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发程序还是会运行.
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
//自定义Action
<action android:name="MLY" />
</intent-filter>
</receiver>
动态注册
IntentFilter filter = new IntentFilter();
filter.addAction("xia");
dynamicReceiver = new DynamicReceiver();
//注册广播接收
registerReceiver(dynamicReceiver, filter);
设置addAction标签,一定要setAction这个标签,不然的话在DynamicReceiver中拿不到回调!
public void send2(View v) {
Intent intent = new Intent();
intent.setAction("xia");
intent.putExtra("sele", "特拉法尔加~罗");
sendBroadcast(intent);
}
效果图:
源码地址:
http://download.csdn.net/detail/macaopark/9923045