"
前言
userId是Android4.2之后的版本的新功能,多用户概念下的产物。用来确定当前使用设备的用户id。此功能可以在原生设置-系统-高级-多用户中查看到。如果你想验证id的变化//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MjkwOA==.html
可以通过创建新用户后切换用户。一般应用开发的情况下,我们是不会使用到这种功能的。但是在系统开发的情况下处理设置相关功能会涉及到此功能。一些framework库与settingslib库的api需要我们传入当前用户的userId。userId一共有三种获取方式,下面会一一举例
通过反射UserHandle的系统方法myUserId获得
public static int getCurrentUserId() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
try {
@SuppressLint(""DiscouragedPrivateApi"") final Method m = android.os.UserHandle.class.getDeclaredMethod(""myUserId"");
m.setAccessible(true);
final Object o = m.invoke(null);
if (o instanceof Integer) {
return (Integer) o;
}
} catch (Exception ignored) {
}
}
return -1;
}
通过反射ActivityManager的getCurrentUser方法获取
注意!getCurrentUser方法是系统级API,所以反射此方法需要系统签名
public static int getCurrentUserId2() {
try {
//代码效果参考: https://v.youku.com/v_show/id_XNjQwNjg0MjkzMg==.html@SuppressLint(""DiscouragedPrivateApi"") final Method m = android.app.ActivityManager.class.getDeclaredMethod(""getCurrentUser"");
m.setAccessible(true);
final Object o = m.invoke(null);
if (o instanceof Integer) {
return (Integer) o;
}
} catch (Exception ignored) {
}
return -1;
}
最简单的方法通过android.os.Process获取
public static int getCurrentUserId3(){
return android.os.Process.myUid()/100000;
}
这方式感觉有点莫名其妙?为什么要除以100000?其实只要阅读一下UserHandle的myUserId源码立刻能明白,下面贴出源码。 但是,个人是建议反射UserHandle获得userId,因为怕asop搞幺蛾子在后续版本上改掉数值。
源码1
源码2
End
本文来自博客园,作者:观心静 ,转载请注明原文链接:
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
"