
本文共 9959 字,大约阅读时间需要 33 分钟。
Android BroadcastReceiver������������
1. ������������
BroadcastReceiver ���Android���������������������������������������������������������������������������������������������������������������������������������sticky���������������������������������������������������������������������������
���������������������BroadcastReceiver������������������������������������������������������������������������������������������������������������
2. ���������������������
2.1 BroadcastingReceiver���������������
���Android���������������������������������������������������������������������������Context���registerReceiver������������������������������
@Overridepublic Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { return registerReceiver(receiver, filter, null, null);}@Overridepublic 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��������������������������������������������������� ��������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������
������������������������������������������������������������������������������ ����
发表评论
最新留言
关于作者
