web-dev-qa-db-ja.com

Androidでインテントソースを見つける方法

可能性のある複製:
Android:インテントの送信者を取得する方法?

Android(宛先アクティビティで)INTENTを起動するソースアクティビティを見つける方法)はありますか?

このシナリオでは、2つのアクティビティAとBがあります。どちらもアクティビティCを呼び出すインテントを起動します。アクティビティCは、ソースに基づいて追加情報を表示します。例えば。コールがAからのものである場合、Cは2つのテキストビューのみを表示しますが、Bによってインテントが発動された場合、アクティビティCは3つのテキストビューを表示します(基本的には誰が発信者であるかに基づいてより多くの情報)。

これを確立するには、誰がCを呼び出すインテントを実行したかを知る必要があります。どうすればよいですか?

36
AKh

これを行うためのより良い方法は、Intentエクストラを使用してパラメーターをレシーバーに渡すことです。

27
Romain Guy

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;

これらのメンバーには送信者情報が含まれていないと思います。質問の答えは「いいえ」です。これを任意の目的で行うことはできません。

26
Justin

これは回避策と見なされますか?

AとBがstartActivityForResultではなくstartActivityを呼び出すようにすると、getCallingActivity().getClassName()を呼び出してソースを取得できます。

17

アプリ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をコントロールできれば、すでに述べたように結果を要求することができるでしょう。

4
iHearGeoff