为什么我们在许多API声明中需要UserHandle

时间:2014-12-12 00:25:19

标签: android android-source

在Android开源项目中,很多核心API声明最后都有一个整数参数userId。我追溯到并发现整数来自一个名为“UserHandle.java”的类。有一个简单的评论说这个类代表设备上的用户。它仍然让我困惑。为什么我们需要这样的课程?类的不同值之间有什么区别,例如“USER_OWNER”,“USER_CURRENT”,“USER_CURRENT_OR_SELF”? 在此先感谢!!!

1 个答案:

答案 0 :(得分:2)

自从Jelly Bean以来,Android平台已经支持多个用户。这意味着多个用户可能能够使用一个设备,但无法访问其他用户的文件或与另一个用户的应用程序通信。 设备上的第一个用户是用户0.其余用户从10,11开始编号,...(在JB编号为1,2 ......)。 USER_OWNER是用户0。 他对其他用户拥有一些额外的权限(大多数访问其他人可以为所有用户卸载应用程序的某些设置)。 一台设备上的多个用户要求在特定时间点只有一个用户可以处于活动状态,此用户称为USER_CURRENT(自Kitkat()以来)。 通常,一个用户的应用程序不能向其他用户的应用程序发送广播消息或Intent。 只有具有系统权限的应用才能这样做(例如,当电池电量不足时,会向所有人发送意图)。 每当您从应用程序发送Intent时,系统服务都会验证这是否是有效的Intent,即如果它应该覆盖所有用户,那么它就不会。

这意味着即使您使用错误的userId使用某个api(例如,即使这是用户10,也强制userId = 0),那么您的呼叫将收到SecurityException

为避免此类例外情况,您还可以选择Intent USER_CURRENT_OR_SELF。 这意味着您正在尝试发送给当前用户,但如果他不被允许接收Intent,请让发送Intent的同一用户收到它。