观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  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

posted on 2023-05-08 11:12  观心静  阅读(1700)  评论(0编辑  收藏  举报