Android开发小知识-BroadCastReceiver的使用
来源:互联网 发布:全国社区网络春晚 编辑:程序博客网 时间:2024/05/16 17:04
须知
1、广播接收器是用来接收系统或自己发出的广播,然后做出响应的。
2、广播分为普通广播和有序广播(和普通广播不同的是,它的接收器根据级别不同,接收到广播的顺序是不同的,级别高的先接收到广播,并有能力阻止该广播向下传递)。
3、广播接收器需要注册(Android的四大组件都是需要注册的),注册分为静态和动态两种。
静态:在AndroidManifest.xml文件中注册。
动态:通过Java代码进行注册。
普通广播测试小例子
1、自定义广播接收器类,继承系统的BroadcastReceiver类,并覆写onReceive()方法。
package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverOne extends BroadcastReceiver { public ReceiverOne() { System.out.println("ReceiverOne --> 构造函数被调用!"); } //当接收到广播后,会执行该方法。我们可以在这里进行数据的相关操作 @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving System.out.println("ReceiverOne --> onReceive函数被调用!"); }}
2、注册
a)静态注册,在AndroidManifest.xml文件中配置。
<activity android:name=".MainActivity"></activity> <!--BroadCastReceiver注册方式 name 指定该接收器对应类名称, enable 是否能被实例化,true则可以被实例化,false则不能, exported 是否能接受其他应用或系统的广播,true则可以接收,false则不能, receiver是和activity处于同一级别,都是application的子标签。 --> <receiver android:name=".ReceiverOne" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.mindto.sendNormalAction"/> </intent-filter> </receiver>
b)动态注册,在Activity中使用代码注册。
//注册广播,这里的receiverOne和filter是成员变量名称,后面会给出完整代码System.out.println("广播接收器已经注册!");//实例化接收器receiverOne = new ReceiverOne();//实例化过滤器filter = new IntentFilter(MyIntentAction.ACTION_NORMAL);//注册registerReceiver(receiverOne, filter);
注意:动态注册的接收器,需要手动解除,我们一般在活动退出时,进行解除。
//在退出程序的时候解除注册 @Override protected void onDestroy() { unregisterReceiver(receiverOne); System.out.println("广播接收器已经解除!"); super.onDestroy(); }
3、其他类代码
MainActivity.java
package com.mindto.broadcastreceiverdemo;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { //定义控件 private Button sendNormal; private Button sendOrder; //广播接收器,用于动态代码注册 private ReceiverOne receiverOne = null; //广播过滤器 private IntentFilter filter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化控件(需要在setContentView(R.layout.activity_main)之后进行)并设置监听器 //实例化监听器对象 MyBtnOnClickListener btnOnClickListener = new MyBtnOnClickListener(); sendNormal = (Button) findViewById(R.id.normal); sendNormal.setOnClickListener(btnOnClickListener); sendOrder = (Button) findViewById(R.id.order); sendOrder.setOnClickListener(btnOnClickListener); //注册广播 System.out.println("广播接收器已经注册!"); receiverOne = new ReceiverOne(); filter = new IntentFilter(MyIntentAction.ACTION_NORMAL); registerReceiver(receiverOne, filter); } //在退出程序的时候解除注册 @Override protected void onDestroy() { unregisterReceiver(receiverOne); System.out.println("广播接收器已经解除!"); super.onDestroy(); } /** * 定义按钮监听器类,处理按钮的点击事件 */ class MyBtnOnClickListener implements View.OnClickListener{ //定义Intent Intent intent = null; @Override public void onClick(View v) { //点击按钮后进行Intent的实例化 intent = new Intent(); switch (v.getId()){ //当点击发送普通广播按钮后 case R.id.normal: //设置action intent.setAction(MyIntentAction.ACTION_NORMAL); //发送普通广播 MainActivity.this.sendBroadcast(intent); break; //当点击发送有序广播按钮后 case R.id.order: //设置action intent.setAction(MyIntentAction.ACTION_ORDER); //发送有序广播,第二个参数为该广播使用的权限 MainActivity.this.sendOrderedBroadcast(intent, null); break; } } }}
MyIntentAction.java(主要放一些使用到的字符串,提高重用性)
package com.mindto.broadcastreceiverdemo;/** * Created by mindto on 2016/3/8. */public class MyIntentAction { //发送普通广播action public static final String ACTION_NORMAL= "com.mindto.sendNormalAction"; //发送有序广播action public static final String ACTION_ORDER= "com.mindto.sendOrderAction";}
4、测试结果
运行界面
点击一次(注意这里是点击一次)普通广播按钮后,logcat中输出内容为
我们会发现输出存在异常:最后两行多余!发送了一条广播(这是可以在代码中确定的),但是却出现了两次接收的情况!原因是自己粗心,没有把静态注册的相关代码删除!这就提醒我们:静态注册和动态注册选择一个就好!
删除静态注册代码后,点击一次,发现输出正常!
自此普通广播测试完毕!
有序广播测试小例子
1、有序广播的测试需要多个接收器的参与,这样才能分出级别!我们需要实现多个接收器类。只需要在上例基础之上,添加接收器类,然后注册即可!
2、改动的代码
ReceiverTwo.java
package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverTwo extends BroadcastReceiver { public ReceiverTwo() { System.out.println("ReceiverTwo --> 构造函数被调用!"); } @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving System.out.println("ReceiverTwo --> onReceive函数被调用!"); }}
ReceiverThree.java
package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverThree extends BroadcastReceiver { public ReceiverThree() { System.out.println("ReceiverThree --> 构造函数被调用!"); } @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving System.out.println("ReceiverThree --> onReceive函数被调用!"); }}
MainActivity.java(在上面的同名文件中有改动,下面用加粗显示)
package com.mindto.broadcastreceiverdemo;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity { //定义控件 private Button sendNormal; private Button sendOrder; //广播接收器,用于动态代码注册 private ReceiverOne receiverOne = null; /***************下面两行改动*******************/ private ReceiverTwo receiveTwo = null; private ReceiverThree receiverThree = null; //广播过滤器 private IntentFilter filterOne = null; /***************下面两行改动*******************/ private IntentFilter filterTwo = null; private IntentFilter filterThree = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化控件(需要在setContentView(R.layout.activity_main)之后进行)并设置监听器 //实例化监听器对象 MyBtnOnClickListener btnOnClickListener = new MyBtnOnClickListener(); sendNormal = (Button) findViewById(R.id.normal); sendNormal.setOnClickListener(btnOnClickListener); sendOrder = (Button) findViewById(R.id.order); sendOrder.setOnClickListener(btnOnClickListener); //注册广播 System.out.println("开始注册广播接收器!"); receiverOne = new ReceiverOne(); filterOne = new IntentFilter(MyIntentAction.ACTION_ORDER); filterOne.setPriority(100); registerReceiver(receiverOne, filterOne); /***************下面八行改动*******************/ receiveTwo = new ReceiverTwo(); filterTwo = new IntentFilter(MyIntentAction.ACTION_ORDER); filterTwo.setPriority(80); registerReceiver(receiveTwo, filterTwo); receiverThree = new ReceiverThree(); filterThree = new IntentFilter(MyIntentAction.ACTION_ORDER); filterThree.setPriority(60); registerReceiver(receiverThree, filterThree); System.out.println("广播接收器注册完成!"); } //在退出程序的时候解除注册 @Override protected void onDestroy() { unregisterReceiver(receiverOne); unregisterReceiver(receiveTwo); unregisterReceiver(receiverThree); System.out.println("广播接收器解除完成!"); super.onDestroy(); } /** * 定义按钮监听器类,处理按钮的点击事件 */ class MyBtnOnClickListener implements View.OnClickListener{ //定义Intent Intent intent = null; @Override public void onClick(View v) { //点击按钮后进行Intent的实例化 intent = new Intent(); switch (v.getId()){ //当点击发送普通广播按钮后 case R.id.normal: //设置action intent.setAction(MyIntentAction.ACTION_NORMAL); //发送普通广播 MainActivity.this.sendBroadcast(intent); break; //当点击发送有序广播按钮后 case R.id.order: //设置action intent.setAction(MyIntentAction.ACTION_ORDER); //发送有序广播,第二个参数为该广播使用的权限 MainActivity.this.sendOrderedBroadcast(intent, null); break; } } }}
3、运行测试
点击一次有序广播后,logcat输出内容:
根据动态注册代码,级别高的先接受到广播。
下面在ReceiverTwo.java中的onReceive()方法中添加
//终止广播的向下传送abortBroadcast();
再次运行,点击有序广播后,logcat输出内容为:
发现ReceiverThree的onReceive方法并没有调用,说明级别高的接收器可以阻止广播向下传递!
总结
1、动态注册和静态注册,选择一个就OK,过而不及!
2、静态注册的广播接收器,每接收一个广播,执行onReceive方法后,该接收器对象被销毁!下次接收时,重新实例化接收器对象!(留给爱动手的你去测试啦 -_-)
该篇结束,若有不足,望不吝赐教!
- Android开发小知识-BroadCastReceiver的使用
- Android开发小知识-TimePickerDialog和DatePickerDialog的使用
- Android开发——BroadcastReceiver知识总结
- [Android] BroadCastReceiver的使用
- Android -- BroadcastReceiver的使用
- Android BroadcastReceiver的使用
- 【android】BroadcastReceiver的使用
- Android开发小知识-Spinner控件使用
- Android开发小知识-ExpandableListView使用
- Android 开发小知识
- android 开发小知识
- android 开发小知识
- Android开发小知识
- Android开发小知识
- Android开发小知识
- Android 开发小知识
- android开发中积累的小知识
- android开发中积累的小知识
- jedis调用redis之String数据Key-Value
- 离开微软这两年
- linux基础教程--安装Android SDK
- Bug: Application called a GL11 Pointer method with an indirect Buffer
- oracle不记得所有账户和密码怎么办 ?回车出现一个2
- Android开发小知识-BroadCastReceiver的使用
- BZOJ 3110 [Zjoi2013]K大数查询
- 构建高效安全的Nginx Web服务器
- MySQL 调编码
- 动画入门
- 软件盘输入法窗口
- JAVA利用HttpClient进行POST请求(HTTPS)
- Linux修改时间,云主机情况下
- Maven环境搭建与在Eclipse中的配置