[英]How to get the sender of an Intent?
有沒有辦法讓Activity
找出誰(即類名)發送了Intent
? 我正在為我的Activity
尋找一種通用方式來響應接收到的意圖,方法是將一個意圖發送回發件人,無論是誰。
可能還有另一種方法,但我知道的唯一解決方案是讓 Activity A 通過startActivityForResult()
調用 Activity B。 然后活動 B 可以使用getCallingActivity()
來檢索活動 A 的身份。
它是您從中接收意圖的外部應用程序嗎? 您可以使用活動類的getReferrer()
方法
一個簡單的例子:我打開谷歌地圖應用程序,通過使用谷歌地圖的共享選項與我的應用程序共享一些位置。 然后我的應用程序打開並在 Activity 中調用此方法:
this.getReferrer().getHost()
將返回:
com.google.android.apps.maps
請參閱此處的文檔: https : //developer.android.com/reference/android/app/Activity.html#getReferrer()
請注意,這需要 API 22。對於較舊的 Android 版本,請參閱 ajwillliams 的答案
我使用的一種技術是要求應用程序發送相關的 Intent 以添加 PendingIntent 作為 Parcelable extra; PendingIntent 可以是任何類型(服務、廣播等)。 我的服務所做的唯一一件事就是調用 PendingIntent.getCreatorUid() 和 getCreatorPackage(); 此信息在創建 PendingIntent 時填充,應用無法偽造,因此我可以獲得有關 Intent 發件人的信息。 唯一需要注意的是,該解決方案僅適用於 Jellybean,后來就是我的情況。 希望這可以幫助,
這並不是非常直接,但您可以從 ActivityManager 獲取最近任務的列表。 所以調用者本質上是你之前的任務,你可以獲取有關該任務的信息。
用法示例:
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED);
以上將返回從最近(您的)到指定限制的所有任務的列表。 請參閱此處的文檔,了解您可以從 RecentTaskInfo 對象獲取的信息類型。
通常你不需要知道這些。 如果調用 Activity 使用startActivityForResult(Intent, int)
,則被調用者可以使用setResult(int, Intent)
指定要發送回調用者的 Intent。 調用者將在其onActivityResult(int, int, Intent)
方法中接收此 Intent。
根據您的問題,由於您想將意圖發送回發件人 startActivityForResult 是比我要建議的更好的選擇。 但是我需要在用戶單擊通知時啟動活動 B,並且僅當發件人活動是活動 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");
}
}
}
}
就我而言,這里接受的答案和另一個投票最多的答案都不完美。
Activity.getCallerActivity()僅適用於通過startActivityForResult啟動您的活動的發件人,這意味着如果發件人也在您的應用程序中並且您擁有完全控制權,則它可以工作,但並非每個外部應用程序都以這種方式啟動其他應用程序。
另一個投票最多的答案為外部應用程序提供了解決方案,但它也有問題。 首先,我更喜歡getAuthority()而不是getHost() ,其次,如果發件人是瀏覽器類型的應用程序,例如Chrome ,主機和權限都會為您提供瀏覽網頁的地址主機,例如www.google.com ,而不是應用程序本身。 所以要看你怎么定義'sender',如果你要查出是哪個網頁啟動你,權限/主機就夠了,但是如果你需要查出是哪個應用啟動你,恐怕權限/主機就可以了僅當getScheme()為您提供android-app而不是http時才被信任。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.