导读:本文说明系统发送广播的部分流程,如何利用Intent查找到对应接收器。我们依然只关注接收器的排序问题

 

这篇文章主要是针对我前两篇文章

android安全问题(四) 抢先开机启动 - 结果篇

android安全问题(五) 抢先拦截短信 - 结果篇

现在给出第二步分的分析

 

 

下面就来看看发送广播的流程

Context中的sendBroadCast函数的实现是在ContextImpl中,和发送广播相关的有如下六个函数

void android.app.ContextImpl.sendBroadcast(Intent intent)

void android.app.ContextImpl.sendBroadcast(Intent intent, String receiverPermission)

void android.app.ContextImpl.sendOrderedBroadcast(Intent intent, String receiverPermission)

void android.app.ContextImpl.sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

void android.app.ContextImpl.sendStickyBroadcast(Intent intent)

void android.app.ContextImpl.sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)

 

可以分为3组:1普通广播;2Ordered广播;3Sticky广播

不论哪种,最后都会由ActivityManagerService处理

Java代码 android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程 _广播 android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程 _广播_02
  1. private final int broadcastIntentLocked(ProcessRecord callerApp,
  2. String callerPackage, Intent intent, String resolvedType,
  3. IIntentReceiver resultTo, int resultCode, String resultData,
  4. Bundle map, String requiredPermission,
  5. boolean ordered, boolean sticky, int callingPid, int callingUid)

以第一种情况为例,流程图大概是这个样子的
android安全问题(七) 抢先接收广播 - 内因篇之广播发送流程 _android_04

 

ordered和sticky用来区分上面3组广播