前言
userId是Android4.2之后的版本的新功能,多用户概念下的产物。用来确定当前使用设备的用户id。此功能可以在原生设置-系统-高级-多用户中查看到。如果你想验证id的变化可以通过创建新用户后切换用户。
一般应用开发的情况下,我们是不会使用到这种功能的。但是在系统开发的情况下处理设置相关功能会涉及到此功能。一些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 {
@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
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17381176.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2021-05-08 Android开发 GridLayout网格布局
2020-05-08 Android开发 BottomSheetDialogFragment底部弹出的对话框