首页编程androidbroadcast?Android系统中的Broadcast和Intent有什么区别

androidbroadcast?Android系统中的Broadcast和Intent有什么区别

编程之家2023-11-0669次浏览

亲爱的读者们,你是否对androidbroadcast和Android系统中的Broadcast和Intent有什么区别的相关问题感到困惑?别担心,今天我将为你解答这些问题,让你对此有更清晰的认识。

androidbroadcast?Android系统中的Broadcast和Intent有什么区别

22 AndroidBroadcast广播机制

广播(Broadcast)机制用于进程/线程间通信,广播分为广播发送和广播接收两个过程,其中广播接收者BroadcastReceiver便是Android四大组件之一。

BroadcastReceiver分为两类:

从广播发送方式可分为三类:

广播在系统中以BroadcastRecord对象来记录,该对象有几个时间相关的成员变量.

广播注册,对于应用开发来说,往往是在Activity/Service中调用 registerReceiver()方法,而Activity或Service都间接继承于Context抽象类,真正干活是交给ContextImpl类。另外调用getOuterContext()可获取最外层的调用者Activity或Service。

[ContextImpl.java]

androidbroadcast?Android系统中的Broadcast和Intent有什么区别

其中broadcastPermission拥有广播的权限控制,scheduler用于指定接收到广播时onRecive执行线程,当scheduler=null则默认代表在主线程中执行,这也是最常见的用法

[ContextImpl.java]

ActivityManagerNative.getDefault()返回的是ActivityManagerProxy对象,简称AMP.

该方法中参数有mMainThread.getApplicationThread()返回的是ApplicationThread,这是Binder的Bn端,用于system_server进程与该进程的通信。

[-> LoadedApk.java]

不妨令以BroadcastReceiver(广播接收者)为key,LoadedApk.ReceiverDispatcher(分发者)为value的ArrayMap记为 A。此处 mReceivers是一个以 Context为key,以 A为value的ArrayMap。对于ReceiverDispatcher(广播分发者),当不存在时则创建一个。

androidbroadcast?Android系统中的Broadcast和Intent有什么区别

此处mActivityThread便是前面传递过来的当前主线程的Handler.

ReceiverDispatcher(广播分发者)有一个内部类 InnerReceiver,该类继承于 IIntentReceiver.Stub。显然,这是一个Binder服务端,广播分发者通过rd.getIIntentReceiver()可获取该Binder服务端对象 InnerReceiver,用于Binder IPC通信。

[-> ActivityManagerNative.java]

这里有两个Binder服务端对象 caller和 receiver,都代表执行注册广播动作所在的进程. AMP通过Binder驱动将这些信息发送给system_server进程中的AMS对象,接下来进入AMS.registerReceiver。

[-> ActivityManagerService.java]

其中 mRegisteredReceivers记录着所有已注册的广播,以receiver IBinder为key, ReceiverList为value为HashMap。

在BroadcastQueue中有两个广播队列mParallelBroadcasts,mOrderedBroadcasts,数据类型都为ArrayList<broadcastrecord style="box-sizing: border-box;">:</broadcastrecord>

mLruProcesses数据类型为 ArrayList<ProcessRecord>,而ProcessRecord对象有一个IApplicationThread字段,根据该字段查找出满足条件的ProcessRecord对象。

该方法用于匹配发起的Intent数据是否匹配成功,匹配项共有4项action, type, data, category,任何一项匹配不成功都会失败。

broadcastQueueForIntent(Intent intent)通过判断intent.getFlags()是否包含FLAG_RECEIVER_FOREGROUND来决定是前台或后台广播,进而返回相应的广播队列mFgBroadcastQueue或者mBgBroadcastQueue。

注册广播:

另外,当注册的是Sticky广播:

广播注册完,另一个操作便是在广播发送过程.

发送广播是在Activity或Service中调用 sendBroadcast()方法,而Activity或Service都间接继承于Context抽象类,真正干活是交给ContextImpl类。

[ContextImpl.java]

[-> ActivityManagerNative.java]

[-> ActivityManagerService.java]

broadcastIntent()方法有两个布尔参数serialized和sticky来共同决定是普通广播,有序广播,还是Sticky广播,参数如下:

broadcastIntentLocked方法比较长,这里划分为8个部分来分别说明。

这个过程最重要的工作是:

BroadcastReceiver还有其他flag,位于Intent.java常量:

主要功能:

这个过主要处于系统相关的10类广播,这里不就展开讲解了.

这个过程主要是将sticky广播增加到list,并放入mStickyBroadcasts里面。

其他说明:

AMS.collectReceiverComponents:

广播队列中有一个成员变量 mParallelBroadcasts,类型为ArrayList<broadcastrecord style="box-sizing: border-box;">,记录着所有的并行广播。</broadcastrecord>

动态注册的registeredReceivers,全部合并都receivers,再统一按串行方式处理。

广播队列中有一个成员变量 mOrderedBroadcasts,类型为ArrayList<broadcastrecord style="box-sizing: border-box;">,记录着所有的有序广播。</broadcastrecord>

发送广播过程:

处理方式:

可见不管哪种广播方式,都是通过broadcastQueueForIntent()来根据intent的flag来判断前台队列或者后台队列,然后再调用对应广播队列的scheduleBroadcastsLocked方法来处理广播;

在发送广播过程中会执行 scheduleBroadcastsLocked方法来处理相关的广播

[-> BroadcastQueue.java]

在BroadcastQueue对象创建时,mHandler=new BroadcastHandler(handler.getLooper());那么此处交由mHandler的handleMessage来处理:

