Android四大组件——Broadcastreceiver

Broadcastreceiver(广播接收器)

Broadcastreceiver(广播接收器)是用来接收Broadcast(广播)的一个组件。

广播可以由其他程序发出,当Broadcastreceiver接收到响应的Broadcast后会执行设定的功能。

例如系统开机的广播被App的广播接收器接收到后就执行在后台开启的功能。

(首先先声明,一般不建议用动态注册和异步广播(API23淘汰了))

一,首先四大组件都需要注册。

     Broadcastreceiver有动态和静态两种注册方法:

     1.静态注册,即在Androidmanifest.xml文件里面注册:

<receiver 
            android:name="com.example.z_broadcastreceiver.MyBc1">
            <intent-filter
                android:priority="100">
                <action 
                    android:name="com.example.z_broadcastreceiver.MainActivity"/>
            </intent-filter>
        </receiver>

      其中android:priority是优先级的设置,范围在-1000到1000之间,数字越大,接收到广播的优先级就越高。

       <action></action>内的android:name是广播源的标签,通常广播源标签用包名.类名来做唯一的标识。

     

      2.动态注册,在程序内用代码注册,在同一优先级下,动态注册比静态注册优先级要高。

          不过动态注册有个缺点:就是动态注册只有在程序运行的时候才能接收到广播。

IntentFilter intentfilter = new IntentFilter("com.example.z_broadcastreceiver.MainActivity");
            MyBc3 bc3 = new MyBc3();
            registerReceiver(bc3, intentfilter);

        其中MyBc3是一个自定义的广播接收者类。IntentFilter()内的是广播源标签。

        注意!动态注册完后需要手动销毁广播。在重写Activity中的onDestry方法中销毁

@Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        unregisterReceiver(bc3);
    }

二,注册完广播接收器后,我们得接收广播

public class MyBc1 extends BroadcastReceiver{

    @Override//一个处理接受到的广播的处理方法
    public void onReceive(Context arg0, Intent intent) {
        /**
         * BroadcastReceiver的生命周期只有十秒左右
         * 所有BroadcastReceiver不能进行一些比较耗时的操作
         * 如果非要进行耗时的操作则应该通过Intent对象发送给Service来处理
         * BroadcastReceiver不能使用子进程
         */
        String string = intent.getStringExtra("msg");
        Log.i("tag", "第一个广播接收器:"+string);
    }
}
public class MyBc2 extends BroadcastReceiver{

    @Override//一个处理接受到的广播的处理方法
    public void onReceive(Context arg0, Intent intent) {
        String string = intent.getStringExtra("msg");
        Log.i("tag", "第二个广播接收器:"+string);
    }
}
public class MyBc3 extends BroadcastReceiver{

    @Override//一个处理接受到的广播的处理方法
    public void onReceive(Context arg0, Intent intent) {
        String string = intent.getStringExtra("msg");
        Log.i("tag", "第三个广播接收器:"+string);
    }
}

为了验证优先级,我定义了三个广播接收器,注意三个都要注册。

三,发送广播。

      在这个例子中我用了自定义程序发送的广播,没有用系统的广播,顺便学一些怎么样发送广播。

        发送广播有三种类型(1)普通广播 Normal Broadcast       用sendBroadcast(Intent intent)方法发送广播.

                                       (2)有序广播 Normal Broadcast       用sendOrderBroadcast(Intent intent)方法发送广播.

                                       (3)异步广播 Normal Broadcast       用sendStickBroadcast(Intent intent)方法发送广播。  

                                              该方式的广播需要设置权限 <uses-permission android:name="android.permission.BROADCAST_STICKY"/>,很少用。

 

         为了方便验证,测试程序定义了三个按钮分别代表三种发送方式:      

 

 

         我们的MyBc1和MyBc2用的是静态注册,MyBc3是动态注册:

public class MainActivity extends Activity {

    private MyBc3 bc3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 动态组成广播
         * 动态组成广播只能在程序运行时候才能接收得到
         * 结束的时候需要销毁
         */
        IntentFilter intentfilter = new IntentFilter("com.example.z_broadcastreceiver.MainActivity");
        bc3 = new MyBc3();
        registerReceiver(bc3, intentfilter);
    }
    //广播需要用Intent对象传递信息
    @SuppressWarnings("deprecation")
    public void Click(View view){
        switch(view.getId()){
        /**
         * 普通广播同级别收到广播的先后顺序是随机的
* 动态注册优先级高于静态注册。 * 同静态注册优先级高的先收到广播 * 接收器不能截断广播的继续传播也不能修改广播 * 普通广播是完全异步的,逻辑上可以在同一时刻被所有匹配的接受者接收到 * 消息传递效率高,缺点是接受者不能将处理结果传递给下一个接收者,也无法终止广播传播。
*/ case R.id.button1: Intent intent = new Intent();//新建Intent对象 intent.putExtra("msg", "我是普通广播");//添加传递信息,“BC”是信息的标签 intent.setAction("com.example.z_broadcastreceiver.MainActivity");//广播的标签,只有标签为这个字符串的广播接收器才能接收到该广播。 sendBroadcast(intent);//发送普通广播 break; /** * 有序广播同级别收到广播的先后顺序是随机的 * 优先级高的先收到广播 * 能截断广播的继续传播,高级别的能截断低级别的,可以修改广播 * 同级别动态注册优先与静态注册接收广播 */ case R.id.button2: Intent intent2 = new Intent(); intent2.putExtra("msg", "我是有序广播"); intent2.setAction("com.example.z_broadcastreceiver.MainActivity"); sendOrderedBroadcast(intent2,null);//发送有序广播,后面是权限 break; //异步广播的生命周期长,可以先广播后注册,其他和普通广播差不多 case R.id.button3: Intent intent3 = new Intent(); intent3.putExtra("msg", "我是粘性广播"); intent3.setAction("com.example.z_broadcastreceiver.MainActivity"); sendStickyBroadcast(intent3);//发送异步广播 break; } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(bc3); } }

 

   大家都没用设置优先级运行结果:

 

可以看出三种方法的动态注册的优先级都是高于静态注册的;

 

 

设置了优先级,MyBc2 = 200, MyBc1 =100, MyBc3 =50(动态注册需要intentfilter.setPriority()设置);

运行结果:

可以看出有序广播是按三个的优先级广播的,而另外两种都是动态优先,静态按优先级;

 

把MyBc3的动态注册放到异步广播发送之后:

 

可以看出异步广播可以在广播接注册前发送,其他两种需要在注册后才能发送。

 

在MyBc2中输出完后添加截断广播:abortBroadcast();

 

可以看出只有有序广播可以截断广播。

 

 

上面的例子中把动态注册放在了前面,运行的时候会一开始就调用了一次异步广播。

放在后面注册,即放在了异步广播之后注册,因为要在程序销毁时才能销毁,所以会不停的产生MyBc3接收器:

对动态注册和异步广播都不太熟悉。以后需要继续更新。(还有广播的修改,虽然感觉作用不大)

 

如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~

 

posted on 2017-03-14 19:55  艹艹哒丶  阅读(490)  评论(0编辑  收藏  举报

导航