如何获得意图的发送者?

zer*_*lus 35 android

有没有办法Activity找出谁(即班级名称)发送了Intent?我正在寻找一种通用的方式让我Activity回复收到的意图,然后将一个回发给发件人,无论是谁.

And*_*ang 30

可能有另一种方式,但我知道的是具有活性甲唯一的解决方案通过调用活动B startActivityForResult().然后,活动B可用于getCallingActivity()检索活动A的身份.

  • 如何使用 getCallingActivity()?我试图用它来设置这样的文本:`txt.setText(getCallingActivity());`但它显示'null'。我该怎么做才能让它显示调用活动的名称? (3认同)

don*_*uxx 14

它是你收到意图的外部应用程序吗?您可以使用getReferrer()活动类的方法

一个简单的例子:我打开谷歌地图应用程序,通过使用谷歌地图的共享选项与我的应用程序共享一些位置.然后我的应用程序打开,此方法调用Activity:

 this.getReferrer().getHost()
Run Code Online (Sandbox Code Playgroud)

将返回:

 com.google.android.apps.maps
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档:https://developer.android.com/reference/android/app/Activity.html#getReferrer()

请注意,这需要API 22.对于较旧的Android版本,请参阅ajwillliams的回答


小智 9

我使用的一种技术是要求应用程序发送相关的Intent以将PendingIntent添加为Parcelable extra; PendingIntent可以是任何类型(服务,广播等).我的服务唯一的作用是调用PendingIntent.getCreatorUid()和getCreatorPackage(); 创建PendingIntent时会填充此信息,并且应用程序无法伪造此信息,因此我可以获取有关Intent发件人的信息.唯一需要注意的是,解决方案只适用于Jellybean,后来就是我的情况.希望这可以帮助,


小智 8

这不是非常直接,但您可以从ActivityManager获取最近任务的列表.所以调用者基本上是你之前的任务,你可以获取该任务的信息.

用法示例:

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED);
Run Code Online (Sandbox Code Playgroud)

以上将返回从最近(您的)到指定限制的所有任务的列表.有关可从RecentTaskInfo对象获取的信息类型,请参阅此处的文档.

  • 在API 21中不推荐使用getRecentTasks,并且不再适用于不属于您的应用程序的堆栈.请参阅http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int,int) (3认同)

ada*_*amp 6

通常你不需要知道这一点.如果调用活动使用startActivityForResult(Intent, int),则被调用者可以使用setResult(int, Intent)指定要发送回调用者的Intent.调用者将在其onActivityResult(int, int, Intent)方法中接收此Intent .

  • 只有在子Activity关闭后才会发送`setResult`的意图.我希望能够在子活动运行时任意将意图发送回父活动. (2认同)