1、Broadcast(广播)

      是一种广泛运用在应用程序之间传输信息的机制

2、BroadcastReceiver(广播接收者)

      是对发出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。

3、用途

      当开机完成后系统会产生一条广播;

      当网络状态改变时系统会产生一条广播

      当电池电量改变时,系统会产生一条广播

      等等

android为什么要这样设计?

       .大大减少开发的工作量和开发周期

       .作为应用开发者,只需掌握BroadcastReceiver

使用方法:

       发送:

              .把信息装入一个Intent对象(如Action、Category)

              .通过调用相应的方法将Intent对象以广播方式发送出去

                       sendBroadcast();  //发送普通的广播

                       sendOrderBroadcast(); //发送有序广播

                       sendStickyBroadcast();  //异步广播(粘滞性滞留广播)

       接收:

               当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册的IntentFilter是否与发送的Intent相匹配,         若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都           需要实现onReceive()方法。

       注意:BroadcastReceiver需要注册

                 .静态注册  (在.xml注册)

                 .代码注册

         BroadcastReceiver生命周期只有十秒左右

         在BroadcastReceiver里不能做一些比较耗时的操作

          应该通过发送Intent给Service,由Service来完成

          不能使用子线程

广播的种类:

          普通广播(Normal broadcasts)

                  所有监听该广播的广播接收者都可以监听到该广播。

            有序广播(Ordered  broadcasts)

                    按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越

            大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。

             异步广播(粘滞性滞留广播)

               不能将处理结果传给下一个接收者,无法终止广播。

 普通广播的特点:

          同级别接收先后是随机的

           级别低的后收到广播

           接受器不能截断广播的继续传播也不能处理广播

            同级别动态注册高于静态注册

有序广播的特点:

             同级别接收顺序是随机的

             能截断广播的继续传播,高级别的广播接收器接收到该广播后,可以决定把该广播是否截断。

              接收器能截断广播的继续传播,也能处理广播。

              同级别动态注册高于静态注册

demo:


package com.example.mhy.broadcast;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {


    /**
     *广播生命周期很短只有十几秒,不能做耗时操作,
     * 当主线程被杀死之后它所创建的子线程也会随之消亡
     * 不能开辟子线程
     * 耗时操作交给Service来做
     */
    private BC2 bc2;
    private BC3 bc3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //动态注册广播
        bc2 = new BC2();
        //新建消息过滤器
        IntentFilter intentFilter0 = new IntentFilter("BC1");
        registerReceiver(bc2, intentFilter0);

    }

    public void doClick(View v) {
        switch (v.getId()) {
            case R.id.send1:
                Intent intent = new Intent();
                intent.putExtra("msg", "这是一条普通广播");
                //设置消息的唯一标志(一般以类名命名)
                intent.setAction("BC1");
                sendBroadcast(intent);
                break;
            case R.id.send2:
                Intent intent2 = new Intent();
                intent2.putExtra("msg","这是一条有序广播");
                intent2.setAction("BC1");
                sendOrderedBroadcast(intent2,null);
                break;
            case R.id.send3:
                //滞留广播不考虑广播的发送和接收顺序
                Intent intent3 = new Intent();
                intent3.putExtra("msg", "发送一条滞留广播");
                intent3.setAction("BC3");
                sendStickyBroadcast(intent3);//过时的使用方式
                IntentFilter intentFilter = new IntentFilter("BC3");
                bc3 = new BC3();
                registerReceiver(bc3, intentFilter);
                break;

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //如果为动态注册广播接收器 则使用后一定要解除注册
        unregisterReceiver(bc2);
    }
}



package com.example.mhy.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

/**
 * Created by mhy on 2016/5/7.
 */
public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String s = intent.getStringExtra("msg");
        System.out.println("receiver1收到消息:" + s);
//        abortBroadcast();
//        Bundle bundle = new Bundle();
//        bundle.putString("test", "广播处理的数据");
//        setResultExtras(bundle);

    }
}



package com.example.mhy.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

/**
 * Created by mhy on 2016/5/7.
 */
public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra("msg");
        System.out.println("receiver2收到消息:" + s);
        //有序广播可以截断广播也广播之间也可以传递数据
//        abortBroadcast();
//        Bundle bundle = getResultExtras(true);
//        String s2 = bundle.getString("test");
//        System.out.println("得到的处理结果是:" + s2);
    }
}



package com.example.mhy.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by mhy on 2016/5/7.
 */
public class BC3 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("收到了异步广播!");
    }
}