如何获得一个意图的发件人?

活动是否有办法找出谁(即class级名称)发送了一个Intent ? 我正在寻找一种通用的方式,让我的Activity通过发送一个回复给发件人(无论是谁)来回应收到的意图。

也许还有另外一种方法,但我所知道的唯一解决scheme是让Activity A通过startActivityForResult()调用Activity B。 然后活动B可以使用getCallingActivity()来检索活动A的身份。

这是一个外部的应用程序,你收到意图? 你可以使用activity类的getReferrer()方法

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

  this.getReferrer().getHost() 

将返回:

  com.google.android.apps.maps 

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

这不是令人难以置信的直接,但你可以从ActivityManager获得最近的任务列表。 所以来电者本质上是你之前的任务,你可以获取有关该任务的信息。

用法示例:

 ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED); 

以上将返回从最近(您的)到指定限制的所有任务的列表。 请参阅文档以了解可从RecentTaskInfo对象获取的信息types。

我使用的技术是要求应用程序发送相关的意图添加一个PendingIntent作为Parcelable额外; PendingIntent可以是任何types(服务,广播等)。 我的服务做的唯一事情是调用PendingIntent.getCreatorUid()和getCreatorPackage(); 这个信息在PendingIntent被创build时填充,不能被应用伪造,所以我可以得到关于一个Intent的发送者的信息。 唯一需要注意的是该解决scheme仅适用于Jellybean,后来才是我的情况。 希望这可以帮助,

一般来说,你不需要知道这一点。 如果调用活动使用startActivityForResult(Intent, int) ,则被调用者可以使用setResult(int, Intent)指定一个Intent发回给调用者。 调用者将在onActivityResult(int, int, Intent)方法中接收此Intent。

基于你的问题,因为你想发送一个意图发送者startActivityForResult是比我要build议的更好的select。 但是,当用户点击通知时,我需要启动活动B, 只有当活动A是活动A, 才能在活动B中执行一些代码。这就是我很简单的做法。

内部活动A:

 String senderName = this.getClass().getSimpleName(); Intent clickIntent = new Intent(ActivityA.this, ActivityB.class); clickIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); clickIntent.putExtra("SENDER_CLASS_NAME", senderName); //I use PendingIntent to start Activity B but you can use what you like such as this.startActivity(clickIntent); PendingIntent.getActivity(ActivityA.this, NOTIFICATION_ID, clickIntent, PendingIntent.FLAG_ONE_SHOT); 

活动B内:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = getIntent().getExtras(); if (bundle != null) { if(bundle.containsKey("SENDER_CLASS_NAME")){ String senderName = bundle.getString("SENDER_CLASS_NAME"); //Execute some code Log.d("GCM", "Notifications clicked"); } } } }