Android基础知识——BroadCastReceive

2018-06-04  本文已影响4人  银月银月

 本文参考了https://blog.csdn.net/qq_35578940/article/details/52445170

BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件

      广播分两种: 有序广播和无序广播

      内部通信实现机制:通过Android系统的Binder机制实现通信的

无序广播:sendBroadcast()方法发送的广播为无序广播,无序广播逻辑上可以被任何广播接受者接收到,优点是效率高。缺点是一个接收者不能将处理结果传递给下一个接收者,传递的数据在传输过程中不能被修改,并无法终止广播的传播。

有序广播:sendOrderedBroadcast()方法发送的广播为有序广播,有序广播依次传播,列如有三个广播接收者A,B,C, 优先级是A>B>C,

      此时发送一条广播,那这个消息先传给A,再传给B, 最后传给C,每个接收者都有权终止广播,比如B终止广播,C就无法接受到,

      此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中获取A存入的数据。

  在通过context.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,initialCode, initialData, initialExtras);时我们可以指定resultReceiver广播接收者,

这个接收者我们可以认为是最终接收者,通常情况下如果比他优先级更高的接收者如果没有终止广播,那么他的onReceive方法会被执行两次,

第一次是正常的按照优先级顺序执行,第二次是作为最终接收者接收,如果比他优先级高的接收者终止了广播,那么他依然能接收到广播。

在我们的项目中经常使用广播接收者接收系统通知,比如开机启动,sd卡挂载,低电量,外拨电话,锁屏等等,

如果我们做的是播放器,那么监听到用户锁屏后我们应该将我们的播放器暂停等。

BroadcastReceiver有两种注册方法,在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册。

静态注册的广播接收者只要app在系统中注册则可以一直接收到广播消息,动态注册的广播接收者当注册的activity或Service销毁了那么就接收不到广播了,

所以一般应用都是静态注册的,有一些操作特别频繁的广播事件在Androidmainfest中注册无效的,

如手机锁屏广播,在代码中我们可以用registerReceiver()方法去注册广播。

  需要注意的地方:

    1.BroadcastReceiver的生命周期是非常短暂的,在接收广播的时候创建,onReceiver()方法结束之后销毁

  2.  广播接收者中不要做一些耗时的工作,否则会弹出Application No Response(应用无响应anr)错误对话框,,一般耗时的较长的操作最好放在服务中完成。

3.最好也不要在广播接收者中创建子线程做耗时操作,因为广播接收者被销毁后进程就成为空进程,而空进程很容易被系统杀掉。     

Android中引入广播机制的用意 :

1.程序间互通消息(例如在自己的应用程序内监听系统的来电)

2.效率上(参考UDP的广播协议在局域网的方便性)

3.设计模式上(反转控制的一种应用,类似监听者模式)

发送和接收广播的小Demo;

public class MainActivity extends Activity {  

@Override  

protected void onCreate(Bundle savedInstanceState) {  

super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

    }  

//点击按钮发送一条无序 广播   

public void click(View v) {  

Intent intent =new Intent();  

//设置发送广播的事件  

intent.setAction("com.itcast.customreceiver");  

intent.putExtra("name", "每天晚上7点准时开整~~");  

//发送广播  

        sendBroadcast(intent);  

    }  

}  

 BroadcastReceiver {  

//这个方法接收我们自定义发送的广播   

@Override  

public void onReceive(Context context, Intent intent) {  

//终止广播  

        abortBroadcast();  

String name = intent.getStringExtra("name");  

Toast.makeText(context, name,0).show();  

    }  

}  

上一篇下一篇

猜你喜欢

热点阅读