上文提到创建用户之后,需要通过切换用户来抵达用户。细心的朋友会发现标题从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 ==