一个简单的Android BroadcastReceiver 广播实例
来源:互联网 发布:知轩藏书 编辑:程序博客网 时间:2024/05/21 11:29
今天记录一下Android四大组件当中的BroadcastReceiver,也就是广播、广播接收者。
先说一说BroadcastReceiver的生命周期,它的生命周期相当短暂,只有十秒左右,同时咱们新建一个广播,就会发现仅仅只有public void onReceive(Context context, Intent intent){}这一个方法,所以一点注意事项,onReceive()方法执行时不能超过10秒。
直接说怎么使用,首先肯定是创建一个广播接收者类,该类集成BroadcastReceiver,重新onReceive()方法,同时在AndroidManifest.xml配置该广播接收者,注:这都不是重点,因为使用Android studio,只要我们选择new 一个 BroadcastReceiver,这些东西就都有了。
接下来就是第一个重点:
注册该广播接收者,注册方式有两种,一种是静态注册,另一种是动态注册,两种注册方式使用任意一种就行,建议使用静态注册,首先简单,其次,静态注册的广播接收者,即使activity没有启动,该广播接收者也存在,但是动态注册的方式,activity不在激活状态时,对应注册的广播接收者也不存在。
首先来说静态注册,还是类似于之前对activity设置动作一样的,就是给action 设置name属性,方式如下:
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="com.test.jh" /> </intent-filter> </receiver>
接下来说动态注册,动态注册也很简单,Activity中使用registerReceiver()方法,代码如下:
//动态注册广播 MyReceiver myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.test.jh"); registerReceiver(myReceiver,intentFilter);到此我们学会了如何注册去注册一个广播接收者,也知道接收到广播之后只需要在onReceive()方法中进行处理,那么如何发出一个广播呢?也很简单,看代码:
//1.新建一个intent,然后设置Action //2.sendBroadcast(intent) Intent intent = new Intent(); intent.setAction("com.test.jh"); //对应广播接收者注册的动作 intent.putExtra("data","MainActivity"); //可以传递参数,非必须 sendBroadcast(intent);
现在一个最简单的广播基本就完成了,只需要在onReceive()方法中执行一定操作,该广播就成功了,这里的onReceive()方法:
public void onReceive(Context context, Intent intent) { Toast.makeText(context, "我在此处接收到广播,接收到的data为:"+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show(); }我在MainActivity中定义了一个按钮,作用是用来发出广播,现在来看看运行效果:
运行效果,可以看出,当点击了按钮,发出广播时,onReceive()执行了,接收到我发出的广播,并且接收到了传递的参数。
普通广播与有序广播:
普通广播跟有序广播的使用区别在于:
普通广播发出后,所有广播接收者同时接受广播,相互之间无交涉;
有序广播发出后,按照广播接收者的级别高低,依次接收广播(高级别先接收,低级别后接收),级别范围为(-1000 ~ 1000),高级别可以给广播添加参数,低级别也可以接收到高级别添加的参数。同时高级别还有权限中断该广播,中断后低级别无法接收到广播。
发送普通广播跟有序广播的区别在于:
sendBroadcast(intent); //发送普通广播 sendOrderedBroadcast(intent,null); //发送有序广播,参数较多,最少需要两个,后一个参数为接受权限,此处没设置,故为null
前面说了,有序广播会根据广播接收者的级别高低来先后接受广播,所以需要设置级别:
静态设置方式 android:priority="999":
<receiver android:name=".MyReceiver" > <intent-filter android:priority="999"> <action android:name="com.test.jh" /> </intent-filter> </receiver>
动态设置方式 intentFilter.setPriority(999):
//动态注册广播 MyReceiver myReceiver = new MyReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.test.jh"); intentFilter.setPriority(999); //设置有序广播级别 registerReceiver(myReceiver,intentFilter);
案例中创建两个有序广播,高级别先接收,低级别后接收,这里不再展示运行效果。
之前说过高级别广播接收者可以中断广播,只需调用abortBroadcast(),方法即可。
public void onReceive(Context context, Intent intent) { Toast.makeText(context, "我在MySecondReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show(); abortBroadcast(); //该方法可以中断广播,低级别的广播接收者将不能接收到广播。 }再看看高级别的接收者给广播添加参数,然后在低级别的接收者中接到参数:
先看看两个接收者界别高低:
<receiver android:name=".MyReceiver" > <intent-filter android:priority="-999"> <action android:name="com.test.jh" /> </intent-filter> </receiver> <receiver android:name=".MySecondReceiver"> <intent-filter android:priority="990"> <action android:name="com.test.jh" /> </intent-filter> </receiver>然后看看MySecondReceiver:
public class MySecondReceiver extends BroadcastReceiver { public MySecondReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "我在MySecondReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show(); Log.i("debug", "MySecondReceiver: 接收到的data为:" + intent.getStringExtra("data")); // abortBroadcast(); //该方法可以中断广播,低级别的广播接收者将不能接收到广播。 //给广播添加参数 Bundle bundle = new Bundle(); bundle.putString("msg","我是MySecondReceiver,很显然我的级别比你高啊"); setResultExtras(bundle); }}然后看看MyReceiver:
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "我在MyReceiver处接收到广播,接收到的data为:" + intent.getStringExtra("data"), Toast.LENGTH_SHORT).show(); Log.i("debug", "MyReceiver: 接收到的data为:" + intent.getStringExtra("data")); //获取高级别传递的参数 String msg = getResultExtras(true).getString("msg"); Toast.makeText(context,"接收到的参数为:"+msg,Toast.LENGTH_SHORT).show(); Log.i("debug", "MyReceiver: msg:" + msg); }}最后看看运行效果,我们可以看出MySecondReceiver级别高,所以先接收到广播,之后它在广播中添加了参数,MyReceiver级别低,后接受到广播,同时它也接收到了MySecondReceiver传递过来的参数:
- 一个简单的Android BroadcastReceiver 广播实例
- Android的广播(BroadcastReceiver)
- Android BroadcastReceiver实例Demo(有序广播的发送)
- Android广播BroadcastReceiver的ACTION
- Android-BroadcastReceiver广播的用法
- android broadcastReceiver 常用的广播
- BroadcastReceiver Android的广播解析
- Android简单实现BroadCastReceiver广播机制
- Android广播BroadcastReceiver最简单使用示例
- 关于广播接收器BroadcastReceiver的简单总结
- 九.实现一个简单的Android广播
- android BroadcastReceiver广播接受器的使用
- android----广播(BroadcastReceiver)的用法
- Android开发——四大组件BroadcastReceiver实例广播事件的拦截转发
- Android之BroadcastReceiver 广播接受者(短信窃听实例)
- BroadCastReceiver android 广播接收器
- android 广播接收者--BroadcastReceiver
- android 广播接收者--BroadcastReceiver
- 预处理
- jQuery Mobile 入门教程[转]
- Spring AOP的配置
- Anaconda多环境多版本python配置指导
- Java图片压缩
- 一个简单的Android BroadcastReceiver 广播实例
- 关于apache配置虚拟主机后仍打开默认Apache目录的问题
- 如何在Eclipse中引入Spring的jar包并挂载API帮助文档
- LINUX格式化U盘
- Fresco使用二
- Leetcode刷题记录 · No.8 String to Integer(atoi)
- callKit
- jqueryMobile框架页面与页面切换
- Tyvj P1463 智商问题