簡體   English   中英

如何獲取 Intent 的發送者?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM