广播

作者: 残非 | 来源:发表于2020-12-16 14:17 被阅读0次

local 本地的

broadcast 广播

receive 接到;收到;

filter 过滤器

battery 电池

广播简介

Android广播是一个全局监听器,分为广播发送者和广播接收者两部分,广播接收者(BroadcastReceiver)是Android的四大组件之一。

参考资料:android 系统广播大全

广播机制

Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。广播作为Android组件间的通信方式,可以使用的场景如下:

1.同一app内部的同一组件内的消息通信(单个或多个线程之间);

2.同一app内部的不同组件之间的消息通信(单个进程);

3.同一app具有多个进程的不同组件之间的消息通信;

4.不同app之间的组件之间消息通信;

5.Android系统在特定情况下与App之间的消息通信。

从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:

1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;

2.广播发送者通过binder机制向AMS发送广播;

3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;

4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

参考资料:Android总结篇系列:Android广播机制

广播类型

全局广播 & 本地广播

静态广播 & 动态广播

普通广播 & 有序广播

总结:应用间通信使用全局广播,应用内通信建议使用本地广播。

全局广播

BroadcastReceiver

用于接收广播,即可用于接收全局广播,也可用于接收本地广播。

定义一个广播接收者

/**
 * 全局广播
 */
public class GlobalReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getStringExtra("name");
        System.out.println("GlobalReceiver.onReceive():" + name);
    }
}

动态注册全局广播

Context.registerReceiver (receiver,intentFilter);

静态注册全局广播

<application ... >
    <receiver android:name="com.haoxueren.broadcast.GlobalReceiver">
        <intent-filter>
            <action android:name="CUSTOM_GLOBAL_INTENT_ACTION" />
        </intent-filter>
    </receiver>
</application>

发送一个全局广播

// 发送一个全局广播
Context context = getApplicationContext();
Intent intent = new Intent();
intent.putExtra("name", "haoxueren");
// 指定当前广播的ACTION
intent.setAction("CUSTOM_GLOBAL_INTENT_ACTION");
// 发送全局广播(无序广播)
context.sendBroadcast(intent);
// 发送全局广播(有序广播)
// context.sendOrderedBroadcast(intent);

普通广播 & 有序广播

普通广播:通过context.sendBroadcast()发送,完全异步执行,所有的广播接收者几乎会同时接收到该广播,这种方式比较高效,但同时也意味者接收者无法篡改或拦截广播结果。

有序广播:通过context.sendOrderedBroadcast()发送,有序广播按照广播接收者的优先级依次传递,优先级高的接收者收到广播后可以对广播内容进行篡改或拦截。

粘性广播

已过时。

<receiver android:name="com.haoxueren.broadcast.GlobalReceiver">
    <intent-filter android:priority="1000">
        <action android:name="CUSTOM_GLOBAL_INTENT_ACTION" />
    </intent-filter>
</receiver>

本地广播(LocalBroadcastManager)

LocalBroadcastManager,是用于注册发送本地广播的帮助类。不同与全局广播,本地广播只能用于应用内(当前进程内)通信,无法用于进程间通信。

相比与全局广播,本地广播有以下优势:

  1. 通过本地广播发送的数据不会离开你的APP,因此无需担心数据泄漏问题。

  2. 别的应用不可能向你的应用发送本地广播,因此无法担心有被利用的安全漏洞。

  3. 相比发送全局广播,发送本地广播的效率更高。

本地广播的使用方法

  1. 发送广播时,必须之前已经注册过的接收者才能收到。发送之后再注册的接收是收不到广播的。
  2. 在不需要时要及时解除注册,否则会导致内存泄漏。

第1步:发送本地广播

// 获取本地广播管理者对象
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
// 创建要发送的Intent对象
Intent intent = new Intent();
// 指定当前广播的INTENT_ACTION
intent.setAction("CUSTOM_INTENT_ACTION");
intent.putExtra("name", "haoxueren");
intent.putExtra("age", "33");
// 发送一个本地广播
manager.sendBroadcast(intent); // 异步发送
// manager.sendBroadcastSync(intent); // 同步发送

第2步:注册(接收)本地广播

// 获取广播管理者对象(单例模式)
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
// 指定IntentFilter,表明要接收哪个广播
IntentFilter filter = new IntentFilter("CUSTOM_INTENT_ACTION");
// 创建广播接收者对象
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", -1);
        System.out.println(name + ":" + age);
    }
};
// 注册广播(页面销毁时解除注册)
manager.registerReceiver(receiver, filter);

