提问人:Ovidiu Latcu 提问时间:11/14/2012 最后编辑:Luca KiebelOvidiu Latcu 更新时间:9/25/2023 访问量:363835
Android UserManager.isUserAGoat() 的正确用例?
Proper use cases for Android UserManager.isUserAGoat()?
问:
我正在查看 Android 4.2 中引入的新 API。
在查看UserManager
类时,我遇到了以下方法:
public boolean isUserAGoat()
用于确定进行此调用的用户是否受到传送的影响。
返回进行此调用的用户是否为山羊。
应该如何以及何时使用?
答:
Android R 更新:
在 Android R 中,此方法始终返回 false。谷歌表示,这样做是为了“保护山羊的隐私”:
/**
* Used to determine whether the user making this call is subject to
* teleportations.
*
* <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
* now automatically identify goats using advanced goat recognition technology.</p>
*
* <p>As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
* {@code false} in order to protect goat privacy.</p>
*
* @return Returns whether the user making this call is a goat.
*/
public boolean isUserAGoat() {
if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
return false;
}
return mContext.getPackageManager()
.isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
上一个答案:
从源头看,返回的方法在 API 21 中更改之前一直使用。false
/**
* Used to determine whether the user making this call is subject to
* teleportations.
* @return whether the user making this call is a goat
*/
public boolean isUserAGoat() {
return false;
}
看起来该方法对我们作为开发人员没有真正的用处。之前有人说过,这可能是一个复活节彩蛋。
在 API 21 中,实现了已更改,以检查包中是否安装了应用com.coffeestainstudios.goatsimulator
/**
* Used to determine whether the user making this call is subject to
* teleportations.
*
* <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
* now automatically identify goats using advanced goat recognition technology.</p>
*
* @return Returns true if the user making this call is a goat.
*/
public boolean isUserAGoat() {
return mContext.getPackageManager()
.isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
评论
false
这似乎是谷歌的一个内部笑话。它也出现在 Google Chrome 任务管理器中。它没有任何目的,除了一些工程师觉得它很有趣。如果你愿意的话,这本身就是一个目的。
- 在 Chrome 中,使用 + 打开任务管理器。ShiftEsc
- 右键单击以添加列。
Goats Teleported
- 奇迹。
甚至还有一个巨大的 Chromium 错误报告,关于太多的传送山羊。
以下 Chromium 源代码片段是从 HN 注释中窃取的。
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
评论
我不知道这是否是“官方”用例,但以下内容会在 Java 中产生警告(如果与语句混合,可能会进一步产生编译错误,导致代码无法访问):return
while (1 == 2) { // Note that "if" is treated differently
System.out.println("Unreachable code");
}
但是,这是合法的:
while (isUserAGoat()) {
System.out.println("Unreachable but determined at runtime, not at compile time");
}
因此,我经常发现自己编写了一个愚蠢的实用程序方法,以最快的方式模拟代码块,然后在完成调试时找到对它的所有调用,因此,如果实现没有更改,则可以将其用于此目的。
JLS 指出不会触发“无法访问的代码”,因为这会破坏对调试标志的支持,即基本上是这个用例 (h/t @auselen)。(例如)。if (false)
static final boolean DEBUG = false;
我替换了 ,产生了一个更晦涩的用例。我相信你可以用这种行为绊倒你的IDE,比如Eclipse,但这个编辑是4年后的未来,我没有Eclipse环境可以玩。while
if
评论
else
isUserAGoat()
每个版本的 Android 中都有一个有趣的命名方法/常量/whaty。
我见过的唯一实际用途是在 Last Call for Google I/O Contest 中,他们询问特定版本是什么,看看参赛者是否阅读了每个版本的 API 差异报告。比赛也有编程问题,但一般来说,一些琐事可以先自动评分,以便将提交的数量减少到更容易检查的合理数量。
评论
谷歌非常喜欢山羊和山羊的复活节彩蛋。甚至之前有关于它的 Stack Overflow 帖子。
正如在之前的帖子中提到的,它也存在于 Chrome 任务管理器中(它于 2009 年首次出现在野外):
<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
Goats Teleported
</message>
然后在 2010 年初的 Windows、Linux 和 Mac 版本的 Chrome 中)。“山羊传送”的数量实际上是随机的:
int TaskManagerModel::GetGoatsTeleported(int index) const {
int seed = goat_salt_ * (index + 1);
return (seed >> 16) & 255;
}
谷歌对山羊的其他引用包括:
据我所知,山羊和谷歌最早的相关性属于原始的“与山羊一起割草”博客文章。
我们可以有把握地假设它只是一个复活节彩蛋,除了返回之外,没有现实世界的用途。false
评论
有一个类似的调用 ,如果正在使用 MonkeyRunner 工具,则返回 true。SDK 的解释和这个一样好奇。isUserAMonkey()
public static boolean isUserAMonkey(){}
如果用户界面当前被猴子弄乱,则返回。
true
这是来源。
我希望这是在预期一个名为山羊的东西的新 SDK 工具时添加的,并且实际上将用于测试该工具的存在。
另请参阅类似的问题,ActivityManager 中的奇怪函数:isUserAMonkey。这是什么意思,它的用途是什么?
评论
ActivityManager
monkey
作为对@djechlin答案的补充(顺便说一句,这是个好答案!),当您想要在某些特定迭代或特定递归调用中停止时,此函数调用还可以用作虚拟代码,以在 IDE 中保存断点,例如:
isUserAGoat()
可以用来代替虚拟变量声明,该声明将在 IDE 中显示为警告,并且在 Eclipse 特定情况下,会阻塞断点标记,使其难以启用/禁用。如果将该方法用作约定,则以后可以由某些脚本过滤所有调用(也许在提交阶段?
Google 的家伙是 Eclipse 的重度用户(他们提供了几个项目作为 Eclipse 插件:Android SDK、GAE 等),所以@djechlin答案和这个补充答案很有意义(至少对我来说是这样)。
评论
在语音识别学科中,用户分为山羊和绵羊。
例如,在第 89 页:
绵羊是语音识别效果特别好的人,而山羊是语音识别效果特别差的人。只有语音识别器知道是什么将它们分开。人们无法预测谁的声音会很容易被识别,谁的声音不会。最好的策略是设计界面,使其能够处理各种环境中的各种声音
也许,计划在未来将 Android 用户标记为山羊,以便能够根据山羊的需求配置语音识别引擎。;-)
有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务管理器(+)中,通过右键单击,您可以添加一个科幻列,在意大利语版本中是“Capre Teletrasportate”(传送山羊)。shiftesc
关于它的一个有趣的理论在这里。
从 API 21(第一个 Android 5.0/Lollipop SDK)开始,这会检测是否安装了 Goat Simulator 应用:
/**
* Used to determine whether the user making this call is subject to
* teleportations.
*
* <p>As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
* now automatically identify goats using advanced goat recognition technology.</p>
*
* @return Returns true if the user making this call is a goat.
*/
public boolean isUserAGoat() {
return mContext.getPackageManager()
.isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
这应该清楚地表明,djechlin建议将其用作无警告的建议是一种潜在的灾难性策略。以前为每个设备返回的内容现在返回一个看似随机的值:如果它被埋藏在代码中足够深,则可能需要很长时间才能弄清楚新错误的来源。if (false)
false
底线:如果你不控制方法的实现,并决定将其用于 API 文档中未说明的目的,你就会遇到麻烦。
评论
if(false)
这不是内部笑话
显然,它只是 Goat Simulator - by Coffee Stain Studios 的应用程序检查器
如果你安装了山羊模拟器,你就是一只山羊。 如果你没有安装它,你就不是山羊。
我想这更像是其中一位开发人员的个人实验,最有可能找到有共同兴趣的人。
评论
isUserAGoat
从可用性和可访问性的角度来看,了解您的用户是否是山羊非常重要。
如果山羊要真正从时代提供的所有信息中受益,他们实际上对他们的软件有非常不同的需求。
我认为一些善良的开发人员关心我们所有人的用户,而不仅仅是那些时尚的用户,这真是太好了。
评论