過程描述:
在桌面點(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;
}
傳遞的主要參數(shù)為component,flags,userid
根據(jù)component信息,在系統(tǒng)中所有的Activity信息中查詢對應(yīng)的Activity信息,Activity信息每個Activity只有一份,不管有多少個用戶
-
根據(jù)pkg信息,在系統(tǒng)中所有的package信息中查詢該應(yīng)用對應(yīng)的包名的PackageSetting信息,然后根據(jù)用戶id 10查詢該用戶用戶的PackageUserState,PackageUserState是在用戶創(chuàng)建的時候創(chuàng)建的
PackageUserState 然后驗證獲取的PackageUserState是否跟要查詢的{component,flag}相匹配
如果相匹配,則根據(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;
}