3871

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

public boolean isUserAGoat()

用于确定进行此呼叫的用户是否会受到传送。

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

应该如何以及何时使用它?

4

11 回答 11

1928

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

上一个答案:

从他们的来源,该方法用于返回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");
}

这是来源变化

于 2012-11-14T08:40:30.647 回答
1016

我不知道这是否是“官方”用例,但以下会在 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;例如)。

我替换while了 for if,产生了一个更晦涩的用例。我相信你可以用这种行为来绊倒你的 IDE,比如 Eclipse,但是这个编辑是 4 年后的未来,而且我没有 Eclipse 环境可以玩。

于 2012-11-14T14:47:29.780 回答
791

这似乎是谷歌的一个内部笑话。它也出现在 Google Chrome 任务管理器中。它没有任何目的,只是一些工程师觉得它很有趣。如果您愿意,这本身就是一个目的。

  1. Shift在 Chrome 中,使用+打开任务管理器Esc
  2. 右键单击以添加 Goats Teleported列。
  3. 想知道。

甚至还有一个巨大的 Chromium 错误报告,关于太多被传送的山羊

铬合金

以下 Chromium源代码片段是从HN注释中窃取的。

int TaskManagerModel::GetGoatsTeleported(int index) const {
  int seed = goat_salt_ * (index + 1);
  return (seed >> 16) & 255;
}
于 2012-11-14T09:03:07.070 回答
307

作为@djechlin答案的补充(顺便说一句,答案很好!),当您想在某些特定迭代或特定递归调用中停止时,此函数调用也可以用作在 IDE 中保存断点的虚拟代码,例如:

在此处输入图像描述

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

在此处输入图像描述

谷歌的家伙是 Eclipse 的重度用户(他们将他们的几个项目作为 Eclipse 插件提供:Android SDK、GAE 等),所以@djechlin 的答案和这个互补的答案很有意义(至少对我来说)。

于 2012-11-21T16:55:12.603 回答
159

在每个版本的 Android 中都有一个有趣的命名方法/常量/任何东西。

我见过的唯一实际用途是在 Last Call for Google I/O竞赛中,他们询问特定版本是什么,以查看参赛者是否阅读了每个版本的 API 差异报告。比赛也有编程问题,但通常一些琐事可以首先自动评分,以将提交的数量降低到更容易检查的合理数量。

于 2012-11-14T17:26:04.803 回答
151

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

例如,在第 89 页

绵羊是语音识别工作异常出色的人,山羊是语音识别工作异常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音会被轻松识别,谁的声音不会。最好的策略是设计界面,使其能够处理各种环境中的各种声音

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

于 2013-05-31T09:33:44.150 回答
137

从 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 文档中未说明的目的,那么您将遇到麻烦。

于 2014-10-20T10:00:29.570 回答
132

谷歌非常喜欢山羊和山羊复活节彩蛋。甚至以前的 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 中)。“Goats Teleported”的数量实际上是随机的:

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

其他谷歌对山羊的引用包括:

据我所知,goats 和 Google 最早的关联属于原始的“Mowing with goats”博客文章。

我们可以放心地假设它只是一个复活节彩蛋,除了返回之外没有任何实际用途false

于 2012-11-15T10:33:43.987 回答
114

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

public static boolean isUserAMonkey(){}     

true如果用户界面当前正被猴子弄乱,则返回。

是来源。

我希望这是在一个名为 something with a goat的新SDK工具的预期中添加的,并且实际上可以用于测试该工具的存在。

另请参阅类似的问题,ActivityManager 中的奇怪函数:isUserAMonkey。这是什么意思,它有什么用?.

于 2012-11-16T21:33:43.937 回答
44

有趣的复活节彩蛋。
在 Ubuntu 版本的 Chrome 中,在任务管理器 ( shift+ esc) 中,您可以通过右键单击添加一个在意大利语版本中为“Capre Teletrasportate”(传送山羊)的科幻专栏。

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

于 2014-02-06T10:35:13.650 回答
4

这不是一个内部笑话

显然它只是山羊模拟器的应用程序检查 器 - 由 Coffee Stain Studios

如果您安装了山羊模拟器,那么您就是山羊。如果你没有安装它,你就不是山羊。

我想这更像是一位开发人员的个人实验,最有可能找到有共同兴趣的人。

于 2018-11-17T19:11:42.240 回答