前言
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