关于Java:Android用户管理器的正确使用案例?.isUserAGoat()

Proper use cases for Android UserManager.isUserAGoat()?

我在看Android4.2中引入的新API。在查看UserManager类时,我遇到了以下方法:

1
public boolean isUserAGoat()

Used to determine whether the user making this call is subject to teleportations.

Returns whether the user making this call is a goat.

应如何以及何时使用?


从它们的来源来看,该方法用于返回false,直到在api 21中对其进行了更改。

1
2
3
4
5
6
7
8
/**
 * 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的应用程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 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中产生警告(如果与EDCOX1,3个语句混合,会导致编译错误,导致不可达代码):

1
2
3
while (1 == 2) { // Note that"if" is treated differently
    System.out.println("Unreachable code");
}

但这是合法的:

1
2
3
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,产生了一个更加模糊的用例。我相信你可以像Eclipse一样,通过这种行为绊倒你的IDE,但是这个编辑是4年后的事情了,我没有Eclipse环境可以使用。


这似乎是谷歌内部的笑话。谷歌Chrome任务管理器也提供了这个功能。除了一些工程师觉得有趣之外,它没有任何目的。这本身就是一个目的,如果你愿意的话。

  • 在chrome中,使用shift+esc打开任务管理器。
  • 右击可添加Goats Teleported列。
  • 奇迹。
  • 甚至有一个巨大的铬虫报告说有太多的远程传送的山羊。

    chrome

    下面的chromium源代码片段是从hn注释中窃取的。

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


    补充@djechlin答案(顺便说一句,答案很好!),此函数调用也可以用作伪代码,在您希望在某个特定迭代或特定递归调用中停止时在IDE中保留断点,例如:

    enter image description here

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

    enter image description here

    Google的家伙是Eclipse的重用户(他们以Eclipse插件的形式提供了几个项目:android sdk、gae等),所以@djechlin答案和这个补充答案非常有意义(至少对我来说)。


    在每个版本的Android中都有一个有趣的命名方法/常量/随便什么。

    我所看到的唯一实际用途是在上一次Google I/O竞赛中,他们问特定版本是什么,看看参赛者是否阅读了每个版本的API Diff报告。比赛也有程序问题,但一般来说,一些琐事可以自动评分,首先得到的提交数量下降到合理的数额,将更容易检查。


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

    例如,在第89页:

    Sheeps are people for whom speech recognition works exceptionally well, and goats are people for whom it works exceptionally poorly. Only the voice recognizer knows what separates them. People can't predict whose voice will be recognized easily and whose won't. The best policy is to design the interface so it can handle all kinds of voices in all kinds of environments

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


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

    正如在以前的文章中提到的,它也存在于chrome任务管理器中(它在2009年首次出现在Wild中):

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

    然后在Windows、Linux和Mac版的Chrome 2010年初)。"传送山羊"的数量实际上是随机的:

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

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

    • 山羊割草
    • 山羊是巴亚克

    据我所知,山羊和谷歌最早的关联是在原始的"割草与山羊"博客帖子中。

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


    从API 21(第一个Android 5.0/Lollipop SDK)开始,这将检测是否安装了Goat模拟器应用程序:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
     * 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文档中所述之外的目的,那么您将面临麻烦。


    有一个类似的调用,isUserAMonkey(),如果使用monkeyrunner工具,则返回true。sdk的解释和这个解释一样有趣。

    1
    public static boolean isUserAMonkey(){}

    Returns true if the user interface is currently being messed with by a monkey.

    这是来源。

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

    另请参见ActivityManager中的一个类似问题:IsUserMonkey。这意味着什么,它的用途是什么?.


    enter image description here

    在地球上最偏远的山中,有一种高级的山羊,目前似乎可以使用手机,就像我们人类一样!

    泄露画面:youtu.be/yjwzmun7gdq

    enter image description here

    谷歌肯定发现了这一点,并决定为他们提供支持,以期保持在技术进步的前沿。


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

    这里有一个有趣的理论。


    这不是一个内部笑话显然,它只是一个山羊模拟器-由咖啡染色工作室制作

    如果你安装了山羊模拟器,你就是一只山羊。如果你没有安装,你就不是山羊。

    我认为这更像是一个开发人员的个人实验,很可能是一个社会实验,以找到有共同兴趣的人。


    请参见以下源代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
     * 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");
    }