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

Ovidiu Latcu 3506 java android usermanager

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

public boolean isUserAGoat()

用于确定进行此呼叫的用户是否受传送的影响.

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

应该如何以及何时使用?

meh.. 1725

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

这是变化.

  • 对于那些喜欢使用这个功能的人来说,我感到很难过,期待它永远地回归"假". (177认同)
  • 理论:山羊存在于各种不稳定的地方,如陡峭的悬崖,可能会使常规的非山羊使用者获得位置趋势.可能会解释"远程传送",当软件试图通过为非山羊设计的算法来确定它们的位置时,可能会出现大量重新定位的山羊. (96认同)
  • 这是历史课,而不是答案.即使它是复活节彩蛋,它是否有一个有效的用例?作为一个复活节彩蛋并不排除它有用,你没有表明它是否有用. (56认同)
  • 这是一个[真正的应用]​​(https://play.google.com/store/apps/details?id=com.coffeestainstudios.goatsimulator). (34认同)
  • @LarsH - 一个来源. (11认同)
  • @raulk是的,他们使用了那个应用程序的ID,他们没有选择一个随机的应用程序ID,然后碰巧有人创建了一个具有该ID的应用程序... (10认同)
  • 他们需要添加`canPigsFly()`.`while(!canPigsFly()){/*code*/}` (8认同)
  • Monkey函数用于检测另一个答案中指定的MonkeyRunner调试工具. (7认同)
  • @casperOne给出了方法的内容我认为用例非常自我解释. (4认同)
  • 有趣的是有一个带有该ID的应用程序:https://play.google.com/store/apps/details?id = com.coffeestainstudios.goatsimulator&hl = en.它不是免费的,也不是谷歌制作的! (4认同)
  • 这个答案如何为问题已经显示的信息添加任何内容? (3认同)
  • @djechlin,源的一个方面是提供信息的,现在答案已被编辑,它更加明显:(此实现)此方法始终返回false. (3认同)
  • 它也是对http://en.wikipedia.org/wiki/The_Men_Who_Stare_at_Goats的引用,该内容涉及涉及山羊的美国军事项目。 (2认同)

djechlin.. 966

我不知道这是否是"官方用例",但是以下内容会在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环境可以使用.

  • **"如果实施没有改变"** - 并且存在问题.这是一种实施无警告"if(false)"的灾难性方法,因为实现可以而且确实会发生变化.请参阅我对这个问题的回答:从API21开始`isUserAGoat()`如果用户安装了特定的应用程序,则返回true.祝你好运,当你的代码突然开始在"随机"设备上表现奇怪时! (149认同)
  • if(Boolean.FALSE){...}通常似乎有效. (28认同)
  • @djechlin我不知道这是否只是android,在标准java`if(false){...}`编译得很好(打开jdk javac 1.6和1.7) (9认同)
  • @PeterOlson - 如果你是专门尝试测试一个if为false或者true的代码分支,这是模拟它的最精确和最明显的方法 - 如果你不匹配,那么注释掉块可能不太准确块的结尾(也许你没有注意到紧跟if/else块后面紧随其后),如果你强制执行以下`else`块等,它将导致编译错误. (9认同)
  • @MarkWhitaker或者山羊是否开始使用设备. (7认同)
  • @thedayturns如果山羊开始使用Android设备,这将是我们最少的问题. (6认同)
  • 对于要编译的条件,编译器指令不是更好的用法吗? (2认同)
  • @josefx - 编译器警告,如果强制关闭代码的分支有一个`return`语句,可能会导致错误,因为这会产生无法访问的代码.这是一个有用的编译器错误; 例如,如果你在开关中忘记了`break;`语句并且你的`default` case抛出一个异常,你就会得到这个错误. (2认同)
  • @Vadzim nope,编译器会检测到总是求值为true. (2认同)
  • @djechlin不,不是,您真的尝试过吗? (2认同)

小智.. 746

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

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

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

铬

以下Chromium 源代码段HN注释中被盗.

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

  • Windows XP +最新的Chrome =它不存在,在Ubuntu上我看到了它. (52认同)
  • 运行Chrome最新版本的Windows 7也没有显示它.:/ (52认同)
  • 我没有它,你在哪里点击右键?或者它用于什么 (23认同)
  • 内部笑话很可能源于此:http://googleblog.blogspot.be/2010/04/goats-are-baaaahk.html (18认同)
  • @auselen您必须右键单击列标题才能看到下拉菜单以添加Goats Teleported列(至少在OS X上Chrome的工作原理).http://cl.ly/Ksbd (13认同)
  • @Xeoncross是的,因为没有人在Windows软件中放过一个复活节彩蛋. (3认同)
  • @pdknsk当您的答案被删除时,它已经有了最新的编辑.我认为这是一个很好的解释,它是什么,但缺少的是对原始问题的答案:**"有谁知道如何以及何时应该使用它?"** (2认同)

higuaro.. 282

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

在此输入图像描述

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

在此输入图像描述

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

  • @Tomasz问题是,在Eclipse中,警告标记使断点混乱,您必须打开断点视图才能停用或删除它 (20认同)
  • 如果你正在编写"虚拟"代码只是为了快速测试一些东西,那么Eclipse警告的问题是什么?我认为这真的很棒,因为你可以在忘记的情况下找到它 (13认同)
  • @Tomasz该解决方案的问题在于您事先知道断点所在的位置,因此简单的视觉检查不会让您知道警告隐藏了断点,更好的解决方案是使用条件断点,使用它们您可以完全忘记虚拟代码(和约定方法),但这些在IDE之间有所不同,并且不能在工作站之间自动共享 (9认同)
  • 是的,我有一个解决方案.您可以右键单击警告符号并选择"切换断点".如果启用以下行/选项,则表示创建了断点.我的观点是,虚拟代码很糟糕,它应该是一个警告,所以你不要忘记;) (4认同)

Lance Nanek.. 141

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

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

  • 例如,有一个名为Log.wtf的日志,他们称之为"可怕的失败:P" (42认同)
  • @ Angelo.Hannes,在传感器重力常数中有一个用于死星(星球大战) (17认同)
  • "每个版本的Android都有一个有趣的命名方法/常量/任何东西." 你能说出一些名字吗? (11认同)
  • HoneyComb是AdapterViewAnimator#fyiWillBeAdvancedByHostKThx() (11认同)
  • 有点像Delphi的EProgrammerNotFound?http://stackoverflow.com/questions/2084120/eprogrammernotfound-exception-in-delphi (6认同)
  • 在1.5中有一个"Tricorder"传感器类型. (5认同)

rainer198.. 133

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

例如,请参见第89页:

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

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


rickyduck.. 123

谷歌非常喜欢山羊和山羊的复活节彩蛋.甚至还有关于它的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中)."山羊传送"的数量实际上是随机的:

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

其他谷歌参考山羊包括:

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

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

  • 据传,ibm还有各种内部软件的山羊参考资料. (4认同)

Mark Whitake.. 119

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

  • 为什么有人会在生产中添加任何类型的`if(false)`?来这里.如果这就是你的代码的样子,那么这个实现改变就是你问题的*最少*. (16认同)
  • 山羊模拟器在Google Play上看起来棒极了https://play.google.com/store/apps/details?id=com.coffeestainstudios.goatsimulator&amp;hl=zh_CN。知道一个人可以从山羊身上得到什么会很好。 (2认同)

KDEx.. 104

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

public static boolean isUserAMonkey(){}     

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

是来源.

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

另请参阅类似问题,ActivityManager中的Strange函数:isUserAMonkey.这意味着什么,它的用途是什么?.

  • 我对这个假设的假设是它允许`ActivityManager`报告它是否被`monkey` ui压力测试工具调用,但我从未证实这一点. (3认同)

j.c.. 38

有趣的复活节彩蛋
在Ubuntu版Chrome中,在任务管理器(shift+ esc)中,右键单击即可添加意大利语版本为"Capre Teletrasportate"(Teleported Goats)的科幻列.

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


归档时间:

查看次数:

303445 次

最近记录:

12 月 前