您的位置:首页 > 移动开发 > Android开发

Android 广播接收器 BroadcastReceiver 注册、注销、优先级、拦截

2015-12-16 08:42 387 查看




BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:

BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。

创建一个新工程LearnBroadcastReceiver,一个空Activity

广播接收器MyReceiver
用于显示Intent调用
MyReceiver1
隐式Intent
拦截广播
MyReceiver2
隐式Intent
实现主动注册也注销,拦截广播
创建一个MyReceiver,MyReceiver1,MyReceiver2广播接收类扩展至


publicclassMyReceiverextendsBroadcastReceiver{

publicMyReceiver(){

}

@Override

publicvoidonReceive(Contextcontext,Intentintent){

System.out.println("第0个广播接收器接收到消息是:====="+intent.getStringExtra("data"));

}

}


publicclassMyReceiver1extendsBroadcastReceiver{

publicMyReceiver1(){

}

@Override

publicvoidonReceive(Contextcontext,Intentintent){

System.out.println("第1个广播接收器接收到消息是:"+intent.getStringExtra("data"));

if(intent.getStringExtra("isLanJie").equals("TRUE")){

abortBroadcast();//拦截广播,不让优先级别低的接收该到消息

}

}

}


publicclassMyReceiver2extendsBroadcastReceiver{

publicstaticfinalStringACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2";

publicMyReceiver2(){

}

@Override

publicvoidonReceive(Contextcontext,Intentintent){

System.out.println("第2个广播接收器接收到消息是:"+intent.getStringExtra("data"));

if(intent.getStringExtra("isLanJie").equals("TRUE")){

abortBroadcast();//拦截广播,不让优先级别低的接收该到消息

}

}

}


修改androidManifest.xml中广播接收器

<receiver

android:name=
".MyReceiver"

android:enabled=
"true"

android:exported="true"
>

</receiver>

<!--<receiverandroid:name=".MyReceiver2">-->

<!--<intent-filter>-->

<!--<actionandroid:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2"/>-->

<!--</intent-filter>-->

<!--</receiver>-->

<receiver

android:name=
".MyReceiver1"

android:enabled=
"true"

android:exported="true"
>

<intent-filterandroid:priority="1">

<actionandroid:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2"/>

</intent-filter>

</receiver>



在创建完我们的MyReceiver2之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{

ButtonbSend;

privateMyReceiver2myReceiver2=null;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bSend=(Button)findViewById(R.id.btnSendMsg);

bSend.setOnClickListener(this);

findViewById(R.id.btnReg).setOnClickListener(this);

findViewById(R.id.btnUnReg).setOnClickListener(this);

findViewById(R.id.btnsendYinShi).setOnClickListener(this);

}

@Override

publicvoidonClick(Viewv){

switch(v.getId()){

caseR.id.btnSendMsg:

//发送消息

Intentintent=newIntent(this,MyReceiver.class);

intent.putExtra("data","消息来自czg");

sendBroadcast(intent);

break;

caseR.id.btnsendYinShi:

//没有自动注册的广播接收器自能用隐式的Intent进行创建(没有告诉要发送给哪个接收器,所有的接收器都可以接受到,优先级比较高的接收器可以根据需要拦截后面接收的的接收)

Intentintent2=newIntent(MyReceiver2.ACTION);

intent2.putExtra("data","消息来自czg");

CheckBoxcb=(CheckBox)findViewById(R.id.checkBox);

if(cb.isChecked()==true){

intent2.putExtra("isLanJie","TRUE");

}else{

intent2.putExtra("isLanJie","FALSE");

}

//sendBroadcast(intent2);

sendOrderedBroadcast(intent2,null);//发送可以被拦截的广播,第二个参数可以指定权限

break;

caseR.id.btnReg://注册

if(myReceiver2==null){

myReceiver2=newMyReceiver2();

registerReceiver(myReceiver2,newIntentFilter(MyReceiver2.ACTION));

}

break;

caseR.id.btnUnReg://注销

if(myReceiver2!=null){

unregisterReceiver(myReceiver2);

myReceiver2=null;

}

break;

}

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: