广播
广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用。
标准广播(Normal broadcasts)
一种完全异步执行的广播,广播发出后,所有的广播接收器几乎都会在同时接收到这条广播消息,它们之间没有先后顺序。这种广播效率较高,但是无法被截断。
有序广播(Ordered broadcasts)
是一种同步的广播,在发出之后,同一时刻只会有一个广播接收器能够收到这条广播,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。此时,广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息。前面的广播接收器还可以截断正在传递的广播。
注册
静态注册
- 创建一个继承BroadcastReceiver的子类,重写onReceive(Context context,Intent intent)方法。
- 在AndroidManifest.xml中用标签声明注册,并在标签内设置过滤器,指定接收哪些action。
- 发送广播,指定广播的Action
动态注册
注册
public void registerReceiver(){ IntentFilter intentFilter = new IntentFilter();// 过滤器 intentFilter.addAction(cn.com.relaxmeet.GAME_BEGIN); // 指定Action mBroadcastReceiver = new MyBroadcastDemo2(); registerReceiver(mBroadcastReceiver, intentFilter);// 注册广播接收器 }
注销
public void unRegisterReceiver(){ unregisterReceiver(mBroadcastReceiver);// 注销广播接收器 }
动态注册广播后,必须适时的unRegister,否则会有内存泄漏。
静态注册的广播,在应用没有起动的状态下也能过滤-接收-响应到广播。而动态注册的广播则调用了registerReceiver()方法之后才能接收到广播。根据这点,所以在有需要注册接收系统的广播时,使用静态注册方式。
通常BroadcastReceiver的onReceive()方法是在主线程(UI主线程)中被调用,因为UI主线程的特性,在这个方法中,我们不能进行长时间操作,否则会产生ANR异常。
自定义广播
- 自定义一个 BroadcastReveiver 重写 onReceive 方法
- 在 AndroidManifest 里面注册 该广播接收器,制定Intent filter的 action
- 用 Intent intent = new Intent(“yout action”); sendBroadcast(intent)发送标准广播,sendOrderBraodcast(intent, null)发送有序广播。有序广播可以在注册的时候在 intent fileter 里面添加 priority 属性,当然也可以 onReceive 里面截断(调用abortBroadcast())
本地广播
系统全局广播可以被其他任何引用程序接收到,并且我们也可以接收到来自于其他任何应用程序的广播,容易引起安全性问题,比如发送一些携带关键性数据的广播可能被其他应用程序截获,或者其他程序不停地向我们的广播接收器发送垃圾广播。
本地广播只能够在应用程序的内部进行传递,并且广播接收器也只能接受来自本应用程序发出的广播。
用 LocalBroadcastManager 来管理,发送广播,注册,注销。
本地广播是无法通过静态注册的方式来接受的,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播,我们的程序肯定是已经启动了。