Los datos de intención no se borran cuando el usuario presiona el botón de retroceso y luego el botón de las últimas aplicaciones

Estoy desconcertado por este comportamiento que estoy experimentando en una aplicación que estoy desarrollando …

Corto:

Los datos de intención no se borran cuando el usuario presiona el botón de retroceso para salir de la aplicación y luego presiona el botón reciente para volver a ingresar a la aplicación. (En cualquier otro caso, los datos de la intención se borran)

Largo:

Tengo una aplicación con una pantalla de bienvenida que se utiliza para recopilar datos que se pasa de un esquema URI. Luego configuré una intención de reenviar los datos a la actividad principal. La actividad principal tiene fragmentos y se basa en la plantilla maestro / detalle.

Los datos de intención se borran en todos los casos, como presionar el botón de inicio y luego volver a la aplicación, presionando el botón de aplicaciones recientes y luego volver a la aplicación, etc. El único caso en el que los datos de intención no se borran Es cuando el usuario pulsa el botón Atrás y luego el botón de las aplicaciones recientes para volver a la aplicación.

Fragmentos relevantes de código que implican las intenciones:

// Splash Screen Activity @Override protected void onPostExecute(Void result) { // Data is done downloading, pass notice and app ids to next activity Intent intent = new Intent(getBaseContext(), ListActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("id1", id1); intent.putExtra("id2", id2); intent.putExtra("id3", id3); startActivity(intent); finish(); } // ListActivity retrieving intent data Intent intent = getIntent(); if (intent != null) { this.id1 = intent.getExtras().getString("id1"); this.id2 = intent.getExtras().getString("id2"); this.id3 = intent.getExtras().getString("id3"); } // ListActivity clearing intent data @Override public void onPause() { super.onPause(); // Clear intent data Intent intent = getIntent(); intent.putExtra("id1", ""); intent.putExtra("id2", ""); intent.putExtra("id3", ""); } 

Quiero tener en cuenta que también he intentado usar intent.removeExtra ("id1") pero eso tampoco funcionó.

¿Alguna idea de lo que está pasando? Es como si Android mantenga la intención anterior aunque onPause () siempre se llama para borrar los datos de intención.

En realidad esto se debe a Android a partir de la aplicación de la historia por lo tanto, los extras de la intención todavía están allí

Refiérase a estas preguntas Android: Iniciar la aplicación de 'aplicaciones recientes' comienza con el último conjunto de extras utilizados en una intención

Por lo que añadir este condicional para manejar este caso especial lo arregló para mí

 int flags = getActivity().getIntent().getFlags(); if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { // The activity was launched from history // remove extras here } 

Creo que la diferencia aquí es que la tecla Atrás realmente está causando que tu actividad finalice, ya que cuando presiona Inicio causa que tu actividad esté pausada, pero no terminada.
Por lo tanto, cuando su proceso se vuelve al frente en el caso de inicio, simplemente está reanudando una instancia de actividad ya existente, mientras que en el caso de Back, el sistema está instanciando una nueva copia de su actividad, llamando onCreate() y entregándola Una copia nueva de la última Intención registrada para esa actividad.

En onPause() usted está borrando los extras en una " copia " de la Intent . Puedes intentar agregar

 setIntent(intent); 

A onPause() después de haber borrado los extras (aunque llamar a removeExtra() probablemente también funcionaría en lugar de configurar extras para vaciar cadenas).

NOTA: Sin embargo, sugeriría que este diseño es defectuoso. No debe utilizar el Intent para realizar un seguimiento del estado en su aplicación. Debe guardar un estado en las preferencias compartidas, ya que esto sobrevivirá a que la aplicación se esté eliminando / reiniciando, a reiniciar el teléfono o lo que sea.

El problema es que no se persiste el nuevo Intent , de modo que si el usuario presiona el botón HOME y su aplicación va al fondo y Android mata su aplicación porque no está activa, cuando el usuario regrese a la aplicación, Android creará Un nuevo proceso para su aplicación y recreará la actividad usando el Propósito original .

Además, si lee la documentación de getIntent() , indica que devuelve el Intent que inició la actividad .

Para solucionar el problema que estaba enfrentando, opté por utilizar SharedPreferences como un medio para pasar datos entre actividades.

Sé SharedPreferences no suele utilizarse para este propósito, pero resolvió mi problema y funciona.

  • ¿Cuáles son las diferencias entre FLAG_ACTIVITY_RESET_TASK_IF_NEEDED y FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP?
  • Uso de FLAG_SHOW_WHEN_LOCKED con disableKeyguard () en la pantalla de bloqueo segura de Android
  • La intención de vinculación profunda no funciona
  • WidgetProvider Los extras de intención enviados con el botón de clic no se encuentran en onReceive
  • Temporizador de cuenta atrás de Android hasta la fecha
  • Detectar cuándo un dispositivo USB está separado en Android
  • WhatsApp envía un mensaje a un grupo en particular a través de la intención
  • Seleccione varios archivos con Intent.ACTION_GET_CONTENT
  • Intent.getExtras () devuelve siempre null
  • Intención no se restaura correctamente después de que se cancela la actividad si se suministran banderas superiores e individuales
  • Problema con la Iniciativa Web de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.