Android:BroadcastReceiver四大组件之一广播接收者
一、BroadcastReceiver概述:
作用是用来接收发送过来的广播的。
广播接收者可以接受某个频道(action)发送的广播,发送者可以是activity,也可以是Service

二、BroadcastReceiver的机制:
从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:
1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;
2.广播发送者通过binder机制向AMS发送广播;
3.AMS查找符合相应条(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;
4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。 对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同。

三、作用:
1、监听自己的广播,并且做出响应
2、监听系统的广播,并且做出响应

四、Android中的广播 又分 三种
1、 Normal BroadCast 默认广播(无序、普通广播)
2、 Ordered BroadCast 有序广播
3、 Stick BroadCast 粘性广播

说了这么多,走代码来看实际用法吧。

一、Normal BroadCast 默认广播(无序、普通广播)
1、创建一个广播发送者:

在activity_main.xml文件添加一个按钮,设置onClick属性,
在MainActivity.java文件中,创建按钮的点击方法,核心代码如下:

//得到Intent对象
Intent intent=new Intent();
//添加过滤器        intent.setAction("com.cxh.normalBroadcast");
//添加传递内容
intent.putExtra("info","发送普通广播");
//发送广播
this.sendBroadcast(intent);有序广播

2、接收者:
写一个类名为MyReceiver的类,继承BroadcastReceiver,并且实现方法onReceiver()
该方法形参有Context,Intent
那么就可以通过这两个参数,进行获取Intent传的值,并在Context上做一些操作
代码如下:

public class MyReceiver01 extends BroadcastReceiver {

    //重写父类的生命周期方法
    // 时长---10S(秒)
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent!=null){
            String info=intent.getStringExtra("info");
            Toast.makeText(context, "信息:"+info, Toast.LENGTH_SHORT).show();
        }
        //注册广播接收者----静态注册
    }
}

同时我们也应该注意接收者的这个类不能做耗时操作,不超过10s
3、注册:
有了发送,有了接收,怎么才能通信呢,例如电台和每台收音机,需要有频道才能发、收到准确的地方,这时候我就需要注册。
1、注册分两种:
1. 静态注册
2. 动态注册
2、走代码:
1、静态注册:

<!--
             静态注册 android:name 指定注册的哪个接收者 全类名
                    过滤器 调频 设置action
        -->
        <receiver android:name=".MyReceiver01">
            <intent-filter>
                <action android:name="com.cxh.normalBroadcast" />
            </intent-filter>
        </receiver>
过滤器中的action与发送者设置的action就必须一致了,否则就会收不到通知。
2、动态注册
    API: 建议:在Activity中的 onResume()注册 , onPause() 方法取消注册
    开发中:   在Activity中的 onCreate()注册 , onDestory() 方法取消注册
代码如下:
@Override
    protected void onCreate(Bundle savedInstanceState) {

        //得到过滤器对象--- 注册广播接收者
        IntentFilter intentFilter = new IntentFilter("com.cxh.actionBroadcast");
        receiver03=new MyReceiver03();
        registerReceiver(receiver03,intentFilter);

    }
 @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver03);
    }

二、Ordered Broadcast 有序广播
流程和Noraml Broadcast是一致的,只是可以进行广播间的顺序发送,也可以中止广播
发送方式:

Intent intent = new Intent();
        intent.setAction("com.cxh.orderBroadcast");
        intent.putExtra("info","马上回家");
        sendOrderedBroadcast(intent,null);
静态注册排序广播:
<receiver
            android:name=".MyReceiver01"
            android:enabled="true"
            android:exported="true">
            <intent-filter  android:priority="100">
                <action android:name="com.cxh.orderBroadcast"/>
            </intent-filter>

        </receiver>
        <receiver android:name=".MyReceiver02"
            >
            <intent-filter android:priority="200">
                <action android:name="com.cxh.orderBroadcast"></action>
            </intent-filter>
        </receiver>

和Normal Broadcast不同的是过滤器中多了android:priority=”int——value”,这个属性就是控制发送的顺序,priority的取值在0-1000,数值越大,优先级越高,其实我有试过负数的,也是可以额0-(-1000),但是必须是同符号,也就是同正数或同为负数,否则会出现问题,不建议这么做啊。
刚刚还说可以终止广播,其实就是一个方法,在你最后一个想要广播的地方,写方法abortBroadcast()就可以了。

三、 Stick Broadcast粘性广播
粘性广播就是一直粘着你,当你开启应用的时候,他就会发送广播。
在使用的时候也学要进行注册:

发送者:
Context.sendStickyBroadcast(intent);
接收者:
在onCreate() 注册 onDestory()取消注册 使用动态注册
好了就写到这里了,下一个篇,我们来写几个常见的案例。