BroadcastReceiver源码分析
发布日期:2021-05-14 19:19:46 浏览次数:17 分类:精选文章

本文共 9959 字,大约阅读时间需要 33 分钟。

Android BroadcastReceiver������������

1. ������������

BroadcastReceiver ���Android���������������������������������������������������������������������������������������������������������������������������������sticky���������������������������������������������������������������������������

���������������������BroadcastReceiver������������������������������������������������������������������������������������������������������������


2. ���������������������

2.1 BroadcastingReceiver���������������

���Android���������������������������������������������������������������������������Context���registerReceiver������������������������������

@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return registerReceiver(receiver, filter, null, null);
}
@Override
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
String broadcastPermission, Handler scheduler) {
return registerReceiverInternal(receiver, getUserId(),
filter, broadcastPermission, scheduler, getOuterContext(), 0);
}

������������������registerReceiverInternal���������

private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,
IntentFilter filter, String broadcastPermission, Handler scheduler,
Context context, int flags) {
IIntentReceiver rd = null;
if (receiver != null) {
if (mPackageInfo != null && context != null) {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
rd = mPackageInfo.getReceiverDispatcher(receiver, context, scheduler,
mMainThread.getInstrumentation(), true);
} else {
if (scheduler == null) {
scheduler = mMainThread.getHandler();
}
rd = new LoadedApk.ReceiverDispatcher(receiver, context, scheduler, null, true)
.getIIntentReceiver();
}
}
try {
final Intent intent = ActivityManager.getService().registerReceiver(
mMainThread.getApplicationThread(), mBasePackageName, rd, filter,
broadcastPermission, userId, flags);
if (intent != null) {
intent.setExtrasClassLoader(getClassLoader());
intent.prepareToEnterProcess();
}
return intent;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}

������������������������IIntentReceiver������������������mRegisteredReceivers���������������������������������


2.2 AMS���������������

���ActivityManagerService���AMS������������������������������������������������mRegisteredReceivers���������������������������������

public int registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter, String permission, int userId,
int flags) {
// ���������������
ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder());
if (rl == null) {
rl = new ReceiverList(this, callerApp, callingPid, callingUid, userId, receiver);
if (rl.app != null) {
rl.app.receivers.add(rl);
}
mRegisteredReceivers.put(receiver.asBinder(), rl);
}
// ���������������������
BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, permission, callingUid, userId, instantApp, visibleToInstantApps);
rl.add(bf);
mReceiverResolver.addFilter(bf);
return ActivityManager.BROADCAST_SUCCESS;
}

���������������������������������Binder���������mRegisteredReceivers���������������������


3. ������������������

3.1 ���������������������

������������������������Context.sendBroadcast(Intent)������������������������������������

public void sendBroadcast(Intent intent) {
warnIfCallingFromSystemProcess();
String resolvedType = intent.resolveTypeIfNeeded(getContentResolver());
intent.prepareToLeaveProcess(this);
ActivityManager.getService().broadcastIntent(
mMainThread.getApplicationThread(), intent, resolvedType, null,
Activity.RESULT_OK, null, null, null, AppOpsManager.OP_NONE, null, false, false, getUserId());
}

������������ActivityManager.getService().broadcastIntent���


3.2 AMS������broadcastIntent

���ActivityManagerService������broadcastIntent���������������������������������

public final int broadcastIntent(IApplicationThread caller, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData, Bundle resultExtras,
String[] requiredPermissions, int appOp, Bundle bOptions, boolean serialized,
boolean sticky, int userId) {
int res = broadcastIntentLocked(callerApp, intent, resolvedType, resultTo, resultCode,
resultData, resultExtras, requiredPermissions, appOp, bOptions, serialized, sticky, callingPid, callingUid, userId);
return res;
}

������������broadcastIntentLocked���

