Android组件Broadcast Receiver学习

Android大量使用了Broadcast Receiver来广播系统事件,如网络连接、扩展dock状态及来电的变化。

一、注意:

android
中service和broadcastreceiver都是运行在主UI线程中,如果在他们中执行耗时操作,若果操作持续的时间超过android平台的约定,那么android平台会认为该程序出现异常,从而抛出ANR异常。如果在onReceive()的处理中,用户进行了UI触发,将可能引发ANR异常,不过和activity的时间限制不同,receiver在10秒而非5秒后触发ANR。

处理耗时的Broadcast
Receiver时,一般采用的做法是将其置于一个Service中:(也可以通过在程序中使用registerReceiver(receiver, filter, broadcastPermission, scheduler)方法中的最后一个参数指定要运行的广播接收器的线程。)

1、在广播receiver的onReceive()中获取static的wake lock,静态是为了在广播接收器和service之间通信。因为service没有什么其他法将一个wake lock对象传递到service中。

2、开启local service使得进程不被终结。

3、在service中开启一个worker线程来进行处理。

4、当worker线程处理完,要通知service结束,可以直接stop(),或者通过Handler在主线程中结束service。

5、service要关闭静态的wake lock

二、BrocastReceiver用法:

1、继承BroadcastReceiver类,重写其onReceive函数:

/** 自定义BroadcastReceiver,只需重写其onReceive函数即可**/
public class TestBroadcastReceiver extends BroadcastReceiver{
    public static final String ACTION = "com.TestBroadcastReceiver";

    /** receiver接收到消息后的响应*/
    @Override
    public void onReceive(Context context, Intent intent) {
        // @value String TEXT_EXTRA = "TEXT_EXTRA";
        String reString = intent.getStringExtra(MainActivity.TEXT_EXTRA);
        Toast.makeText(context, reString, Toast.LENGTH_SHORT).show();
    }
}

2、可以选择在代码中动态注册BroadcastReceiver,也可以在Manifest中注册全局BroadcastReceiver
   

两种注册方式的区别:

1)在manifest中注册的receiver总是活动的,当应用程序被终止或者未启动时,也可以接收Broadcast Intent;

2)代码中注册的receiver通常是影响特定Activity的UI,而且该receiver只会在包含它的应用程序组件运行时才会响应Broadcast
Intent;一般较好的注册实现方式为在onResume()中注册,在onPause()中注销。

(1)在manifest中注册receiver

<!-- 注意要放在application中 -->
<!-- 在manifest中注册receiver-->
<receiver android:name=".TestBroadcastReceiver"
      android:permission="TestBroadcastReceiver">
    <intent-filter>
        <action android:name="com.TestBroadcastReceiver"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

(2)在Activity代码中动态注册BroadcastReceiver,较好的实践方式是在onResume中注册,在onPause中注销。

    private IntentFilter intentFilter;
    private TestBroadcastReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter(TestBroadcastReceiver.ACTION);
        receiver = new TestBroadcastReceiver();
    }

    @Override
    public void onResume(){
        super.onResume();
        // 注册receiver
        registerReceiver(receiver, intentFilter);
    }

    @Override
    public void onPause(){
        // 注销receiver
        unregisterReceiver(receiver);
        super.onPause();
    }

3、发送Intent消息

    // 发送Intent信息,以便BrocastReceiver接收
    Intent intent = new Intent(TestBroadcastReceiver.ACTION);
    // @value String ACTION = "com.TestBroadcastReceiver";
    intent.putExtra(TEXT_EXTRA, "Send Message");
    // @value String TEXT_EXTRA = "TEXT_EXTRA"
    // 发送Intent消息
    sendBroadcast(intent);

三、Local Broadcast Manager(局部广播管理器)

Local Broadcast Manager包含在Android Support Library中,用于简化注册Brocast Intent,以及在应用程序内的组件之间发送Broadcast Intent

的工作。因为局部广播的作用域要稍小一点,所以使用Local Broadcast Manager比全局广播更加高效,也更加安全。

用法与代码中注册的BroadcastReceiver大致相同:

    // 单例模式获取实例
    LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);

    // 自定义BroadcastReceiver
    BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {

        }};

    // 注册receiver
    lbm.registerReceiver(broadcastReceiver, new IntentFilter(TestBroadcastReceiver.ACTION));
    // 发送Intent消息
    lbm.sendBroadcast(new Intent(TestBroadcastReceiver.ACTION));
    // 注销receiver
    lbm.unregisterReceiver(broadcastReceiver);

四、相关面试题

