Activity
有没有办法找出谁(即班级名称)发送了Intent
?我正在寻找一种通用的方式,以便我的Activity
通过将收到的意向发送回发件人(可能是任何人)来回应收到的意向。如何获取意图的发件人?
回答
可能还有其他方法,但我知道的唯一解决方案是让活动A通过startActivityForResult()
调用活动B.然后活动B可以使用getCallingActivity()
来检索活动A的身份。
通常你不需要知道这一点。如果呼叫活动使用startActivityForResult(Intent, int)
,被叫方可以使用setResult(int, Intent)
来指定将意图发送回主叫方。调用者将通过其onActivityResult(int, int, Intent)
方法收到此Intent。
只有在子Activity被关闭时才会发送'setResult'的意图。我希望能够在儿童活动正在运行时随意将意图发送回家长活动。 – zer0stimulus 2010-07-22 22:10:37
这不是令人难以置信的直接,但您可以从ActivityManager获取最近任务的列表。因此,调用者本质上是您的任务之前的任务,您可以获取有关该任务的信息。
用法示例:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED);
以上将返回从最近的(你的)的所有任务列表来指定的限制。有关您可以从RecentTaskInfo对象获取的信息类型,请参阅文档here。
getRecentTasks被弃用API 21,并且将不再为没有通过您的应用程序拥有的栈工作。见http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int,INT) – 2015-08-31 22:25:22
我使用的技术是要求应用程序发送相关的意图添加一个PendingIntent作为一个Parcelable额外; PendingIntent可以是任何类型(服务,广播等)。我的服务唯一能做的就是调用PendingIntent.getCreatorUid()和getCreatorPackage();这个信息在PendingIntent被创建时填充,并且不能被应用伪造,所以我可以获得关于Intent发送者的信息。 唯一需要注意的是该解决方案仅适用于Jellybean,后来才是这种情况。 希望这有助于,根据您的问题
你如何要求他们送的PendingIntent?我没有看到一个意图过滤选项。你是否放弃了没有额外的意图? – TBridges42 2015-07-15 12:48:07
看起来像一个不好的主意一见钟情。难道恶意应用程序伪造了PendingIntent吗?当然,'PendingIntent'没有公共构造函数,但'readPendingIntentOrNullFromParcel'看起来可以做到这一点,不是吗? – Giszmo 2016-10-17 16:55:46
@Giszmo以及getCreatorUid()文档声明它不能被欺骗。不知道如何处理序列化,但必须有一些特殊的安全措施,如使用创建者拥有的私钥对序列化内容进行签名。也就是说,正如getCreatorUid()文档指出的那样,您仍然必须小心这个策略。仅仅因为某些包X具有由Y创建的PendingIntent并不意味着X == Y. Y可能已将PendingIntent发送给X用于某种不相关的目的。 Y向X发送一个PendingIntent意味着Y相信这个特定的动作,而不是一般的。 – 2017-08-30 18:00:43
,因为你想的意图回向发件人发送startActivityForResult比什么,我要提出一个更好的选择。但是,当用户点击通知时,我需要启动活动B,并且只有在发件人活动为活动A时才执行活动B 中的某些代码。这就是我很简单的做法。
内活动答:
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");
}
}
}
}
难道您收到的意图外部应用程序?您可以使用活动类
一个简单的例子的getReferrer()
方法:我打开谷歌地图应用程序中使用谷歌地图的股权与大家分享我的应用程序的某个位置。然后,我的应用程序打开,并在活动调用此方法:
this.getReferrer().getHost()
将返回:
com.google.android.apps.maps
看到文档的位置:https://developer.android.com/reference/android/app/Activity.html#getReferrer()
注意,这需要API 22。对于较旧的Android版本,看到ajwillliams
如果您的应用程序已在Google地图中使用共享功能时已打开并保留在后台中,该怎么办?它还会返回谷歌地图的包名吗? – mathew11 2017-06-07 14:50:07
getReferrer()需要API22(Android 5.1)。在4.4版本等较低版本中应该做些什么? – 2017-08-31 15:03:57
一些代码来检查API22: 字符串startedFrom = NULL; 如果(android.os.Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP_MR1){ startedFrom = this.getReferrer()和getHost(); } – FrankKrumnow 2017-11-14 11:20:23
- 1. 如何从方法showViewController获取发件人:发件人:
- 2. 如何获取对象发件人?
- 3. 如何从意图获取文件名?
- 4. 如何从ACTION_GET_CONTENT获取的URI获取文件名意图?
- 5. 从发件人获取IP
- 6. MPI_Request - 获取发件人
- 7. 意图过滤器/意图的发件人,android
- 8. 如何确定广播意图的发件人
- 9. 获取邮件发件人的姓名
- 10. 如何从Zend_Mail_Message获取发件人的电子邮件地址?
- 11. 如何获取发件人的电子邮件地址
- 12. 如何获取EWS MAPI中电子邮件的发件人?
- 13. 如何从Outlook获取发件人的电子邮件地址?
- 14. 获取NSInvocation消息的发件人
- 15. 获取SqlDataSource发件人对象的ID
- 16. 在Swift中获取UITapGestureRecognizer的发件人
- 17. JavaScript的:获取发件人元素
- 18. 获取UIElement或发件人的背景
- 19. 从发送到意图获取数据
- 20. PyQt如何获取发件人(小部件)在closeEvent?
- 21. 如何获取电子邮件发件人地址
- 22. 如何从设备获取发件人电子邮件?
- 23. 如何获取SMSLib中的发件人电话号码?
- 24. 如何在此处获取有关发件人的信息
- 25. 如何在方法中获取“对象发件人”的子项?
- 26. 如何通过发件人获取有关注释的参考?
- 27. 如何获取NSButton的发件人名称
- 28. 如何快速获取发件人的身份3
- 29. 如何从gmail获取发件人的姓名?
- 30. QUdpSocket。如何获取发件人的IP地址?
我们在图书馆工作了核实'Intent's使用这种技术开始与发送者和接收者,因为它最简单的答案。你可以找到更多在这里https://dev.guardianproject.info/projects/trustedintents/wiki – 2014-07-30 18:30:26
如何使用getCallingActivity()?我试着用它来设置这样的文本:'txt.setText(getCallingActivity());'但它显示'null'。我能做些什么才能显示呼叫活动的名称? – 2015-12-13 14:33:50