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

时间:2012-11-14 08:34:02

标签: java android usermanager

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

public boolean isUserAGoat()
     

用于确定拨打此电话的用户是否受传送的影响。

     

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

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

12 个答案:

答案 0 :(得分:1655)

source 开始,该方法用于返回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;
}

看起来这个方法对于我们作为开发人员并没有真正的用处。之前有人说过它可能是 Easter egg

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

以下是sourcechange

答案 1 :(得分:952)

我不知道这是否是“官方用例”,但是以下内容会在Java中产生警告(如果与return语句混合,可能会进一步产生编译错误,从而导致代码无法访问): / p>

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

所以我经常发现自己编写一个愚蠢的实用工具方法,以最快的方式来编写代码块,然后在完成调试时找到对它的所有调用,因此如果实现没有改变,则可以使用它。 / p>

JLS指出if (false)不会触发“无法访问的代码”,因为这会破坏对调试标志的支持,即基本上这个用例(h / t @auselen)。 (例如static final boolean DEBUG = false;)。

我为while替换了if,产生了一个更加模糊的用例。我相信你可以通过这种行为来启动你的IDE,比如Eclipse,但是这个编辑是未来4年,我没有Eclipse环境可以使用。

答案 2 :(得分:733)

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

  1. 在Chrome中,使用 Shift + Esc 打开任务管理器。
  2. 右键单击以添加Goats Teleported列。
  3. 奇迹。
  4. 甚至有关于too many teleported goats的大量Chromium错误报告。

    chrome

    source code snippet评论中隐藏了以下Chromium HN

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

答案 3 :(得分:273)

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

enter image description here

可以使用

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

enter image description here

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

答案 4 :(得分:134)

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

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

答案 5 :(得分:123)

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

例如, on page 89

  

绵羊是言语识别非常好的人,而山羊则是非常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音将被轻易识别,谁的声音不会被识别。最好的策略是设计界面,以便它可以处理各种环境中的各种声音

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

答案 6 :(得分:116)

谷歌非常喜欢山羊和山羊Easter eggs。甚至有previous Stack Overflow posts about it

正如之前的帖子中所提到的,它也存在于Chrome任务管理器(it first appeared in the wild in 2009)中:

<message name="IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN" desc="The goats teleported column">
    Goats Teleported
</message>

And then in Windows, Linux and Mac versions of Chrome early 2010)。 “山羊传送”的数量实际上是random

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

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

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

我们可以安全地假设它只是一个复活节彩蛋,除了返回false之外没有实际使用。

答案 7 :(得分:110)

As of API 21 (the first 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's suggestion将其用作无警告if (false)是一种潜在的灾难性策略。之前为每个设备返回false的内容现在返回一个看似随机的值:如果这个值已深入到您的代码中,那么可能需要很长的时间来确定新错误的来源

结论:如果您不控制方法的实施并决定将其用于API文档中未说明的目的,那么您将面临麻烦。

答案 8 :(得分:102)

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

public static boolean isUserAMonkey(){}     
     

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

Here是来源。

我希望这是为了预期一个新的SDK工具添加了一个名为山羊的东西,并且实际可用于测试该工具的存在。

另请参阅类似的问题 Strange function in ActivityManager: isUserAMonkey. What does this mean, what is its use?

答案 9 :(得分:34)

有趣的复活节彩蛋。
在Ubuntu版本的Chrome中,在任务管理器( shift + esc )中,右键单击可以添加意大利语版本中的科幻列。 Capre Teletrasportate&#34; (传送山羊)。

关于它的有趣理论是here

答案 10 :(得分:2)

这不是内心的笑话 显然,这只是一个应用程序检查器 Goat Simulator - by Coffee Stain Studios

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

我想这更多是由一位开发人员进行的个人实验,很可能是一项社交实验,目的是寻找具有共同兴趣的人。

答案 11 :(得分:1)

请参见下面的源代码:

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