随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

1、概念:BroadcastReceiver也是Android的四大组件之一,它本质上是一个全局的监听器,用于监听系统全局的广播消息,实现系统中不同组件之间的通信。只要存在与之匹配的Intent被广播出来,BroadcastReceiver总会被激发。指定BroadcastReceiver的Intent既可以在代码中指定,也可以在AndroidManifest中指定。
每次Broadcast事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的OnReceive()方法,此方法执行完后,BroadcastReceiver实例就会被销毁。另外,如果OnReceive方法不能在10秒内执行完成,Android会认为该程序无响应,所以不要在此方法里执行一些耗时的操作。如果确实根据Broadcast来完成一些比较耗时的操作,可以考虑通过Intent启动一个Service来完成。
2、分类:Broadcast分为普通广播和有序广播。
普通广播:完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递效率高。缺点是接收者不能将处理结果传递给下一个接收者,而且无法终止广播。
有序广播:接收者是按预先声明的优先级依次接受广播,接收者可以传递数据给下一个接收者,也可以终止广播继续传播。
下面通过一个示例来演示它们的使用:
本示例在配置优先级时,让FristReceiver的优先级低于SecondReceiver,所以SecondReceiver会先接收到有序广播。
Activity:
package com.home.activity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;import com.home.broadcastreceivertest.R;public class SendBroadActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button sendCommonBroadBtn = (Button) findViewById(R.id.main_btn_send_commonbroad);Button sendSortBroadBtn = (Button) findViewById(R.id.main_btn_send_sortbroad);sendCommonBroadBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 发送普通广播Intent intent = new Intent();intent.setAction("com.home.Common_BroadCast");intent.putExtra("msg", "发普通广播啦!!!");sendBroadcast(intent);}});sendSortBroadBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 发送有序广播Intent intent = new Intent();intent.setAction("com.home.Sort_BroadCast");intent.putExtra("msg", "发有序广播啦!!!");sendOrderedBroadcast(intent, null);}});}
}
FristReceiver:
package com.home.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;public class FristReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 如果收到的是普通广播if ("com.home.Common_BroadCast".equals(intent.getAction())) {String msg = intent.getStringExtra("msg");Toast.makeText(context, "FristReceiver收到的普通广播为:" + msg,Toast.LENGTH_SHORT).show();}// 如果收到的是有序广播if ("com.home.Sort_BroadCast".equals(intent.getAction())) {String msg = intent.getStringExtra("msg");// 取出上一个广播设置的数据Bundle bundle = getResultExtras(true);String PassMsg = "";if (bundle != null) {PassMsg = bundle.getString("message");}String resultMsg = msg + "\n" + PassMsg;Toast.makeText(context, "FristReceiver收到的有序广播为:" + resultMsg,Toast.LENGTH_SHORT).show();}}}
SecondReceiver:
package com.home.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;public class SecondReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 如果收到的是普通广播if ("com.home.Common_BroadCast".equals(intent.getAction())) {String msg = intent.getStringExtra("msg");Toast.makeText(context, "SecondReceiver收到的普通广播为:" + msg,Toast.LENGTH_SHORT).show();}// 如果收到的是有序广播if ("com.home.Sort_BroadCast".equals(intent.getAction())) {String msg = intent.getStringExtra("msg");Toast.makeText(context, "SecondReceiver收到的有序广播为:" + msg,Toast.LENGTH_SHORT).show();Bundle bundle = new Bundle();bundle.putString("message", "传递过程中附加了信息");// 设置数据到下一个接受者setResultExtras(bundle);// 终止广播传递给下一个接受者// abortBroadcast();}}}
配置receiver和优先级:
<receiver android:name="com.home.receiver.FristReceiver"><intent-filter android:priority="50"><action android:name="com.home.Sort_BroadCast"/><action android:name="com.home.Common_BroadCast"/></intent-filter></receiver><receiver android:name="com.home.receiver.SecondReceiver"><intent-filter android:priority="100"><action android:name="com.home.Sort_BroadCast"/><action android:name="com.home.Common_BroadCast"/></intent-filter>