赞
踩
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(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 {
-
- @Override
- protected 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() {
-
- @Override
- public void onClick(View v) {
- // 发送普通广播
- Intent intent = new Intent();
- intent.setAction("com.home.Common_BroadCast");
- intent.putExtra("msg", "发普通广播啦!!!");
- sendBroadcast(intent);
- }
- });
- sendSortBroadBtn.setOnClickListener(new OnClickListener() {
-
- @Override
- public 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 {
-
- @Override
- public 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 {
-
- @Override
- public 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>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。