多用戶應(yīng)用啟動過程#ActivityInfo獲取過程#ActivityInfo獲取過程

過程描述:
在桌面點(diǎn)擊一個Profile User用戶的應(yīng)用,分析系統(tǒng)是怎么知道該應(yīng)用是10用戶應(yīng)用的

10的用戶的ActivityInfo獲取過程

主要邏輯代碼為

 PMS.JAVA
 private ActivityInfo getActivityInfoInternal(ComponentName component, int flags,
            int filterCallingUid, int userId) {
        if (!sUserManager.exists(userId)) return null;
        flags = updateFlagsForComponent(flags, userId, component);

        if (!isRecentsAccessingChildProfiles(Binder.getCallingUid(), userId)) {
            mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
                    false /* requireFullPermission */, false /* checkShell */, "get activity info");
        }

        synchronized (mPackages) {
            PackageParser.Activity a = mActivities.mActivities.get(component);//獲取Activity信息

            if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getActivityInfo " + component + ": " + a);
            //驗證commpont,flag跟獲取的PackageUserState是否匹配
            if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
                PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
                if (ps == null) return null;
                if (filterAppAccessLPr(ps, filterCallingUid, component, TYPE_ACTIVITY, userId)) {
                    return null;
                }
                //實例化得到此次啟動的ActivityInfo信息
                return PackageParser.generateActivityInfo(
                        a, flags, ps.readUserState(userId), userId);
            }
            if (mResolveComponentName.equals(component)) {
                return PackageParser.generateActivityInfo(
                        mResolveActivity, flags, new PackageUserState(), userId);
            }
        }
        return null;
    }
  1. 傳遞的主要參數(shù)為component,flags,userid

  2. 根據(jù)component信息,在系統(tǒng)中所有的Activity信息中查詢對應(yīng)的Activity信息,Activity信息每個Activity只有一份,不管有多少個用戶

  3. 根據(jù)pkg信息,在系統(tǒng)中所有的package信息中查詢該應(yīng)用對應(yīng)的包名的PackageSetting信息,然后根據(jù)用戶id 10查詢該用戶用戶的PackageUserState,PackageUserState是在用戶創(chuàng)建的時候創(chuàng)建的


    PackageUserState
  4. 然后驗證獲取的PackageUserState是否跟要查詢的{component,flag}相匹配

  5. 如果相匹配,則根據(jù)上述獲取的Activity信息,PackageUserState,flags和userid,去實例化ActiivtyInfo,得到對應(yīng)userId的ActivityInfo信息
    PackageParser.java

    public static final ActivityInfo generateActivityInfo(Activity a, int flags,
            PackageUserState state, int userId) {
        if (a == null) return null;
        if (!checkUseInstalledOrHidden(flags, state, a.owner.applicationInfo)) {
            return null;
        }
        if (!copyNeeded(flags, a.owner, state, a.metaData, userId)) {
            updateApplicationInfo(a.info.applicationInfo, flags, state);
            return a.info;
        }
        // Make shallow copies so we can store the metadata safely
        ActivityInfo ai = new ActivityInfo(a.info);
        ai.metaData = a.metaData;
        ai.applicationInfo = generateApplicationInfo(a.owner, flags, state, userId);//根據(jù)傳遞的參數(shù)和用戶10,創(chuàng)建ApplicationInfo
        return ai;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。