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; )。

我为if替换了while ,从而产生了更加晦涩的用例。我相信您可以通过这种行为使您的 IDE(例如 Eclipse)崩溃,但是此编辑工作将在 4 年后进行,而且我没有 Eclipse 环境可以使用。

这似乎是 Google 的一个玩笑。 Google Chrome 任务管理器中也提供了该功能。它没有任何目的,只是一些工程师觉得它很有趣。如果您愿意的话,这本身就是一个目的。

  1. 在 Chrome 中,通过Shift + Esc打开任务管理器。
  2. 右键单击以添加 “ Goats Teleported列。
  3. 奇迹。

甚至有大量的关于过多传送山羊的铬虫报告。

铬

HN注释中的以下 Chromium 源代码片段被盗。

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

补充 @djechlin 答案 (顺便问一个好答案!),当您要停止某些特定的迭代或特定的递归调用时,此函数调用可用作伪代码来在 IDE 中保存断点,例如:

在此处输入图片说明

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

在此处输入图片说明

Google 家伙是大量的 Eclipse 用户(他们提供他们的几个项目作为 Eclipse 插件:Android SDK,GAE 等),因此 @djechlin 答案和这个互补的答案很有道理(至少对我而言)。

每个版本的 Android 中都有一个有趣的名为 method / constant / every 的东西。

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

在语音识别领域,用户分为山羊绵羊

例如, 在第 89 页上

绵羊是语音识别非常出色的人,山羊是语音识别非常出色的人。只有语音识别器知道分隔它们的原因。人们无法预测谁的声音将容易被识别,而谁则不会。最好的策略是设计接口,使其可以处理各种环境中的各种声音

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

Google 非常喜欢山羊皮和以山羊为基础的复活节彩蛋 。甚至以前也有关于 Stack Overflow 的文章

如前几篇文章所述,它也存在于 Chrome 任务管理器中( 它于 2009 年首次出现在野外 ):

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

然后在 Windows,Linux 和 Mac 版本的 Chrome(2010 年初 )中进行。实际上,“传送的山羊” 的数量是随机的

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

Google 对山羊的其他提及包括:

据我所知,山羊和 Google 的最早关联属于原始的 “用山羊割草” 博客文章。

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

从 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) djechlin 提出的将其用作无警告的建议是一种潜在的灾难性策略。以前为每台设备返回false的值现在返回一个看似随机的值:如果该值被埋在代码中足够深的位置,则可能需要长时间才能确定新错误的出处。

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

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

public static boolean isUserAMonkey(){}

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

是来源。

我希望这是在新的SDK工具(带有山羊皮的东西)的预期中添加的,并且实际上可以用来测试该工具的存在。

还可以看到类似的问题,即ActivityManager 中的奇怪函数:isUserAMonkey。这是什么意思,有什么用?

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

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