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

问题描述:

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

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

public boolean isUserAGoat() 用于确定进行此呼叫的用户是否受到传送。返回进行此调用的用户是否是山羊。

应该如何以及何时使用它?

解决方案1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

Android R 更新:

在 Android R 中,此方法始终返回 false。谷歌表示这样做是为了“保护山羊隐私”:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.
 *
 * As of {@link android.os.Build.VERSION_CODES#R}, this method always returns
 * {@code false} in order to protect goat privacy.
 *
 * @return Returns whether the user making this call is a goat.
 */
public boolean isUserAGoat() {
    if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
        return false;
    }
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

上一个答案:

从他们的 source 开始,该方法用于返回 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;
}

看起来该方法对我们作为开发人员没有真正的用途。之前有人说过它可能是一个Easter egg。

在 API 21 中,实施已更改为检查是否已安装应用程序包 com.coffeestainstudios.goatsimulator

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

这是 source 和 change。

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

理论:山羊出现在各种不稳定的地方,比如陡峭的悬崖,这可能与他们从普通非山羊用户那里得到的位置趋势相反。可能会解释“传送”,这可能是山羊在尝试使用为非山羊设计的算法来确定它们的位置时似乎在疯狂地重新定位。

@LarsH - 一个的来源。

这是历史课,不是答案。即使它是一个复活节彩蛋,它是否有一个有效的用例?作为一个复活节彩蛋并不妨碍它有用,而且你还没有证明它是否有用。

那是一个real app。

我为任何厚颜无耻地使用此功能的人感到难过,期望它永远返回 false。

解决方案2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

我不知道这是否是“官方”用例,但以下会在 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 环境可以玩。

@djechlin我不知道这是否只是android,在标准java中if(false){…}编译得很好(打开jdk javac 1.6和1.7)

@PeterOlson - 如果您专门尝试测试 if 为 false 或 true 的代码分支,这是最精确和最明显的模拟方法 - 如果您与正确的不匹配,注释掉该块可能不太准确块的末尾(也许您没有注意到紧随其后的谨慎 if/else 块),如果您强制执行以下 else 块等,它将导致编译错误。

“只要实现没有改变” - 问题就来了。这是实现无警告“if (false)”的灾难性方式,因为实现可以而且确实会改变。请参阅我对这个问题的回答:从 API21 开始,如果用户安装了特定应用程序,isUserAGoat() 将返回 true。祝你好运,当你的代码突然开始在“随机”设备上出现奇怪的行为时!

@MarkWhitaker 或者如果山羊开始使用设备。

@thedayturns 如果山羊开始使用 Android 设备,这将是我们遇到的最少的问题。

解决方案3:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

这似乎是谷歌的一个内部笑话。它也出现在 Google Chrome 任务管理器中。它没有任何目的,只是一些工程师觉得它很有趣。如果您愿意,这本身就是一个目的。

在 Chrome 中,使用 Shift+Esc 打开任务管理器。右键单击以添加 Goats Teleported 列。想知道。

甚至还有一个关于 too many teleported goats 的巨大 Chromium 错误报告。

https://i.stack.imgur.com/1nwdC.png

以下 Chromium source code snippet 是从 HN 评论中窃取的。

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

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

解决方案4:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

作为对@djechlin answer 的补充(顺便说一句,答案很好!),当您想在某些特定迭代中停止或一个特定的递归调用,例如:

https://i.stack.imgur.com/mW1Lf.png

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

https://i.stack.imgur.com/MFIBa.png

谷歌的家伙是 Eclipse 的重度用户(他们提供了几个项目作为 Eclipse 插件:Android SDK、GAE 等),所以@djechlin 的答案和这个互补的答案很有意义(至少对我来说)。

如果您编写“虚拟”代码只是为了快速测试某些东西,那么 Eclipse 警告有什么问题?我认为这实际上很棒,因为如果您忘记了,您可以找到它

@Tomasz 的问题是,在 Eclipse 中,警告标记使断点混乱,您必须打开断点视图才能停用或删除它