由此可见BroadcastHandler采用的是”ActivityManager”线程的Looper

[-> BroadcastQueue.java]

此处mService为AMS,整个流程还是比较长的,全程持有AMS锁,所以广播效率低的情况下,直接会严重影响这个手机的性能与流畅度,这里应该考虑细化同步锁的粒度。

Android系统中的Broadcast和Intent有什么区别

Android系统中的Broadcast和Intent有什么区别?

在Android系统中,Broadcast和Intent都是非常常见的概念和组件。虽然它们非常相似,但它们之间还是有很多区别的。在本文中,我们将探讨Broadcast和Intent之间的区别。

Broadcast是一个事件机制,是一种基于消息传递的系统。通过其发送者发送消息,然后所有的接收者都可以监听到这个消息并做出相应的反应。这种机制非常灵活,可以使应用程序间相互通讯,实现一些复杂的功能。

而Intent是一个携带数据(例如文本、图像、视频等)的对象。它通常用于在应用程序之间传递消息或数据,并指导Android系统执行特定的操作或启动特定的组件(如Activity、Service或BroadcastReceiver)。Intent的一大优势是它能够启动其他应用程序,以及让其他应用程序启动他们自己的Activity、Service或BroadcastReceiver。

可以将Broadcast看作是一种事件,而Intent则是一种数据传递的机制。Broadcast是一种异步的,无法保证其他应用程序的接收者会及时接收到消息。相反,Intent则是一种同步的,可以确保数据在应用程序之间的传输是完整和准确的。

除此之外,Broadcast还可分为系统Broadcast和自定义Broadcast。系统Broadcast由Android系统负责发送和接收,并且通常只能被系统应用程序进行监听和反应。而自定义Broadcast则是由开发人员自行创建和发送的,在应用程序之间广播。

总的来说,Broadcast和Intent都有着自己的功能和优点。Broadcast通常用于事件机制的通知,而Intent则可以在应用程序之间传递数据和激活组件。对于开发人员来说,理解Broadcast和Intent之间的差异,可以帮助他们更好地实现复杂的应用程序和非常规场景的操作。

Android系统广播(Broadcast)注册,发送,接收流程解析

以下广播简称Broadcast

  是Android四大组件之一,在四大组件的另外两个组件和拥有发送和接收广播的能力。Android是在进程间通信机制的基础上实现的,内部基于消息发布和订阅的事件驱动模型,广播发送者负责发送消息,广播接收者需要先订阅消息,然后才能收到消息。进程间通信与的区别在于:

  有三种类型

  存在一个注册中心,也可以说是一个调度中心,即。广播接收者将自己注册到中,并指定要接收的广播类型;广播发送者发送广播时,发送的广播首先会发送到,根据广播的类型找到对应的,找到后边将广播发送给其处理。

  这里以普通广播为例子,接收者有两种注册方式,一种是,一种是:

(广播的发送分为两种,这里针对有序的广播)中的android:priority=""和中的IntentFilter.setPriority(int)可以用来设置广播接收者的优先级,默认都是0,范围是[-1000, 1000],值越大优先级越高,优先级越高越早收到。

  在相同优先级接收同个类型广播时,的广播接收器比的广播接收者更快的接收到对应的广播,这个之后会进行分析。

  注:以下源码基于rk3399_industry Android7.1.2

  的流程可分为,和三个部分,这里依次分析下

  在Android系统的机制中,前面提到,作为一个注册和调度中心负责注册和转发。所以的注册过程就是把它注册到的过程。

  这里我们分析广播的过程,和有一个共同的父类,所以它们对应的注册过程其实是调用,接下来我们按照流程逐步分析调用流程的源码。

frameworks/base/core/java/android/content/ContextWrapper.java

  在之前的 Android应用程序启动入口ActivityThread.main流程分析分析过,在我们启动 Activity时会创建一个对象,然后通过传给我们启动的,其内部就会将该对象赋值给;的方法也是类似的赋值流程,这里放个简易的源码应该更好理解

  可以看到最后都会将生成的对象赋值给对应的

对象。接下来继续分析,即函数。

/frameworks/base/core/java/android/app/ContextImpl.java

  这里我们首先看下如何将广播接收者封装成一个接口的本地对象

/frameworks/base/core/java/android/app/LoadedApk.java

  每一个注册过广播接收者的或组件在<font color='Crimson'> LoadedApk</font>类中都有个对应的对象,该对象负责将与组件关联起来。这些对象,以关联的作为关键字保存在一个中。之后对应的又以的作为关键字保存在的成员变量对象中。最后通过对应的方法获得其接口的本地对象。之后再回到注册方法内,将对象发给进行注册。

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

  在的或注册一个时,并不是将其注册到<font color='OrangeRed'>AMS</font>中,而是将与它关联的<font color='OrangeRed'>InnerReceiver</font>对象注册到<font color='OrangeRed'>AMS</font>中,当<font color='OrangeRed'>AMS</font>接收到广播时,会根据在内部找到对应的<font color='OrangeRed'>InnerReceiver</font>对象,然后在通过这个对象将这个广播发送给对应的处理。

  注册过程这边画了一个简单的流程图:

  <font color='OrangeRed'>Broadcast</font>的发送过程可简单描述为以下几个过程:

frameworks/base/core/java/android/content/ContextWrapper.java

/frameworks/base/core/java/android/app/ContextImpl.java

/frameworks/base/core/java/android/app/ActivityManagerNative.java

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

文章分享到这里,希望我们关于androidbroadcast的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。

net use?net use命令详解是什么allowoverride 为什么当AllowOverride All时Apache出错