Android四大组件之Broadcast(学习笔记)

BroadcastReceiver
发送,把信息装入到一个Intent对象
通过调用相应的方法将Intent对象以广播的方式发送出去
sendBroadcast();
sendOrderBroadcast();
sendStickyBroadCast();
service只有10s所以不能使用子线程

使用BroadcastReceiver的方法:
发送:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action,Category)装入一个Intent对象,然后通过调用Context.sendBrocast(),sendOrderBroadcast()或者sendStickyBroadcast()方法,把Intent对象以广播的方式发送出去。
接受:
当Intent发送之后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法

BroadcastReceiver的静态注册,在Mainifest中注册

<receiver 
            android:name=".BC2">
             <intent-filter>
                <action
                    android:name="BC_ONE">
                </action>
             </intent-filter>
 </receiver>
BroadcastReceiver所对应的广播分两类:
普通广播和有序广播。
普通广播:通过Context.sendBroadcast()方法来发送,它是完全异步的。
所有的receivers(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
这种方式效率更高,但是BroadcastReceiver无法使用setResult系列、getResult系列及abort(中止)系列API
在有序广播中可以阻断广播
优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
然后传给下一个接收者,
下一个接收者通过Bundle bundle = new getResultExtras(true)可
以获取上一个接收者存入的数据
可以设置优先级确定哪个Broadcast首先收到广播

MainActivity中的代码
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*
        * Broadcast的动态注册
        * */
        IntentFilter intentFilter=new IntentFilter("BC_ONE");//action
        BC1 bc1=new BC1();
        registerReceiver(bc1,intentFilter);
    }
    //设定点击事件
    public void on_Click(View view){
        switch (view.getId()){
            case R.id.button:
                /*在intent中放入所要传播的信息,putExtra,放入一个Map类的数据
                * 通过getExtra得到所放入的信息
                * 通过在Intent中放入action中,传播广播
                * */
                Intent intent=new Intent();
                intent.putExtra("msg","这是一个普通的广播");
                intent.setAction("BC_ONE");
                sendBroadcast(intent);
                break;
            case R.id.button2:
                Intent intent2=new Intent();
                intent2.putExtra("msg","这是一个有序的广播");
                intent2.setAction("BC_ONE");
                //设置有序广播
                sendOrderedBroadcast(intent2,null);
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

第一个BroadcastReceiver

public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        BC1 bc1=new BC1();
        String s=intent.getStringExtra("msg");
        System.out.println("输出数据1"+s);
        /*在有序广播中可以阻断广播
        * 优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,
        * 然后传给下一个接收者,
        * 下一个接收者通过Bundle bundle = new getResultExtras(true)可
        * 以获取上一个接收者存入的数据
        * 可以设置优先级确定哪个Broadcast首先收到广播
        * */
//        abortBroadcast();
        Bundle bundle=new Bundle();
        bundle.putString("test","广播处理的数据");
        setResultExtras(bundle);
    }
}

第二个BroadcastReceiver

public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s=intent.getStringExtra("msg");
        System.out.println("输出数据2"+s);
        Bundle bundle=getResultExtras(true);
        String s1=bundle.getString("test");
        System.out.println("得到的处理结果是"+s1);
    }
}

BC1的注册是动态注册,一般来说动态注册的接收广播要早于静态注册的,在收到有序广播后可以进行修改或者阻拦,通过setResultExtras放入bundle数据,在要接收广播的下个

BroadcastReceiver中设置getResultExtras是否为true,为true的话就接收bundle数据。

posted @ 2016-10-28 11:19  EdwardRu  阅读(251)  评论(0编辑  收藏  举报