BroadCast Receiver 详解

这里是引用,本文主要是《第一行代码》阅读笔记!由于刚开始学习Android,所以肯定有很多见解不成熟。希望看到的人能多多指正,有问题的地方可以提在评论,多谢赐教!

       BroadcastReceiver,广播接收者。Android四大组件之一,它的本质就是一个全局的监听器。可以监听到各种广播,包括系统广播、应用广播。可以用来实现不同组件之间的通信。
       在Android中,广播可以分为两大类:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)。
标准广播:一种异步执行的广播,在广播发出后所有的接收者几乎是同一时间接收到广播。这种广播效率很高,但是没有先后顺序所以一位置不能被截断。
有序广播:一种同步执行的广播,在广播发出后优先级最高的广播接收器可以接收到这条广播,当这个广播接收器中的逻辑执行完成以后,广播才会继续传递。因此如果在优先级高的广播接收器中截断了正在传递的广播,那么后面的广播接收器就无法接收到这条广播。

发送广播的基本步骤:

1.创建需要启动BroadCastReceiver的Intent
2.调用Context的sendBroadcast()方法或者sendOrderedBroadcast()方法发送广播。其中sendBroadcast()发送的是标准广播,sendOrderedBroadcast()发送的是有序广播。
标准广播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_BROADCAST");
sendBroadcast(intent);

有序广播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_ODERED_BROADCAST");
sendOrderedBroadcast(intent, null);
接收广播的基本步骤:

我们可以接收自定义的广播,也可以接收系统的广播。系统会发出很多广播,例如开机启动完成,电量过低等都会发出广播,但是想接收这些广播需要声明权限。

1.创建一个类继承自BroadCastReceiver,重写父类的onReceive()方法。这样当消息来了,就会执行onReceive()方法中的逻辑。
2.注册BroadcastReceiver,实现了BroadcastReceiver需要注册一下,有两种方式:

  • 动态注册:这种方法是通过java代码注册。这种注册方式注册的广播接收者为非驻型广播,它会随着Activity的生命周期变化,所以在Activity推出的时候我们需要调用unregisterReceiver(netWorkBroadCastReceiver)方法取消注册。下面是注册代码:
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
netWorkBroadCastReceiver = new NetWorkBroadCastReceiver();
registerReceiver(netWorkBroadCastReceiver, intentFilter);
  • 静态注册:这种方法是通过AndroidManifest.xml文件注册。通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行。这样可以做到程序还没运行,就可以实现某个广播的接收注册,比如开机启动广播。


    
        
    

BroadCastReceiver的生命周期

这一块内容主要是参考的这位同学的博客,其实对于何时使用service还不是很了解。可能下一部分内容是看服务!

       BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。

特别是,您可能无法从一个BroadcastReceiver中显示一个对话框,或绑定到服务。对于前者,则应该使用NotificationManager的API。对于后者,你可以使用Context.startService()来启动一个Service。

本地广播

       前面所发送和接收的所用广播都属于系统的全局广播,我们发出的这些广播可以给系统中任何应用程序接收到,当然我们也可以接受其他应用程序的广播。但是,只用本地广播机制发出的广播只能在本应用程序中接收到。这样的话安全性得到了提升。本地广播机制主要是用LocalBroadcastManager来管理,它提供了发送广播的方法sendBroadcast()和sendBroadcastSync()(这也方法好像用的不多,我暂时没有深究,等以后真正用到可以查一下),注册接收者的方法registerReceiver(localReceiver, localIntentTilter),需要两个参数,取消注册的方法localBroadcastManager.unregisterReceiver(localReceiver);

下面看一下本地广播机制的工作流程:
1.发送本地广播

 //发送本地广播
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取本地广播管理实例
localCastBtn = (Button) findViewById(R.id.local_btn);
localCastBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //发送本地广播
        Intent intent = new Intent("com.zwf.broadcastdemo.LOCAL_BROADCAST");
        localBroadcastManager.sendBroadcast(intent);
    }
});

2.注册广播接收者

//注册本地广播监听
localIntentTilter = new IntentFilter("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentTilter);

3.取消注册

//取消本地广播监听
localBroadcastManager.unregisterReceiver(localReceiver);

关于BroadCastReceiver就总结这么多,等以后实际项目用到的话知道有这么一个用法,其他再去查。有新记录会及时补充。

你可能感兴趣的:(BroadCast Receiver 详解)