【源码剖析2】framework 源码 4——UserController之多用户的切换流程(上)

本文深入剖析Android系统中切换用户的过程,主要涉及UserController的switchUser方法。详细解读了从发起切换到实际切换的准备工作,包括判断切换条件、显示切换提示和调用startUserInForeground方法。在不同提示情况下,切换流程略有差异,但最终都会执行startUserInForeground以启动目标用户。
摘要由CSDN通过智能技术生成

上文提到创建用户之后,需要通过切换用户来抵达用户。细心的朋友会发现标题从UserManagerService变成了UserController。这是因为切换的代码主要在UserController实现,有意思的是,切换的入口也不是在UserManager而是在ActivityManagerService。

ActivityManager.getService().switchUser(userId);

而进入ActivityManagerService里面查看switchUser代码,会发现他实际调用的是UserContoller的代码,而实际上整个切换流程的核心流程就是在UserContoller里面。

  public boolean switchUser(final int targetUserId) {

        return mUserController.switchUser(targetUserId);

    }

 

    简介一下切换的大致流程。

1:发起切换流程,确定满足切换要求

2:弹出正在切换的提示框并冻屏

3:启动目标用户的最佳应用(如同每次开机都要启动主用户的最佳应用)且发起锁屏

4:解除冻屏,并通告其他模块,用户已切换

 

也就是说作为框架,主要做了启动应用和发起锁屏两件事儿,其他的是通过观察者模式通知各个模块来完成。

 

本章主要讲解,从发起用户切换到真正用户切换的准备工作。

  

 

下面进行源码详解,首先是切换源码,其做了3件事情,通过UserId获取UserInfo,判断是否满足切换条件,开始切换:

boolean switchUser(final int targetUserId) {

        enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, targetUserId);

//通过TargetUserId获取targetUserInfo

        int currentUserId = getCurrentUserId();

        UserInfo targetUserInfo = getUserInfo(targetUserId);

//以下是几种不切换的常见

        //不可切换场景1:切换的目标用户就是当前用户

        if (targetUserId ==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值