源码路径:/frameworks/base/core/java/android/app/ContextImpl.java

  @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());    }    @Override    public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,            IntentFilter filter, String broadcastPermission, Handler scheduler) {        return registerReceiverInternal(receiver, user.getIdentifier(),                filter, broadcastPermission, scheduler, getOuterContext());    }    private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId,            IntentFilter filter, String broadcastPermission,            Handler scheduler, Context context) {        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 {            return ActivityManagerNative.getDefault().registerReceiver(                    mMainThread.getApplicationThread(), mBasePackageName,                    rd, filter, broadcastPermission, userId);        } catch (RemoteException e) {            return null;        }    }

最后会进入到ActivityManagerService,就是说一个应用的广播要注册到AMS中去管理
源码路径:xref: /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

 public Intent registerReceiver(IApplicationThread caller, String callerPackage,            IIntentReceiver receiver, IntentFilter filter, String permission, int userId) {        enforceNotIsolatedCaller("registerReceiver");        ArrayList stickyIntents = null;  //粘性广播        ProcessRecord callerApp = null;        int callingUid;        int callingPid;        synchronized(this) {            if (caller != null) { //正常caller不为null,是一个应用                callerApp = getRecordForAppLocked(caller);   //获取注册广播的应用                if (callerApp == null) {     //应用不存在                    throw new SecurityException(                            "Unable to find app for caller " + caller                            + " (pid=" + Binder.getCallingPid()                            + ") when registering receiver " + receiver);                }                if (callerApp.info.uid != Process.SYSTEM_UID &&                        !callerApp.pkgList.containsKey(callerPackage) &&                        !"android".equals(callerPackage)) {    //应用不包含这个包名                    throw new SecurityException("Given caller package " + callerPackage                            + " is not running in process " + callerApp);                }                callingUid = callerApp.info.uid; //应用uid                callingPid = callerApp.pid;  //应用pid            } else {                callerPackage = null;                callingUid = Binder.getCallingUid();                callingPid = Binder.getCallingPid();            }            userId = handleIncomingUser(callingPid, callingUid, userId,                    true, ALLOW_FULL_ONLY, "registerReceiver", callerPackage);    //用户id            Iterator actions = filter.actionsIterator();            if (actions == null) {                ArrayList noAction = new ArrayList(1);                noAction.add(null);                actions = noAction.iterator();            }            // Collect stickies of users            int[] userIds = { UserHandle.USER_ALL, UserHandle.getUserId(callingUid) };            while (actions.hasNext()) {                String action = actions.next();                for (int id : userIds) {                    ArrayMap> stickies = mStickyBroadcasts.get(id);                    if (stickies != null) {                        ArrayList intents = stickies.get(action);  //获取是否有这个action的intent                        if (intents != null) {                            if (stickyIntents == null) {                                stickyIntents = new ArrayList();     //增加stickyIntents                            }                            stickyIntents.addAll(intents);                        }                    }                }            }        }        ArrayList allSticky = null;        if (stickyIntents != null) {            final ContentResolver resolver = mContext.getContentResolver();            // Look for any matching sticky broadcasts...            for (int i = 0, N = stickyIntents.size(); i < N; i++) {                Intent intent = stickyIntents.get(i);                // If intent has scheme "content", it will need to acccess                // provider that needs to lock mProviderMap in ActivityThread                // and also it may need to wait application response, so we                // cannot lock ActivityManagerService here.                if (filter.match(resolver, intent, true, TAG) >= 0) {                    if (allSticky == null) {                        allSticky = new ArrayList();                    }                    allSticky.add(intent); //所有粘性广播生成                }            }        }        // The first sticky in the list is returned directly back to the client.        Intent sticky = allSticky != null ? allSticky.get(0) : null;    //第一个粘性广播马上返回给客户端        if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Register receiver " + filter + ": " + sticky);        if (receiver == null) {            return sticky;        }        synchronized (this) {            if (callerApp != null && (callerApp.thread == null                    || callerApp.thread.asBinder() != caller.asBinder())) {                // Original caller already died    //应用死掉了                return null;            }            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);                } else {                    try {                        receiver.asBinder().linkToDeath(rl, 0);                    } catch (RemoteException e) {                        return sticky;                    }                    rl.linkedToDeath = true;                }                mRegisteredReceivers.put(receiver.asBinder(), rl);   //生成mRegisteredReceivers            } else if (rl.uid != callingUid) {                throw new IllegalArgumentException(                        "Receiver requested to register for uid " + callingUid                        + " was previously registered for uid " + rl.uid);            } else if (rl.pid != callingPid) {                throw new IllegalArgumentException(                        "Receiver requested to register for pid " + callingPid                        + " was previously registered for pid " + rl.pid);            } else if (rl.userId != userId) {                throw new IllegalArgumentException(                        "Receiver requested to register for user " + userId                        + " was previously registered for user " + rl.userId);            }            BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage,                    permission, callingUid, userId);            rl.add(bf);            //ReceiverList rl保存的是intent的数组,例如一个广播接收器可以注册两个intent 过滤条件            if (!bf.debugCheck()) {                Slog.w(TAG, "==> For Dynamic broadcast");            }            mReceiverResolver.addFilter(bf);       //生成mReceiverResolver            // Enqueue broadcasts for all existing stickies that match            // this filter.            if (allSticky != null) {                ArrayList receivers = new ArrayList();                receivers.add(bf);                final int stickyCount = allSticky.size();                for (int i = 0; i < stickyCount; i++) {                    Intent intent = allSticky.get(i);   //处理粘性广播                    BroadcastQueue queue = broadcastQueueForIntent(intent);                    BroadcastRecord r = new BroadcastRecord(queue, intent, null,                            null, -1, -1, null, null, AppOpsManager.OP_NONE, null, receivers,                            null, 0, null, null, false, true, true, -1);                    queue.enqueueParallelBroadcastLocked(r);                    queue.scheduleBroadcastsLocked();                }            }            return sticky;        }    }

所以注册广播,最后生成了什么东西了?
1.粘性广播处理
2.生成变量mRegisteredReceivers,里面保存了所有广播,mRegisteredReceivers已应用token为key值,intent数组为值

class ReceiverList extends ArrayList

3.生成mReceiverResolver,里面保存着intent

public abstract class IntentResolver 

更多相关文章

  1. Android中的线程模型
  2. Android介绍
  3. Android(安卓)6.0 7.0 8.0特性变更
  4. Python+appium 实现 Android(安卓)自动化
  5. Android之应用首次使用的欢迎界面实例
  6. C#/mono开发Android应用程序入门(二)-第一个应用程序(Hello World)
  7. Android(安卓)7 新特性浅析
  8. Android(安卓)Activity(一)启动流程
  9. 为什么要在 Windows 10 系统上运行 Android(安卓)应用程序?

随机推荐

  1. Android Sudio 如何获取SHA1(开发版和发
  2. Android中的线程与线程池
  3. Android怎样播放多张图片形成一个动画
  4. 读取 android 设备的电池信息
  5. Android 中解析JSON形式的数据
  6. 史上最全谷歌Android开发工具Android Stu
  7. Android中级联列表ExpandableListView使
  8. 【Android-View】基于原生View的简单功能
  9. Android:制作Update.zip升级包
  10. [Android]后台Service 弹出自定义dialog