4.6.2 UserManager介绍
UserManager是Android 4.0新增的一个功能,其作用是管理手机上的不同用户。这一点和PC上的Windows系统比较相似,例如,在Windows上安装程序时,都会提示是安装给本人使用还是安装给系统所有用户使用。非常遗憾的是,在目前的Android版本中,该功能尚未完全实现,在SDK中也没有相关说明。不过从现有代码中,也能发现一些蛛丝马迹。
提示 小米手机的访客模式和UserManager比较相似。
1.UserManager构造函数分析
在PKMS中,创建UserManager调用的代码如下:
//mUserAppDataDir指向/data/app目录。该目录中包含的是非系统APK文件
mUserManager=new UserManager(mInstaller, mUserAppDataDir);
[—>UserManager.java:UserManager]
public UserManager(Installer installer, File baseUserPath){
this(Environment.getDataDirectory(),baseUserPath);
mInstaller=installer;
}
UserManager(File dataDir, File baseUserPath){
//mUsersDir指向/data/system/users目录
mUsersDir=new File(dataDir, USER_INFO_DIR);
mUsersDir.mkdirs();//创建该目录
mBaseUserPath=baseUserPath;
FileUtils.setPermissions(mUsersDir.toString(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG
|FileUtils.S_IROTH|FileUtils.S_IXOTH,
-1,-1);
//mUserListFile指向/data/system/user/userlist.xml
mUserListFile=new File(mUsersDir, USER_LIST_FILENAME);
readUserList();//解析userlist.xml文件
}
此处不深入分析readUserList代码了,只介绍其内部工作流程。
userlist. xml保存每个用户的ID。
readUserList到/data/system/users目录下解析id.xml,将最终得到的信息保存在UserInfo对象中。
原来用户信息由UserInfo表达,下面是UserInfo的定义。
[—>UserInfo.java]
public class UserInfo implements Parcelable{
//主用户,全系统只能有一个这样的用户
public static final int FLAG_PRIMARY=0x00000001;
//管理员,可以创建、删除其他用户信息
public static final int FLAG_ADMIN=0x00000002;
//访客用户
public static final int FLAG_GUEST=0x00000004;
public int id;//ID
public String name;//用户名
public int flags;//属性标志
……//其他函数
}
UserInfo信息比较简单,笔者觉得UserManager的功能暂时还不能满足企业用户的需求。感兴趣的读者不妨关注Android未来版本在此方面的变化。
2.installPackageForAllUsers分析
PKMS在扫描非系统APK的时候,每扫描完一个APK都会调用installPackage-ForAllUsers,调用代码如下:
mUserManager.installPackageForAllUsers(pkgName, pkg.applicationInfo.uid);
[—>UserManager.java:installPackageForAllUsers]
public void installPackageForAllUsers(String packageName, int uid){
for(int userId:mUserIds){
if(userId==0)
continue;
//向installd发送命令,其中getUid将userId和uid组合为一个整型值
//installd将在/data对应的user/目录下创建相应的package子目录
mInstaller.createUserData(packageName, PackageManager.getUid(userId, uid),
userId);
}
}