¿Cómo encontrar la fuente de intención en Android? [duplicar]


Posible Duplicado:
Android: ¿Cómo obtener el remitente de una Intent?

¿Hay alguna forma en Android de encontrar la actividad de origen que activa una INTENT (en la actividad de destino)?

El escenario es que tengo dos actividades A y B. Ambas disparan una intención de llamar a la actividad C. La actividad C muestra información adicional basada en su fuente. Eg. Si la llamada proviene de A, entonces C muestra solo 2 vistas de texto, mientras que en el caso de la intención disparada por B la actividad C muestra 3 vistas de texto (básicamente más información basada en quién es el llamante).

Para establecer esto I necesita saber quién disparó la intención llamando a C. ¿Cómo hago esto?

Author: Community, 2011-01-25

4 answers

Una mejor manera de hacer esto sería usar Intent extras para pasar parámetros al receptor.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-25 01:52:40

Si miramos la Intención.clase java, podemos ver los miembros solo incluidos

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;

No creo que ninguno de estos miembros incluya información del remitente, dando la respuesta a la pregunta no. No podrías hacer esto por una intención arbitraria.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-30 23:11:59

¿Podría considerarse esto una solución alternativa?

Haga que A & B llame a startActivityForResult en lugar de startActivity, entonces puede llamar a getCallingActivity().getClassName() para recuperar la fuente.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-27 00:57:08

Si la aplicación C tiene el permiso GET_TASKS, puede ver cuál fue la tarea más reciente.

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

En mis pruebas, encontré que baseIntent en la parte superior de la pila de tareas reciente era el identificador más confiable. Hay más discusión sobre por qué es posible que no desee hacer esto en https://stackoverflow.com/a/12376775/1135142

Supongo que si tienes algún control sobre A y B, podrías hacer que pidan un resultado como ya se mencionó.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:42