¿Cómo obtener el remitente de un intento?

¿Hay alguna manera para que una Activity descubra quién (es decir, el nombre de la clase) ha enviado una Intent ? Estoy buscando una manera genérica para que mi Activity responda a una intención recibida enviándola de vuelta al remitente, quienquiera que sea.

Puede haber otra forma, pero la única solución que conozco es tener Actividad A invocar Actividad B a través de startActivityForResult() . A continuación, la actividad B puede utilizar getCallingActivity() para recuperar la identidad de la actividad A.

Esto no es increíblemente directo, pero puede obtener una lista de las tareas recientes de ActivityManager. Así que el llamador sería esencialmente la tarea antes de la suya y puede obtener información sobre esa tarea.

Ejemplo de uso:

 ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RecentTaskInfo> recentTasks = am.getRecentTasks(10000,ActivityManager.RECENT_WITH_EXCLUDED); 

Lo anterior devolverá una lista de todas las tareas desde la más reciente (suya) hasta el límite especificado. Vea Documentos aquí para el tipo de información que puede obtener de un objeto RecentTaskInfo.

Una técnica que utilizo es requerir que la aplicación envíe la Intención relevante para agregar un PendingIntent como un Parcelable extra; El PendingIntent puede ser de cualquier tipo (servicio, difusión, etc.). Lo único que hace mi servicio es llamar a PendingIntent.getCreatorUid () y getCreatorPackage (); Esta información se rellena cuando se crea PendingIntent y no se puede forjar por la aplicación para que pueda obtener la información sobre el remitente de un Intent. Única advertencia es que la solución sólo funciona desde Jellybean y más tarde, que es mi caso. Espero que esto ayude,

¿Es una aplicación externa de la que recibes la intención? Puede utilizar el método getReferrer() de la clase de actividad

Un ejemplo sencillo : abrí la aplicación google map para compartir una ubicación con mi aplicación mediante la opción de compartir de google maps. Entonces mi aplicación se abre y esta llamada de método en la actividad:

  this.getReferrer().getHost() 

Regresará

  com.google.android.apps.maps 

Consulte la documentación aquí: https://developer.android.com/reference/android/app/Activity.html#getReferrer ()

Generalmente usted no necesita saber esto. Si la actividad que llama utiliza startActivityForResult(Intent, int) , el receptor puede usar setResult(int, Intent) para especificar una intención de enviar de nuevo al llamador. El llamador recibirá este intento en su onActivityResult(int, int, Intent) .

Sobre la base de su pregunta, ya que desea enviar una intención de nuevo al remitente startActivityForResult es una mejor opción de lo que voy a sugerir. Pero necesitaba iniciar la actividad B cuando el usuario hace clic en una notificación y ejecuta algún código en la actividad B sólo si la actividad del remitente es la actividad A. Así es como lo hice de forma sencilla.

Dentro de la Actividad A:

 String senderName = this.getClass().getSimpleName(); Intent clickIntent = new Intent(ActivityA.this, ActivityB.class); clickIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); clickIntent.putExtra("SENDER_CLASS_NAME", senderName); //I use PendingIntent to start Activity B but you can use what you like such as this.startActivity(clickIntent); PendingIntent.getActivity(ActivityA.this, NOTIFICATION_ID, clickIntent, PendingIntent.FLAG_ONE_SHOT); 

Dentro de la Actividad B:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Bundle bundle = getIntent().getExtras(); if (bundle != null) { if(bundle.containsKey("SENDER_CLASS_NAME")){ String senderName = bundle.getString("SENDER_CLASS_NAME"); //Execute some code Log.d("GCM", "Notifications clicked"); } } } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.