须知
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方法后,该接收器对象被销毁!下次接收时,重新实例化接收器对象!(留给爱动手的你去测试啦 -_-)
该篇结束,若有不足,望不吝赐教!