适用于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;
例如).
我替换while
了if
,产生了一个更加模糊的用例.我相信你可以通过这种行为来升级你的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任务管理器中的特色.除了一些工程师发现它很有趣之外,它没有任何意义.如果你愿意的话,这本身就是一个目的.
- 在Chrome中,使用Shift+ 打开任务管理器Esc.
- 右键单击以添加
Goats Teleported
列. - 奇迹.
关于太多传送的山羊,甚至还有一个巨大的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&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)的科幻列.
关于它的一个有趣的理论就在这里.