【源码剖析2】framework 源码 3——UserManagerService之多用户的创建代码详解

上文提到创建用户的方法:

核心代码是 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值