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


3631

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

public boolean isUserAGoat()

用于确定发出此呼叫的用户是否受到传送。

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

应该如何以及何时使用?


3
If可以用来避免一些Java警告,作为复活节彩蛋,以及作为测试看谁阅读API的测试。这是对Chrome中的复活节彩蛋的引用。
多利安(Dorian)2012年


3
谷歌人似乎出于某种原因喜欢山羊,难怪他们用山羊做成了复活节彩蛋。还有一个严重的(山羊投资): -如博客中googleblog - 山羊割草 - 山羊是baaaahk -并记录在YouTube上毕竟他们是当地的草坪推动者,高效以及..

16
第一个死亡之星developer.android.com/reference/android/hardware/…和电视节目的孤岛上也有重力常数,失落的developer.android.com/reference/android/hardware/…是当然,数字。
Fernando Gallego

Answers:


1790

从其来源开始,该方法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");
}

这是源头变化


102
理论:山羊在各种不稳定的地方都可以找到,例如陡峭的悬崖,这可能与他们从普通非山羊使用者那里获得的位置趋势相反。可能会解释“运输”,这可能是山羊似乎在疯狂迁移,因为该软件试图使用为非山羊设计的算法来确定其位置。
摊贩2012年

11
@LarsH-一个的源。
djechlin 2012年

56
这是历史课,不是答案。即使是复活节彩蛋,也有有效的用例吗?成为复活节彩蛋并不能阻止它变得有用,您也没有显示它是否有用。
casperOne 2012年


194
对于那些过分使用该功能并希望它false永远返回的人来说,我感到很难过。
Martin Konecny 2015年

983

我不知道这是否是“该”正式用例,但是以下内容在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环境可以使用。


10
@djechlin我不知道这是否仅是android,在标准java`if(false){...}`中可以正常编译(打开jdk javac 1.6和1.7)
josefx 2012年

9
@PeterOlson-如果您专门尝试测试if变为false或true的代码分支,这是模拟该错误的最精确,最明显的方法-如果您不符合要求,则注释掉该块可能不太准确块的结束,如果你强迫以下(也许你没有注意到一个不显眼的if / else块紧随其后),它会导致编译错误else块等
djechlin

160
“前提是实现不会改变” -这就是问题所在。这是实现无警告“ if(false)”的灾难性方法,因为实现可能并且确实会发生变化。请参阅我对这个问题的回答:从API21开始,isUserAGoat()如果用户安装了特定的应用程序,则返回true。祝您好运,当您的代码突然在“随机”设备上开始出现异常行为时,请进行诊断!
马克·惠特克

11
@MarkWhitaker或山羊开始使用设备。
dayturns '16

8
@thedayturns如果山羊开始使用Android设备,这将是我们最少的问题。
Szymon Drosdzol '16

760

这似乎是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;
}

24
我没有,您在哪里右键单击?或它的用途
auselen 2012年

13
@auselen您必须右键单击列标题才能查看下拉菜单以添加Goats Teleported列(至少在OS X的Chrome中是如此)。cl.ly/Ksbd
greenie 2012年

53
Windows XP +最新的Chrome =它不存在,在Ubuntu上我看到了。
auselen

4
@Xeoncross是的,因为从来没有人在Windows软件中添加过复活节彩蛋。
马克·艾伦


289

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

在此处输入图片说明

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

在此处输入图片说明

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


13
如果要编写“虚拟”代码只是为了快速测试某些东西,那么Eclipse警告有什么问题?我认为这真的很棒,以防万一您忘记了它
Tomasz 2013年

20
@Tomasz问题在于,在Eclipse中,警告标记会使断点杂乱无章,您必须打开断点视图才能停用或删除它
higuaro

4
是的,我有解决办法。您可以右键单击警告符号,然后选择“切换断点”。如果启用以下行/选项,则表示已创建断点。我的意思是,伪代码很糟糕,应该是一个警告,以便您不要忘记;)
Tomasz

9
@Tomasz该解决方案的问题在于您事先知道断点在哪里,因此简单的视觉检查不会让您知道警告隐藏了断点,尽管更好的解决方案是将条件断点与它们一起使用您可能会完全忘记伪代码(和约定方法),但是它们在IDE之间是不同的,并且不能在工作站之间自动共享
higuaro

1
为什么不只使用null语句;?我的意思是,山羊显然要好一些,但是已经有一种简单的方法可以解决这个问题
-Bassinator

148

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

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


11
“每个版本的Android中都有一个有趣的命名方法/常量/任何内容。” 你能说一些吗?
Angelo.Hannes 2012年

43
例如,有一个名为Log.wtf的日志,他们称之为“可怕的失败:P
Aracem”,2012年

7
有点像Delphi的EProgrammerNotFound吗?stackoverflow.com/questions/2084120/...
格里科尔

12
HoneyComb是AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()
Lance Nanek 2012年

18
@ Angelo.Hannes,在重力感应常数中有一个死亡之星(星球大战)
st0le 2012年

141

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

例如,在第89页上

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

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


126

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的最早关联属于原始的“用山羊割草”博客文章。

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


4
也有传言说ibm在各种内部软件中都有山羊参考。
山羊

“用山羊割草”参考的存档链接:web.archive.org/web/20100619024942/https
//…

126

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


17
为什么有人会投入任何形式的if(false)生产?来这里。如果这就是您的代码,那么这种实现更改将是您最少的问题。
djechlin 2014年

1
嗯,根据实际的API文档(用户远程传送趋势),我认为使用它始终返回false确实是遵循合同的唯一方法。尽管如此,您还是提出了一个很好的观点。
密码破解者2014年

2
山羊模拟器在Google Playplay.google.com/store/apps/…上看起来很棒。知道一个人可以从山羊身上得到什么会很好。
整流罩

109

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

public static boolean isUserAMonkey(){}     

返回true用户界面当前是否被猴子弄乱了。

是来源。

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

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


3
我对此的假设是,它可以ActivityManager报告monkeyui压力测试工具是否已调用它,但我从未证实过。
CtrlF 2014年

40

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

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


似乎找不到了:(
Thornkey

4

这不是内心的玩笑

显然,这只是山羊模拟器的应用检查器 -Coffee Stain Studios撰写

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

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


7
该方法是在山羊模拟器之前创建的。尽管它会检查是否已安装该应用程序,但之前没有做任何事情。反正这是个玩笑。
里卡多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.