上文提到创建用户的方法:
核心代码是 createUserInternalUnchecked
在此方法中要完成一个用户的创建。首先是通过flag区分需要创建用户的类型,然后不同类型在信息的使用上会有不同差别。 总的来说,创建时兼顾了各种类型的user,并且给新用户提供userId和UserInfo两个重要参数。
需要注意的是,创建用户并不会使用户显示出来。要显示用户是通过多用户切换功能完成。
我们平常一创建多用户就跳转到新用户的界面,那是由创建用户和切换用户共同完成。
下面是createUserInternalUnchecked 完整源码和讲解。
代码地址:http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java#2600
private UserInfo createUserInternalUnchecked(String name, int flags, int parentId,String[] disallowedPackages) {
//首先如同上一章所讲,传入参数为 用户的名字name , 用户的类型/特性 flags , 主用户的识别码 parentId, 和新创建用户时的禁用应用表。 如果单纯创建一个新用户, 那么这4个参数,分别是: createUserInternalUnchecked(“自定义的名称”, 0, USER.NULL , null)
//接着进行第一个判断,手机是否有足够空间支持新用户的创建,如果没有足够空间,则终止创建,return null
DeviceStorageMonitorInternal dsm = LocalServices.getService(DeviceStorageMonitorInternal.class);
if (dsm.isMemoryLow()) {
Log.w(LOG_TAG, "Cannot add user. Not enough space on disk.");
return null;
}
//随后对用户的特性进行一下统计,方面后续涉及到的部分进行快速判断。这里没有统计所有特性,且特性可以自己在UserInfo类里面,自己手动添加一些。
//特性1:访客用户
final boolean isGuest = (flags & UserInfo.FLAG_GUEST) != 0;
//特性2:工作用户(工作用户一定是子用户)
final boolean isManagedProfile = (flags & UserInfo.FLAG_MANAGED_PROFILE) != 0;
//特性3:受限制
final boolean isRestricted = (flags & UserInfo.FLAG_RESTRICTED) != 0;
//特性4:演示用户
final boolean isDemo = (flags & UserInfo.FLAG_DEMO) != 0;
//接来下是最关注的几个对象,其中userInfo和userId是在多用户过程中,非常频繁使用的。
final long ident = Binder.clearCallingIdentity();
UserInfo userInfo;
UserData userData;
final int userId;
try {
synchronized (mPackagesLock) {
UserData parent = null;
//确认传入的主用户参数是否存在,当主用户存在,则获取parent。后面创建子用户过程中,部分信息会依赖于parent