第3步:解除注册本地广播

// 解除注册当前本地广播
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
manager.unregisterReceiver(receiver);

广播的生命周期

BroadcastReceiver对象仅在调用onReceive(Context, Intent)期间有效。 一旦你的代码从这个函数返回,系统就认为该对象已经完成并且不再处于活动状态。

这对于在 onReceive(Context, Intent)实现中可以执行的操作具有重要影响:任何需要异步操作的任何操作都不可用,因为您需要从该函数返回以处理异步操作,但此时BroadcastReceiver不再处于活动状态,因此在异步操作完成之前,系统可以自由地终止其进程。

特别是,您可能不会显示对话框或绑定到BroadcastReceiver中的服务。 对于前者,您应该使用NotificationManager API。 对于后者,您可以使用Context.startService()向服务发送命令。


目前正在执行BroadcastReceiver的过程(也就是说,目前正在其 onReceive(Context, Intent)方法中运行该代码)被视为前台进程,并将由系统继续运行,除非内存压力过大。

一旦从onReceive()返回,BroadcastReceiver不再处于活动状态,其宿主进程与运行在其中的任何其他应用程序组件一样重要。 这一点尤其重要,因为如果该进程仅托管BroadcastReceiver(用户从未或最近未与之交互过的应用程序的常见情况),那么在从onReceive()返回时,系统将认为其进程是空的并积极地杀死它使资源可用于其他更重要的流程。

这意味着对于长时间运行的操作,您通常 Service与BroadcastReceiver结合使用,以保持包含过程在整个操作过程中处于活动状态。

Android系统广播

[图片上传失败...(image-3214ba-1608099422429)]

进程间通信的5种方式

  1. Bundle(四大组件间)

  2. 文件共享
    可参考Android进程通信 - 序列化Serialzable与Parcelable中的示例

  3. AIDL (基于Binder)
    能自动生成Binder文件的工具,相当于工具。
    Android进程通信 - AIDL的使用方法

  4. Messenger(基于Binder)
    类似于Hnadler发消息用法
    Android进程间通信 - Messenger的使用和理解

  5. ContentProvider(基于Binder)
    Android进程间通信 - ContentProvider内容提供者

  6. Socket(网络)
    Android进程间通信 - Socket使用(TCP、UDP)

相关文章

  • Android基础:BroadcastReceiver(应用场景

    广播的类型 广播的类型主要分为: 普通广播 系统广播 无序广播 有序广播 粘性广播 App应用内广播 普通广播(i...

  • 我要做 Android 之 广播

    广播的分类: 普通广播 有序广播 本地广播 粘性广播 一:普通广播 普通广播是一种完全异步执行的广播,在广播发出之...

  • 入门第五天

    广播接收器 分为动态广播器和静态广播器,静态广播器只能接受显式广播 广播 分为标准广播和有序广播,标准广播使得所有...

  • 第一行代码

    —— 广播机制 纲要 广播简介 广播接收动态注册静态注册 广播发送标准广播有序广播 本地广播 最佳实践 简介-全局...

  • 第五章 全局大喇叭,详解广播机制

    5.1广播机制简介 广播分为标准广播和有序广播 标准广播:异步执行广播,广播发出后,所有的广播接收器都会几乎在同时...

  • BroadcastReceiver详解

    1、广播的类型 广播分为标准广播和有序广播。 1.1、标准广播 标准广播是一种完全异步执行的广播,在广播发出之后,...

  • Android - base - Broadcast

    四大组件之广播 大纲 广播机制简介 广播接收器 广播发信器 接收系统广播 发送自定义广播 本地广播 #广播机制简介...

  • Android广播机制

    广播机制 发送广播 Android中的广播主要分为两种类型——标准广播和有序广播 发出标准广播 标准广播发出后,所...

  • Android广播机制

    广播分为标准广播 和 有序广播一、标准广播 三、系统广播Android内置很多系统级别广播,如手机开机后发一条广播...

  • Android广播

    参考:Android总结篇系列:Android广播机制Android广播机制 一. 广播 1. 广播是什么? 广播...

网友评论

      本文标题:广播

      本文链接:https://www.haomeiwen.com/subject/rwfkyctx.html