final int broadcastIntentLocked(ProcessRecord callerApp, String callerPackage, Intent intent,
String resolvedType, IIntentReceiver resultTo, int resultCode, String resultData,
Bundle resultExtras, String[] requiredPermissions, int appOp, Bundle bOptions,
boolean ordered, boolean sticky, int callingPid, int callingUid, int userId) {
// ������������������������������
registeredReceivers = mReceiverResolver.queryIntent(intent, resolvedType, false,
userId);
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR > 0) {
// ������������������
final BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp, callerPackage, callingPid, callingUid, callerInstantApp, resolvedType, requiredPermissions, appOp, brOptions, registeredReceivers, resultTo, resultCode, resultData, resultExtras, ordered, sticky, false, userId);
queue.enqueueParallelBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
registeredReceivers = null;
NR = 0;
}
return ActivityManager.BROADCAST_SUCCESS;
}

������������������ordered���������������������������������������������


3.3 ������������������

BroadcastQueue���������������������������������������������

final void processNextBroadcast(boolean fromMsg) {
synchronized (mService) {
processNextBroadcastLocked(fromMsg, false);
}
}

������������processNextBroadcastLocked���

final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {
while (mParallelBroadcasts.size() > 0) {
r = mParallelBroadcasts.remove(0);
final int N = r.receivers.size();
// iteratively deliver broadcasts
for (int i = 0; i < N; i++) {
final BroadcastReceiver receiver = r.receivers.get(i);
final BroadcastRecord record = r.sendOrderedOrDefault();
if (record != null) {
record.receiver.onReceive(record.intent, record.resultCode, record.resultData,
record.resultExtras, record.resultAbort);
}
// ������������������
if (!record.resultAbort && record.sticky) {
nextReceiver = r.receivers.get(i + 1);
if (nextReceiver != null) {
nextReceiver.pendingResult = record;
} else if (i + 1 < N) {
throw new IndexOutOfBoundsException();
} else {
record.sender.finished();
}
}
}
}
}

������������������������������������Broadcaster���


3.4 ���������������receiver

���������������������performReceive������������������������������������

public void performReceive(Intent intent, int resultCode, String data, Bundle extras,
boolean ordered, boolean sticky, int sendingUser) {
// ���������������������
if (.receiverDesc) {
receiver.onReceive(...);
// ������������������
}
}

4. ���������������������

4.1 ���������������������������������

���������������������������������<receiver>������������������������������������������PackageParser���������������������������

private boolean parseBaseApplication(Package owner, Resources res, XmlResourceParser parser, int flags, String[] outError) {
else if (tagName.equals("receiver")) {
Activity a = parseActivity(owner, res, parser, flags, outError, cachedArgs,
true, false);
owner.receivers.add(a);
}
}

���receiver���������Activity���������������������owner.receivers������������


4.2 ���������������������������������

���������������������������������������������������������������������������������������������������������������������������������


5. ������������������������

���������������������������������������������������������������������������������������

5.1 ������������������

������������������������������������������������������������������

public void performReceive(Intent intent, int resultCode, String data, Bundle extras,
boolean ordered, boolean sticky, int sendingUser) {
// ������������������
BroadcastReceiver lastReceiver = mPendingReceiver;
mPendingReceiver = null;
// ������������
receiver.onReceive(...);
// ������������
data.setResult((resultCode, dataStr, extras, resultData, abort),
receiver.receiveResult...);
}

������������BroadcastReceiver SendResult���������


6. ������������������������������

  • ���������������

    • ������registerReceiver��������� AMS���������������������������
    • ���������������������mRegisteredReceivers���������������������������������
  • ���������������

    • ������������������������������������������������
    • ������������������������������

  • ������

    BroadcastReceiver ���Android��������������������������������������������������� ��������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������

    ������������������������������������������������������������������������������ ����

    上一篇:Android音视频开发:踩一踩“门槛”
    下一篇:App启动优化-基于有向无环图的sdk初始化方案

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年04月26日 18时32分18秒