BroadcastReceiver
2016-01-16 23:34
239 查看
(广播是android四大组件之一)
广播必须要注册才能接收,注册广播接收器BroadcastReceiver的方式有两种:
1.静态注册:在AndroidManifest.xml文件中注册。
2.动态注册:在代码中指定广播地址并注册,通常是在Activity或Service注册广播。注意:如果有带有优先级的静态注册,则注明优先级的广播接收为最先;如果是没有优先级的静态注册,则代码注册的广播接收为最先。
如果你想注销广播的话,方法如下:
**下面介绍几种类型广播的发送
1.普通广播
接收者之间互不影响,均能无等待接收,接收者无法影响广播发送。
BroadCastActivity.java中:
CommonBroadCast.java
运行结果:
2.有序广播
广播先发送到优先级高的接收者,高优先级接收者可以终止广播,并能向优先级低的接收者传递信息。
(1)
BroadCastActivity.java中:
在AndroidManifest.xml注册广播接收者:
OrderBroadcast1.java
OrderBroadcast2.java
运行结果:
(2)
(与(1)对照)在这里如果OrderBroadcast2.java是这样写的:
则运行结果为:
(3)
(与(1)对照)如果OrderBroadcast1.java是这样写的:
如果OrderBroadcast2.java是这样写的:
则运行结果为:
(4)
(与(1)对照)如果BroadCastActivity.java中是这样写的:
清单文件AndroidManifest.xml中需要配置权限接收者才能收到,如果不配置则接收不到:
运行结果与(1)相同。
3.粘性广播
intent会保持到广播事件结束,没有所谓的10秒限制,10秒限制是指普通的广播如果执行onReceive()时间超过10秒,系统会将这个广播置为可以干掉的candicate,一旦资源不够时就会干掉这个广播不让它执行。
粘性广播需要在AndroidManifest.xml中设置权限:
BroadCastActivity.java中:
StickyBroadcast.java:
在AndroidManifest.xml中注册接收者:
运行结果为:
……
这里说一下,广播接收者中不要创建线程或者做一些耗时操作,否则广播结束时会造成异常。
广播必须要注册才能接收,注册广播接收器BroadcastReceiver的方式有两种:
1.静态注册:在AndroidManifest.xml文件中注册。
<!-- 注册广播 --> <receiver android:name="broadcast.CommonBroadCast"> <intent-filter> <!-- 为广播设置一个频率 --> <action android:name="com.ybj.NORMAL_BROADCAST"/> </intent-filter> </receiver>
2.动态注册:在代码中指定广播地址并注册,通常是在Activity或Service注册广播。注意:如果有带有优先级的静态注册,则注明优先级的广播接收为最先;如果是没有优先级的静态注册,则代码注册的广播接收为最先。
//动态注册广播 IntentFilter filter = new IntentFilter(); filter.addAction("com.ybj.NORMAL_BROADCAST"); CommonBroadCast receiver = new CommonBroadCast(); registerReceiver(receiver, filter);
如果你想注销广播的话,方法如下:
//注销广播 unregisterReceiver(receiver);
**下面介绍几种类型广播的发送
1.普通广播
接收者之间互不影响,均能无等待接收,接收者无法影响广播发送。
BroadCastActivity.java中:
//发送普通广播 Intent intent = new Intent(); intent.setAction("com.ybj.NORMAL_BROADCAST"); intent.putExtra("info", "content"); sendBroadcast(intent);
CommonBroadCast.java
/** * 接收普通广播 * @author Administrator * */ public class CommonBroadCast extends BroadcastReceiver { /** * 广播处理业务的方法 * 处理简单业务 */ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("广播接收到", info); } }
运行结果:
2.有序广播
广播先发送到优先级高的接收者,高优先级接收者可以终止广播,并能向优先级低的接收者传递信息。
(1)
BroadCastActivity.java中:
//发送有序广播 Intent intent = new Intent(); intent.setAction("com.ybj.ORDER_BROADCAST"); intent.putExtra("info", "content"); //null表示不要求接收者声明指定权限 sendOrderedBroadcast(intent, null);
在AndroidManifest.xml注册广播接收者:
<!-- android:priority : 配置广播接收器的优先级(-1000,1000) --> <receiver android:name="broadcast.OrderBroadcast1" > <intent-filter android:priority="100"> <!-- 为广播设置一个频率 --> <action android:name="com.ybj.ORDER_BROADCAST" /> </intent-filter> </receiver> <receiver android:name="broadcast.OrderBroadcast2" > <intent-filter android:priority="200"> <!-- 为广播设置一个频率 --> <action android:name="com.ybj.ORDER_BROADCAST" /> </intent-filter> </receiver>
OrderBroadcast1.java
public class OrderBroadcast1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收者1接收到有序广播", info); } }
OrderBroadcast2.java
public class OrderBroadcast2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收者2接收到有序广播", info); } }
运行结果:
(2)
(与(1)对照)在这里如果OrderBroadcast2.java是这样写的:
public class OrderBroadcast2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收者2接收到有序广播", info); //优先级别高的接收者结束这个广播 this.abortBroadcast(); Log.e("接收者2结束有序广播", info); } }
则运行结果为:
(3)
(与(1)对照)如果OrderBroadcast1.java是这样写的:
public class OrderBroadcast1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收者1接收到有序广播", info); //接收优先级别高的接收者发送的内容 Bundle bundle = getResultExtras(false); String msg = bundle.getString("result"); Log.e("接收者1接收到优先级别高的接收者发送的内容", msg); } }
如果OrderBroadcast2.java是这样写的:
public class OrderBroadcast2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收者2接收到有序广播", info); //优先级别高的接收者发送内容给优先级别低的接收者 Bundle extras = new Bundle(); extras.putString("result", "接收者2发送的content"); setResultExtras(extras); } }
则运行结果为:
(4)
(与(1)对照)如果BroadCastActivity.java中是这样写的:
//发送有序广播 Intent intent = new Intent(); intent.setAction("com.ybj.ORDER_BROADCAST"); intent.putExtra("info", "content"); //在这里指定权限不为空,接收者接收需要声明指定权限 sendOrderedBroadcast(intent, "com.ybj.permission"); break;
清单文件AndroidManifest.xml中需要配置权限接收者才能收到,如果不配置则接收不到:
<!-- 定义一个权限 --> <permission android:name="com.ybj.permission"></permission> <!-- 使用这个权限 --> <uses-permission android:name="com.ybj.permission"/>
运行结果与(1)相同。
3.粘性广播
intent会保持到广播事件结束,没有所谓的10秒限制,10秒限制是指普通的广播如果执行onReceive()时间超过10秒,系统会将这个广播置为可以干掉的candicate,一旦资源不够时就会干掉这个广播不让它执行。
粘性广播需要在AndroidManifest.xml中设置权限:
<!-- 粘性广播权限 --> <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
BroadCastActivity.java中:
//发送粘性广播 Intent intent = new Intent(); intent.setAction("com.ybj.STICKY_BROADCAST"); intent.putExtra("info", "content"); sendStickyBroadcast(intent);
StickyBroadcast.java:
public class StickyBroadcast extends BroadcastReceiver { private boolean flag = true; private int i = 0; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String info = intent.getStringExtra("info"); Log.e("接收到粘性广播内容", info); Log.e("粘性广播接收", "开始。。50秒后结束"); new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub while(flag){ Log.e("i=", "" + i++); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(i == 50){ flag = false; Log.e("粘性广播接收", "广播终止了"); } } } }).start(); } }
在AndroidManifest.xml中注册接收者:
<receiver android:name="broadcast.StickyBroadcast" > <intent-filter> <!-- 为广播设置一个频率 --> <action android:name="com.ybj.STICKY_BROADCAST" /> </intent-filter> </receiver>
运行结果为:
……
这里说一下,广播接收者中不要创建线程或者做一些耗时操作,否则广播结束时会造成异常。
相关文章推荐
- 夜来随笔
- 三道趣味题目
- 好的用户界面-界面设计的一些技巧
- 2015苏州大学ACM-ICPC集训队选拔赛(2)1004
- liunx的安装以及常用的命令操作
- UWP——HttpClient模拟浏览器的GET、POST请求之Win10 Mobile测试
- [Linux] zip 与 unzip 命令
- MongoDB中上传和下载文件
- 关于Maven的安装及创建项目
- 欢迎使用CSDN-markdown编辑器
- 牛客笔试题---求最长重复词长度之和
- 集合运算
- HTML5绘图基础_03_绘制连续线条
- 简单工厂模式
- mysql创建用户
- 友斯考特·杨(Scott Young)看我怎么驾驭MIT计算机科学的课程
- 静态顺序表常见各个接口的实现
- 简单的进度条实现
- Linux下配置Tomcat服务器
- [转]中英文停止词表(stopword)