web-dev-qa-db-fra.com

Comment trouver la source d'intention dans Android?

Duplicata possible:
Android: Comment obtenir l'expéditeur d'une intention?

Existe-t-il un moyen dans Android pour trouver l'activité source qui déclenche une INTENTION (dans l'activité de destination)?

Le scénario est que j'ai deux activités A et B. Les deux déclenchent une intention d'appeler l'activité C. L'activité C affiche des informations supplémentaires en fonction de sa source. Par exemple. Si l'appel provient de A, alors C n'affiche que 2 vues de texte alors que dans le cas d'une intention déclenchée par B, l'activité C affiche 3 vues de texte (essentiellement plus d'informations en fonction de qui est l'appelant).

Pour établir cela, j'ai besoin de savoir qui a tiré l'intention d'appeler C . Comment puis-je faire cela?

36
AKh

Une meilleure façon de procéder serait d'utiliser des extras d'intention pour transmettre les paramètres au récepteur.

27
Romain Guy

Si nous regardons la classe Intent.Java, nous pouvons voir les membres uniquement inclus

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;

Je ne pense pas que l'un de ces membres contienne des informations sur l'expéditeur, ce qui rend la réponse à la question non. Vous ne pouvez pas faire cela pour une intention arbitraire.

26
Justin

Cela pourrait-il être considéré comme une solution de contournement?

Demandez à A & B d'appeler startActivityForResult au lieu de startActivity, alors vous pouvez appeler getCallingActivity().getClassName() pour récupérer la source.

17
Some Noob Student

Si l'application C dispose de l'autorisation GET_TASKS, vous pouvez voir quelle était la tâche la plus récente.

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

Lors de mes tests, j'ai trouvé que baseIntent en haut de la pile de tâches récente était l'identifiant le plus fiable. Il y a plus de discussion sur les raisons pour lesquelles vous ne voudrez peut-être pas le faire dans https://stackoverflow.com/a/12376775/1135142

Je suppose que si vous avez un contrôle sur A et B, vous pourriez leur demander d'appeler un résultat comme déjà mentionné.

4
iHearGeoff