1、注册广播接收者两种方式的区别,及优缺点

答:首先写一个类要继承BroadcastReceiver

第一种:在清单文件中声明receiver

第二种使用代码进行注册registerReceiver

两种注册类型的区别是:

1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。

优缺点:

动态注册优点:在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。

静态注册优点:动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

2、Android引入广播机制的用意? 

答:a:从MVC的角度考虑(应用程序内)

    其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。

    b:程序间互通消息(例如在自己的应用程序内监听系统来电)

c:效率上(参考UDP的广播协议在局域网的方便性)

d:设计模式上(反转控制的一种应用,类似监听者模式)

3、解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver 

答:

一个activity呈现了一个用户可以操作的可视化用户界面

一个service不包含可见的用户界面,而是在后台运行,可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信

一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面

content provider在接收到ContentResolver的请求时被激活。

activity, service和broadcast receiver是被称为intents的异步消息激活的。

一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI

Intent对象可以显式的指定一个目标component(组件)。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。

它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 15:00:19

Android组件Broadcast Receiver学习的相关文章

【Android中Broadcast Receiver组件具体解释 】

BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,并做出相应处理的组件.非常多广播是源自于系统代码的──比方,通知时区改变.电池电量低.拍摄了一张照片或者用户改变了语言选项.应用程序也能够进行广播──比方说,通知其他应用程序一些数据下载完毕并处于可用状态. ②应用程序能够拥有随意数量的广播接收器以对全部它感兴趣的通知信息予以响应.全部的接

Android基础之五:四大组件(Broadcast Receiver)

Broadcast Receiver作为Android四大组件之一,在整个系统中广泛运用,系统中存在各种各样的广播机制,例如下载,网络等都有具体的广播接收器 广播在很大程度上简化了开发,可以通过广播监听系统状态变化,监听另一App中事件传递,可以接收当前App中不同组件,不同UI.不同线程之间的消息传递 广播的创建与使用 创建一个继承自BroadcastReceiver类的子类,重写onReceiver方法 public class MReceiver extends BroadcastRece

android的Broadcast receiver

broadcast receiver是用来监听intent的. android大量使用了broadcast receiver,比如:开机.电话打进来.发送消息,手机电量过低 有两种方式注册broadcast receiver. 1.代码中注册 2.在manifest文件中进行注册 使用这种方式注册的receiver始终处于活动状态,即使应用程序关闭了 还有一个sticky broadcast,他是broadcast的变体.这个broadcast会保存最后一次广播的值,当新注册的一个boradca

Android四大组件-Broadcast Receiver

http://www.jianshu.com/p/1013a366cc72 前言 基础知识. 1.Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播可以跨进程甚至跨App直接通信. 2.你的APP可以接收广播(如当电话呼入时,或者数据网络可用时)进行接收并做出响应. 3.广播接收器没有用户界面.然而,它们可以启动一个Activity或Service服务来响应它们收到的信息,或者用NotificationMa

Android中Broadcast Receiver组件具体解释

BroadcastReceiver(广播接收器)是Android中的四大组件之中的一个. 以下是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,并做出相应处理的组件.非常多广播是源自于系统代码的──比方,通知时区改变.电池电量低.拍摄了一张照片或者用户改变了语言选项.应用程序也能够进行广播──比方说,通知其他应用程序一些数据下载完毕并处于可用状态. ②应用程序能够拥有随意数量的广播接收器以对全部它感兴趣的通知信息予以响应.全部的接

【android】Broadcast Receiver

广播接收器 创建方法 新建类继承自BroadcastReceiver,实现抽象方法OnReceive,收到广播后就会执行这个方法,(要在manifest里面注册这个类) 发送广播 sendBroadcast(new intent(activity,broadcast类)): 也可以在intent中附加信息 intent i = XX i.putExtra("名字","内容"): 在onRecevice方法,参数的数据会以参数传进来,就是参数中的intent,获取数据

Android开发学习之路--Broadcast Receiver初体验

学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyBroadcastReceiver,代码如下: package com.example.jared.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import andro

【Android开发精要笔记】Android组件模型解析

Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件的功能都可以被充分的复用.来自不同应用的组件可以有机地结合在一起,共同完成任务. 基于Mashup的Android应用模型 三个基本要素:组件.连接.配置 接口就是实现单元.从代码来看,组件就是派生自特定接口或基类的子类的实现,如界面组件Activity就是指派生自android.app.Activ

【Android的从零单排开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver

广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都可以通过广播来通知用户.要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身. 一.广播的功能和特征 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码