如何在安卓系统中找到意图来源?

37
可能有重复:
Android:如何获取发送Intent的源活动? 在Android中是否有一种方法可以找到触发 INTENT 的源 Activity(在目标 Activity 中)? 场景是我有两个 Activity A 和 B,它们都触发一个 Intent 来调用 Activity C。 Activity C 根据其来源显示额外信息。例如,如果来自 A,则 C 仅显示 2 个文本视图,而如果由 B 触发的 Intent 的情况下,Activity C 显示 3 个文本视图(基本上是根据呼叫者提供更多信息)。
为了建立这个,我需要知道谁触发了调用 C 的 Intent。我该怎么做?

听起来很不专业。A和B是你的吗?如果是,我肯定会使用extras。如果不是,那么这听起来像是一个容易出问题的hack。 - EboMike
问题在于A和B不属于我,即使我获得了更改的权限,也有很多现有代码需要更改,而我不喜欢这样。C正在建设中,并希望将此逻辑纳入C中。 - Akh
4个回答

27

如果我们查看Intent.java类,可以看到只包括成员

private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;

我认为这些成员中没有包含发件人信息,因此回答是不可能的。你无法对任意意图执行此操作。


27

更好的方法是使用意图附带额外信息来将参数传递给接收器。


1
想象一下,如果我们无法从意图中得知源头,为什么?这难道不应该由Android完成吗? - Necronet

20

这可能被认为是一种解决方法吗?

让 A 和 B 调用 startActivityForResult 而不是 startActivity,然后你就可以调用 getCallingActivity().getClassName() 来检索来源。


1
很棒的答案。我会尝试这个。 - Ben H

4
如果应用程序C拥有GET_TASKS权限,则可以查看最近的任务是什么。
ActivityManager man = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> list = man.getRecentTasks(1, 0);
//You might want to check if(list.size() > 0)

Intent caller = list.get(0).baseIntent;
//look at caller.getComponent() for the package and class

在我的测试中,我发现最可靠的标识符是最近任务堆栈顶部的baseIntent。关于为什么你可能不想这样做还有更多讨论,请参考https://dev59.com/LGjWa4cB1Zd3GeqPplUn#12376775
我认为如果您对A和B有任何控制权,您可以像之前提到的那样呼叫它们以获取结果。

抱歉回复晚了,但从“L”更新开始,“获取最近任务”已被弃用,它只会返回主页和任何框架认为“安全”向应用程序公开的其他任务。 - Sreedevi J
即使您拥有系统权限? - JohnyTex

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