Averigüe si la actividad actual será la raíz de la tarea eventualmente, después de que las actividades de acabado pendientes hayan desaparecido

Si FirstActivity es la raíz de la tarea y se termina por sí mismo y lanza SecondActivity , entonces llamando isTaskRoot() en SecondActivity inmediatamente devolverá false , porque el FirstActivity de FirstActivity ocurre de forma asíncrona y, por lo tanto, no se realiza todavía. Esperando un segundo y luego llamando isTaskRoot() devuelve true.

 public class FirstActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); finish(); startActivity(new Intent(this, SecondActivity.class)); } } 
 public class SecondActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onResume() { super.onResume(); ((TextView)findViewById(R.id.tv1)) .setText("isTaskRoot() in onResume(): " + isTaskRoot()); new Handler().postDelayed(new Runnable() { @Override public void run() { ((TextView)findViewById(R.id.tv2)) .setText("isTaskRoot() after 1s: " + isTaskRoot()); } }, 1000); } } 

Captura de pantalla del resultado

¿Hay una manera de …

  • (De forma óptima) averiguar si la actividad será la raíz de la tarea con el tiempo , o,

  • (Mejor que nada) obtener algún tipo de notificación / devolución de llamada una vez que la tarea está en su estado "final" y por lo tanto isTaskRoot() devolverá la "verdad"?

He tenido un problema similar y quería control estricto sobre exactamente quién es la actividad de la raíz. En mi caso, la raíz sólo podría ser una de mis propias actividades (no de terceros), así que pude usar el siguiente enfoque:

He extendido la clase de Application , he añadido una referencia débil a una actividad llamada currentRootActivity y currentRootActivity añadido getter y setter sincronizados.

Entonces yo manejé este estado por mí mismo cuando las actividades fueron creadas / destruidas. Mi caso de uso fue un poco especial porque estaba buscando para reemplazar una raíz con otra, así que sabía exactamente dónde reiniciar mi nueva variable de estado, pero estoy bastante seguro de que puede hacer lo mismo.

Incluso pude agregar esta lógica de estado en una clase base compartida para todas mis actividades. Así que esto no fue tan asqueroso como suena 🙂

Como se menciona en los comentarios, el método de actividad es isFinishing también podría ser útil.

Tratar:

 Intent intent = new Intent(this, SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Espero que esto hará que SecondActivity sea la actividad raíz.

  • Actividad de anulación del proyecto de la Biblioteca de Android
  • OnActivityResult Con launchMode = "singleTask"?
  • Android: startActivityForResult & setResult para una clase de vista y una clase de actividad
  • Deslice la actividad
  • "Estado persistente" vs. "estado actual"
  • Iniciar nueva actividad después de escribir en la etiqueta NFC
  • Android activity-reset después de tomar fotos (orientación?)
  • Appcompat-v7: vista personalizada no alineada correctamente en ActionBar
  • Cómo llamar a recreate ()?
  • No hay animación para Android al pasar de una actividad de retrato a una actividad de paisaje
  • En Android cada pantalla debe ser su propia actividad o diseño?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.