概述
一、先介绍基本使用方法
private class DataRefreshRecieve extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if ("com.yiyo.stb".equals(intent.getAction())){ stbDataRefresh(); dissDialog(); } } }
第二步:.注册receiver
在 AndroidManifest.xml 中注册
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "1000" >
< action android:name = "com.yiyo.stb" />
</ intent-filter >
</ receiver >
代码中注册
IntentFilter intentFilter = new IntentFilter( "com.yiyo.stb" );
registerReceiver( mBatteryInfoReceiver , intentFilter);
第三步:发送广播
Intent intent=new Intent(); intent.setAction("com.yiyo.stb"); sendBroadcast(intent);
第四步:
实现onReceive方法(在方法里做相应操作)
private class DataRefreshRecieve extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if ("com.yiyo.stb".equals(intent.getAction())){ stbDataRefresh(); dissDialog(); } } }
二、Broadcast简介
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。
三、注意事项
1、生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在 BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框
2、这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的 所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 .
3、如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成
四、广播的类型
1、普通广播 (Normal broadcasts):发送一个广播,所以监听该广播的广播接收者都可以监听到该广播。2、有序广播 (Ordered broadcasts):按照接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,-1000 到 1000 之间 , 值越大 , 优先级越高 . 可以终止广播意图的继续传播 . 接收者可以篡改内容 .
五、两种广播发送和接收
1、普通广播不再介绍
2、有序广播(Ordered Broadcast)发送和接收
- sendOrderedBroadcast(intent, null);
-
this.sendOrderedBroadcast(new Intent("android.provier.zhongnan.broadcast"), "xzq.zhongnan.test");
代码中与上述例子最大的差别在于MainActivity中发送广播的代码: this.sendOrderedBroadcast(new Intent(
"android.provier.zhongnan.broadcast"), "xzq.zhongnan.test")增加了自定义的一个权限。
AndroidManifest文件中配置自定义的权限:
<permission android:protectionLevel="normal" android:name="xzq.zhongnan.test"></permission>
-
- 中断广播,不再往下发放abortBroadcast();
3、粘性sendStickyBroadcast
- 它将发出的广播保存起来,一旦发现有人注册这条广播,则立即能接收到
-
发这个广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY" />
去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml 同样要加上面的权限; mContext.sendStickyBroadcast(intent);
-
六、中断广播(有序广播中可操作)
-
abortBroadcast()可中断广播,后面就不会收到广播,sendOrderedBroadcast()中若第三个参数赋值ResultReceiver, 还是会收到广播,始终都是最后一个接收到
七、广播权限
-
a、发送端要求接收端的权限(要求接收者必须有权限)
接收端必须持有发送端的权限才可以接收这个广播
<permission/>声明权限---在发送端声明这个权限
<uses-permission/>使用权限---在接收端使用这个权限才可以收到广播b、接收端要求发送端的权限
在<receiver/>标签中指定android:permission=""权限,发送端必须有这个权限,接收端才会接收它的广播;若无权限,接收端不接收广播
最后
以上就是背后啤酒为你收集整理的Android广播机制Broadcast详解的全部内容,希望文章能够帮你解决Android广播机制Broadcast详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复