是的,我有一个解决方案。您可以右键单击警告符号并选择“切换断点”。如果启用了以下行/选项,则表示已创建断点。我的意思是,虚拟代码很糟糕,它应该是一个警告,所以你不要忘记;)

@Tomasz该解决方案的问题是您事先知道断点在哪里,因此简单的目视检查不会让您知道警告隐藏了断点,但更好的解决方案是使用条件断点和它们您可以完全忘记虚拟代码(和约定方法),但是这些在 IDE 之间有所不同,并且不能在工作站之间自动共享

解决方案5:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

“每个版本的 Android 都有一个有趣的命名方法/常量/随便什么。”你能说出一些吗?

例如,有一个名为 Log.wtf 的日志,他们称之为多么可怕的失败:P

有点像 Delphi 的 EProgrammerNotFound? stackoverflow.com/questions/2084120/…

HoneyComb 是 AdapterViewAnimator#fyiWillBeAdvancedByHostKThx()

@Angelo.Hannes,在重力传感器常数中,有一个用于死星(星球大战)

解决方案6:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

例如,这里 on page 89:

绵羊是语音识别工作异常出色的人,山羊是语音识别工作异常糟糕的人。只有语音识别器知道它们之间的区别。人们无法预测谁的声音会被轻松识别,谁的声音不会。最好的策略是设计界面,使其能够处理各种环境中的各种声音

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

解决方案7:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

As of API 21 (the first Android 5.0/Lollipop SDK),这会检测是否安装了 Goat Simulator 应用程序:

/**
 * Used to determine whether the user making this call is subject to
 * teleportations.
 *
 * As of {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method can
 * now automatically identify goats using advanced goat recognition technology.
 *
 * @return Returns true if the user making this call is a goat.
 */
public boolean isUserAGoat() {
    return mContext.getPackageManager()
            .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}

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

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

为什么会有人将任何类型的 if(false) 投入生产?来这里。如果这就是您的代码的样子,那么此实现更改是您的问题中的最少。

@djechlin“我们需要这个功能吗?更改为 if(false),测试功能没有。签入”

解决方案8:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

Google 非常喜欢山羊和基于山羊的Easter eggs。甚至还有previous Stack Overflow posts about it。

正如之前的帖子中提到的,它也存在于 Chrome 任务管理器 (it first appeared in the wild in 2009) 中:


    Goats Teleported


And then in Windows, Linux and Mac versions of Chrome early 2010)。 “Goats Teleported”的数量实际上是 random:

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

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

用山羊割草

山羊是 baaaahk

据我所知,goats 和 Google 最早的关联属于原始的“Mowing with goats”博客文章。

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

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

@goat 只为用户名投票

解决方案9:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

public static boolean isUserAMonkey(){} 如果用户界面当前正被猴子弄乱,则返回 true。

Here 是来源。

我希望这是在预期新的 SDK 工具时添加的,该工具名为 something with a goat,并且实际上可以用于测试该工具的存在。

另请参阅类似的问题 Strange function in ActivityManager: isUserAMonkey. What does this mean, what is its use?。

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

解决方案10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

有趣的复活节彩蛋。在 Ubuntu 版本的 Chrome 中,在任务管理器 (shift+esc) 中,通过右键单击可以添加一个在意大利语版本中为“Capre Teletrasportate”(Teleported Goats)的科幻专栏。

关于它的一个有趣的理论是here。

解决方案11:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

这不是一个内部笑话

显然它只是 Goat Simulator - by Coffee Stain Studios 的应用程序检查器

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

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

该方法是在山羊模拟器之前创建的。虽然它会检查应用程序现在是否已安装,但它之前并没有做任何事情。无论如何,这是一个笑话。

谷歌浏览器的标签监视器有一个复活节彩蛋专栏«山羊传送»(isUserAGoat 文档也提到了山羊传送。所以这绝对是一个内部笑话。

原文链接:https://www.huntsbot.com/qa/Pd82/proper-use-cases-for-android-usermanager-isuseragoat?lang=zh_CN

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值