Jak znaleźć Intent source w Androidzie? [duplikat]

Możliwy duplikat:
Android: jak zdobyć nadawcę intencji?

Czy istnieje sposób w Androidzie, aby znaleźć aktywność źródłową, która uruchamia intencję (w aktywności docelowej)?

Scenariusz jest taki, że mam dwie czynności A I B. obie odpalają z zamiarem wywołania czynności C. Ćwiczenie C wyświetla dodatkowe informacje na podstawie źródła. Np. Jeśli wywołanie pochodzi z a to C wyświetla tylko 2 textviews natomiast w przypadku intencji wywołanej przez B ćwiczenie C wyświetla 3 wyświetlenia tekstu(zasadniczo więcej informacji na podstawie tego, kto jest dzwoniącym).

Aby to ustalić, muszę wiedzieć, kto wystrzelił intencję wzywającą C . Jak to zrobić?

Author: Community, 2011-01-25

4 answers

Lepszym sposobem na to byłoby użycie dodatków intencyjnych do przekazywania parametrów do odbiornika.

 26
Author: Romain Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 01:52:40

Jeśli przyjrzymy się intencji.Klasa java, widzimy tylko członków

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;

Myślę, że żaden z tych członków nie zawiera informacji o nadawcy, dając odpowiedź na pytanie nie. Nie mogłeś tego zrobić z arbitralnych intencji.

 22
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-30 23:11:59

Czy można to uznać za obejście?

Mieć wywołanie & B startActivityForResult zamiast startActivity, wtedy możesz wywołać getCallingActivity().getClassName(), aby odzyskać źródło.

 15
Author: Some Noob Student,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-27 00:57:08

Jeśli aplikacja C ma uprawnienia GET_TASKS, możesz zobaczyć, jakie było ostatnie zadanie.

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

W moich testach odkryłem, że baseIntent na górze ostatniego stosu zadań był najbardziej wiarygodnym identyfikatorem. Jest więcej dyskusji o tym, dlaczego nie chcesz tego robić w https://stackoverflow.com/a/12376775/1135142

Przypuszczam, że jeśli masz jakąkolwiek kontrolę nad A i B, możesz poprosić je o wynik, jak już wspomniano.

 3
Author: iHearGeoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:42