适用于Android UserManager.isUserAGoat()的正确用例?

我正在研究Android 4.2中引入的新API 。在查看UserManager课程时,我遇到了以下方法:

 public boolean isUserAGoat()

用于确定发起此呼叫的用户是否需要远程传送。

返回进行此调用的用户是否是山羊。

如何和何时应该使用?

答案


从它们的来源来看,该方法用于返回,false直到它在API 21中被更改。

/**
 * 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");
}

这是来源链接


我不知道这是否是“正式用例”,但是下面的代码会在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指出if (false)不会触发“无法访问的代码”,因为这会打破对调试标志的支持,即基本上是这种用例(h / t @auselen)。(static final boolean DEBUG = false;例如)。

我更换whileif,产生更模糊的使用情况。我相信你可以通过这种行为将你的IDE与Eclipse一起绊倒,但是这种编辑是未来4年,并且我没有Eclipse环境可以使用。


这似乎是Google的一个笑话。它也在Google Chrome任务管理器中显示。除了一些工程师发现它有趣之外,它没有任何目的。如果你愿意,这本身就是一个目的。

  1. 在Chrome中,使用Shift+ 打开任务管理器Esc
  2. 右键点击添加 Goats Teleported列。
  3. 奇迹。

甚至还有一个关于太多传送山羊的巨大铬报告。

以下Chromium 源代码片段HN评论中被盗取。

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}


补充@djechlin 答案(!好回答的方式),这个函数调用可以同时用作虚拟代码保持一个断点在IDE中,当你想停止在某些特定的迭代或特定的递归调用,例如:

isUserAGoat()可以用来代替虚拟变量声明,该声明将在IDE中显示为警告,并且在Eclipse特定情况下会阻塞断点标记,使其难以启用/禁用。如果该方法用作约定,则所有调用都可以稍后通过某个脚本进行过滤(在提交阶段过程中可能会?)。

谷歌的用户是Eclipse用户(他们提供了几个Eclipse插件:Android SDK,GAE等),所以@djechlin的答案和这个补充答案很有意义(至少对我而言)。

有一个有趣的命名方法/常量/无论在每个版本的Android。

我见过的唯一实际用途是在最后一次Google I / O竞赛中,他们询问了特定版本的内容,看看参赛者是否阅读每个版本的API差异报告。比赛也有编程问题,但一般来说,一些琐事可以先自动分级,以便将提交的数量降至合理的数量,这将更容易检查。


谷歌非常喜欢山羊和山羊复活节彩蛋。甚至有关于它的以前的堆栈溢出帖子

正如前面的帖子中提到的,它也存在于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;
 }

其他Google对山羊的引用包括:

据我所知,山羊和谷歌最早的关联属于最初的“山羊割草”博客文章。

我们可以有把握地认为这只是一个复活节彩蛋,除了回归之外,没有真实世界的使用false



在语音识别学科中,用户分为山羊

例如,在这里第89页

绵羊是语言识别工作非常好的人,山羊是其工作特别差的人。只有语音识别器知道什么将它们分开。人们无法预测哪个人的声音会被轻易识别,哪些人不会。最好的政策是设计界面,以便它可以处理各种环境中的各种声音

也许,计划在未来将Android用户标记为山羊,以便能够为山羊的需求配置语音识别引擎。;-)


从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");
}

这应该清楚表明,捷克林的建议是将其作为一种无警告的使用方式,这if (false)是一种潜在的灾难性战略。之前false为每个设备返回的内容现在会返回一个看似随机的值:如果这个代码深入到您的代码中,可能需要长时间才能确定您的新错误来自哪里。

底线:如果您不控制某个方法的实施并决定将其用于API文档中所述以外的其他目的,那么您就会遇到麻烦。


有一个类似的调用,isUserAMonkey()如果使用MonkeyRunner工具,则返回true 。SDK的解释和这个一样好奇。

public static boolean isUserAMonkey(){}     

true如果用户界面当前正在被猴子混淆,则返回。

这里是来源。

我预计这会增加一个新的SDK工具,名为“山羊”,并且实际上可用于测试该工具的存在。

另外看到一个类似的问题,ActivityManager中的奇怪函数:isUserAMonkey。这是什么意思,它的用途是什么?


在这个星球上最偏远的山区,有一种先进的山羊品种,它似乎目前能够使用手机,就像我们人类一样!

泄漏的镜头:youtu.be/YJwZMUn7GdQ

谷歌一定已经发现了这一点,并决定为它们提供支持,试图留在技术进步的前沿。


有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务管理器(shiftesc)中,右键单击可以添加意大利语版本为“Capre Teletrasportate”(Teleported Goats)的科幻列。

关于它的一个有趣的理论在这里

添加评论

友情链接:蝴蝶教程