如何检查Intent是显式的还是隐式的?

3

有没有一种简单的方法可以找出一个 Intent 是显式的还是隐式的?

我正在尝试按照Android文档中推荐的行为实现导航抽屉,即应用程序启动时自动打开抽屉,直到用户手动打开它。

然而,使用导航抽屉的活动可以从我的应用程序内部的多个位置以及外部启动。我希望仅在从我的应用程序外部启动活动时打开抽屉,但我找不到一种简单的方法来查找意图的来源。


Intent中有几个方法最初看起来很有前途:

  • getComponent() 似乎可以在发送端(你已经知道的地方)提供信息(null / not null),但根据文档,在接收端永远不会为null。
  • hasCategory() 可以用于查找外部意图的已知类别,例如android.intent.category.LAUNCHER。这可能是我最终使用的方法,但我宁愿拥有一个通用解决方案,而不是在此处考虑每种可能性。
  • getPackage() 看起来可能做了正确的事情,但除非我没有正确使用它,否则它似乎总是在我的测试中返回null。

另外,我也可以始终使用putExtra()来向所有内部意图添加标志,但是这感觉太像一个 hack,所以如果有其他选择,我宁愿避免使用它。

2个回答

6
有没有一种简单的方法可以确定Intent是显式的还是隐式的?
考虑到您问题的其他部分,这并不是您需要的。您真正需要问的是:
如何在有限的麻烦下确定内部意图调用和外部意图调用?
对于许多应用程序,您可以使用此算法:如果getAction()为null,则它是一个内部显式Intent。否则,假设它是外部的。
如果出于各种原因,您正在使用动作字符串启动本地活动(尽管还设置了组件上的Intent并使其显式),那么您将需要退回到“附加额外”操作。通常,如果您使用显式Intent启动本地活动,则不会设置动作字符串,这使动作字符串成为隐式(动作不为null)和显式(动作为null)之间的明确界定符。

0
最佳实现方式是通过Intent传递额外信息来标识调用它的Activity,就像你提到的那样。考虑到当Activity完成并且调用Activity检查结果代码时,Intents经常被检查静态标识符,因此这不是特别的黑客行为。你的情况是检查调用Activity的相反情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接