广播分类:
标准广播:是一种完全异步执行的广播,它无法被截断,广播发出后,所有的接收器都能在同一时刻收到广播消息,因此没有先后顺序,所以它的效率比较高。
有序广播:是一种同步执行的广播,广播发出后只有一个接收器收到它,处理完成后再继续往下传播,因此这时广播存在先后顺序。优先级高的接收器可以优先接收,并且广播可以被截断。
广播接收器:可以自由的对感兴趣的广播进行注册,注册方式一般有两种:
动态注册:在代码里新建实例来进行注册。
先定义成员变量,再新建实例
intentFilter=new intentFilter(); intentFilter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”); networkChangeReceiver=new NetWorkChangeReceiver(); registerReceiver(networkChangeReceiver,intentFilter);
别忘了注册完成后,在活动销毁时注销接收器释放系统资源!
protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); }
接收广播需要新建类并继承BroadcastReceiver重写onReceive方法
class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context,Intent intent){ Toast.makeText(context,”network changes”,Toast.LENGTH_SHORT).show(); } }
通过onReceive方法接收到广播后打印消息
静态注册:在AndroidMainifest.xml里添加标签。
新建一个Receiver类继承BroadcastReceiver如下:
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context,Intent intent){ Toast.makeText(context,”Complete”,Toast.LENGTH_SHORT).show(); } }
<receiver android:name=”.MyReceiver”></receiver>静态注册
发送自定义广播:
发送前,要先定义个标签用来标示广播
<receiver android:name=”.MyBroadcastReceiver”> <intent-filter> <action android:name=”包名.MY_BROADCAST”/> </intent-filter> </receiver>
然后用Intent识别标签并发送广播:
Intent intent=new Intent(“包名.MY_BROADCAST”); sendBroadcast(intent);
此时发出的就是一条标准广播。然而发送有序广播的不同点就是在<intent-filter>
里加入权限级别<intent-filter android:priority=”100”>,priority表示接收广播的级别"2147483647"为最高优先级,这样优先级高的就会先收到广播,中断广播只需要调用abortBoradcast方法。
注意:
1.生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(ApplicationNo Response) 程序无响应的错误信息,如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的。
2. 动态注册广播接收器还有一个特点,就是注册的Activity关掉后,广播就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开的。系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播。
------------------------------------------------------------------------------------------------------