可能性のある複製:
Android:インテントの送信者を取得する方法?
Android(宛先アクティビティで)INTENTを起動するソースアクティビティを見つける方法)はありますか?
このシナリオでは、2つのアクティビティAとBがあります。どちらもアクティビティCを呼び出すインテントを起動します。アクティビティCは、ソースに基づいて追加情報を表示します。例えば。コールがAからのものである場合、Cは2つのテキストビューのみを表示しますが、Bによってインテントが発動された場合、アクティビティCは3つのテキストビューを表示します(基本的には誰が発信者であるかに基づいてより多くの情報)。
これを確立するには、誰がCを呼び出すインテントを実行したかを知る必要があります。どうすればよいですか?
これを行うためのより良い方法は、Intentエクストラを使用してパラメーターをレシーバーに渡すことです。
Intent.Javaクラスを見ると、メンバーのみが含まれていることがわかります。
private String mAction;
private Uri mData;
private String mType;
private String mPackage;
private ComponentName mComponent;
private int mFlags;
private HashSet<String> mCategories;
private Bundle mExtras;
これらのメンバーには送信者情報が含まれていないと思います。質問の答えは「いいえ」です。これを任意の目的で行うことはできません。
これは回避策と見なされますか?
AとBがstartActivityForResult
ではなくstartActivity
を呼び出すようにすると、getCallingActivity().getClassName()
を呼び出してソースを取得できます。
アプリCにGET_TASKS権限がある場合は、最新のタスクを確認できます。
ActivityManager man = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RecentTaskInfo> list = man.getRecentTasks(1, 0);
//You might want to check if(list.size() > 0)
Intent caller = list.get(0).baseIntent;
//look at caller.getComponent() for the package and class
私のテストでは、最近のタスクスタックの最上位にあるbaseIntentが最も信頼できる識別子であることがわかりました。 https://stackoverflow.com/a/12376775/1135142 にこれを実行したくない理由についての詳細な議論があります。
もしあなたがAとBをコントロールできれば、すでに述べたように結果を要求することができるでしょう。