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

这是源和变化.

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

我不知道这是否是"官方用例",但是以下内容会在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.祝你好运,当你的代码突然开始在"随机"设备上表现奇怪时!
  • if(Boolean.FALSE){...}通常似乎有效.
  • @djechlin我不知道这是否只是android,在标准java`if(false){...}`编译得很好(打开jdk javac 1.6和1.7)
  • @PeterOlson - 如果你是专门尝试测试一个if为false或者true的代码分支,这是模拟它的最精确和最明显的方法 - 如果你不匹配,那么注释掉块可能不太准确块的结尾(也许你没有注意到紧跟if/else块后面紧随其后),如果你强制执行以下`else`块等,它将导致编译错误.
  • @MarkWhitaker或者山羊是否开始使用设备.
  • @thedayturns如果山羊开始使用Android设备,这将是我们最少的问题.
  • 对于要编译的条件,编译器指令不是更好的用法吗?
  • @josefx - 编译器警告,如果强制关闭代码的分支有一个`return`语句,可能会导致错误,因为这会产生无法访问的代码.这是一个有用的编译器错误; 例如,如果你在开关中忘记了`break;`语句并且你的`default` case抛出一个异常,你就会得到这个错误.
  • @Vadzim nope,编译器会检测到总是求值为true.
  • @djechlin不,不是,您真的尝试过吗?
  • 您是否尝试过使用 /* 和 */ 来注释代码?

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

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

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

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

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

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

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

  • 例如,有一个名为Log.wtf的日志,他们称之为"可怕的失败:P"
  • @ Angelo.Hannes,在传感器重力常数中有一个用于死星(星球大战)
  • "每个版本的Android都有一个有趣的命名方法/常量/任何东西." 你能说出一些名字吗?
  • HoneyComb是AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()
  • 有点像Delphi的EProgrammerNotFound?http://stackoverflow.com/questions/2084120/eprogrammernotfound-exception-in-delphi
  • 在1.5中有一个"Tricorder"传感器类型.
  • @Aracem 那一个实际上很有用,而不是复活节彩蛋。对于破坏功能但不应该发生的错误,我已经使用了很多(即,如果抛出异常,我在之前的检查中阻止了该错误)。这是一个比忽略错误更好的解决方案。

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

例如,请参见第89页:

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


谷歌非常喜欢山羊和山羊的复活节彩蛋.甚至还有关于它的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;
}

其他谷歌参考山羊包括:

  • 用山羊割草
  • 山羊是baaaahk

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

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

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

从API 21(第一个Android 5.0/Lollipop SDK)开始,它会检测是否安装了Goat Simulator应用程序:

这应该清楚表明,djechlin建议将其用作无警告if (false)是一种潜在的灾难性策略.之前false为每个设备返回的内容现在返回一个看似随机的值:如果在您的代码中埋藏得足够深,则可能需要长时间来确定新错误的来源.

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

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

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

public static boolean isUserAMonkey(){}

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

这是来源.

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

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

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

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

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


以上是适用于Android UserManager.isUserAGoat()的用例?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>