Android 广播机制 详解,准备Android面试

案例分析:

一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等。。。

Demo 分析:

下面通过一个小DEMO 来讲解一下广播在Android 中如何编写,在Demo中我们设置了一个按钮为按钮设置点击监听通过点击发送广播,在后台中接收到广播并打印LOG信息。代码如下:

public class BroadCastActivity extends Activity {

/** Called when the activity is first created. */

public static final String ACTION_INTENT_TEST = “com.terry.broadcast.test”;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Button btn = (Button) findViewById(R.id.Button01);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ACTION_INTENT_TEST);

sendBroadcast(intent);

}

});

}

}

接收器代码如下:

public class MyBroadCast extends BroadcastReceiver {

public MyBroadCast() {

Log.v(“BROADCAST_TAG”, “myBroadCast”);

}

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

Log.v(“BROADCAST_TAG”, “onReceive”);

}

}

Android 广播的生命周期

在上面的接收器中,继承了BroadcastReceiver 并重写了它的onReceive 并构造了一个函数,下面通过图片来一步一步认识 Android 广播的生命周期。当我点击一下按钮,它向Android 发送了一个广播,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBGjTpCo-1637897283432)(http://hi.csdn.net/attachment/201108/8/0_1312772331aM1d.gif)]

这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88ZIrk7I-1637897283452)(http://hi.csdn.net/attachment/201108/8/0_1312772384IhuK.gif)]

下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CYclu97a-1637897283453)(http://hi.csdn.net/attachment/201108/8/0_1312772415Bx82.gif)]

下面来看一下SDK给出的解释:

大意为:如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。

至此,大家应该能明白 Android 的广播生命周期的原理,代码也不用多介绍,很简单的一个发送广播并处理广播的Demo。

Android 如何判断并筛选广播?

前面说过 Android 的广播有各式各样,那么Android 系统是如何帮我们处理我们需要哪种广播并为我们提供相应的广播服务呢?这里有一点需要大家注意,每实现一个广播接收类必须在我们应用程序中的 manifest 中显式的注明哪一个类需要广播,并为其设置过滤器,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fz23CPkY-1637897283454)(http://hi.csdn.net/attachment/201108/8/0_1312773489R491.gif)]

Tip:action 代表一个要执行的动作,在Andriod 中有很action 比如 ACTION_VIEW,ACTION_EDIT

那么有些人会问了,如果我在一个广播接收器中要处理多个动作呢?那要如何去处理?

在Android 的接收器中onReceive 以经为我们想到的,同样的你必须在Intent-filter 里面注册该动作,可以是系统的广播动作也可以是自己需要的广播,之后你之需要在onReceive 方法中,通过intent.getAction()判断传进来的动作即可做出不同的处理,不同的动作。具体大家可以去尝试测试一下。

小结:

  • 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。

  • 使用广播必须要有一个intent 对象必设置其action动作对象

  • 使用广播必须在配置文件中显式的指明该广播对象

  • 每次接收广播都会重新生成一个接收广播的对象

  • 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理

  • **如果在AndroidManifest.xml中注册,当应用程序关闭的时候,也会接收到广播。在应用程序中注册就不产生这种情况了。

**

下面自己来看一下如何在应用程序中注册BroadcastReceiver

利用代码注册 BroadcastReceiver 时有以下步骤:

1)生成一个 BroadcastReceiver 对象;

2)生成一个 IntentFilter 对象;

3)为 IntentFilter 对象添加一个 Actio

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

n ;

4)利用 IntentFilter 和 BroadcastReceiver 绑定注册一个 BroadcastReceiver 到系统中,当系统广播该Action事件的时候,就出发该BroadcastReceiver。

应用程序代码:

public class SMSReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

System.out.println(“receive message”);

// 对接受的短消息进行处理

// 接受 Intent 对象中的数据

Bundle bundle = intent.getExtras();

// 在 Bundle 对象当中有一个属性名为 pdus , 这个属性的值是一个 Object数组

Object[] myObjects = (Object[]) bundle.get(“pdus”);

// 创建一个 SmsMessage 类型的数组

SmsMessage[] message = new SmsMessage[myObjects.length];

System.out.println(message.length);

for (int i = 0; i < myObjects.length; i++) {

// 使用 Object 数组当中的对象创建 SmsMessage 对象

message[i] = SmsMessage.createFromPdu((byte[]) myObjects[i]);

System.out.println(message[i].getDisplayMessageBody());

}

}

}

public class SMSReceiver extends BroadcastReceiver {
Objects.length; i++) {

// 使用 Object 数组当中的对象创建 SmsMessage 对象

message[i] = SmsMessage.createFromPdu((byte[]) myObjects[i]);

System.out.println(message[i].getDisplayMessageBody());

}

}

}

public class SMSReceiver extends BroadcastReceiver {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值