Android: ¿bajo qué circunstancias aparecería un cuadro de diálogo que causara que onPause () se llame?

Un fragmento del documento Actividades de Android (desplácese hacia abajo a la línea ” vida en primer plano “) dice:

Con frecuencia, una actividad puede onPause() y salir del primer plano, por ejemplo, se llama a onPause() cuando el dispositivo se queda dormido o cuando aparece un cuadro de diálogo .

No entiendo muy bien esto. ¿Bajo qué circunstancias debería suceder esto? ¿ onPause() llama solo si el contexto del diálogo en cuestión es diferente de la actividad sobre la cual se mostrará el diálogo?

EDITAR: Agregar muestra de código para ilustrar mi duda en detalle

Siguiendo la cita del documento mencionada anteriormente, ¿debería onPause() método onPause() mi actividad cuando se AlertDialog el AlertDialog (o solo el AlertDialog Dialog ) en el siguiente código? ¿Debo ver la entrada de registro “onPause called” cuando se muestra el cuadro de diálogo?

Pero no veo que eso suceda. ¡Y tampoco debería hacerlo si entendí correctamente el ciclo de vida de Android! Entonces, ¿a qué apunta el documento?

 public class LifeCycleTestActivity extends Activity { private static final String TAG = "LifeCycleTest"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "onClick"); AlertDialog dialog = new AlertDialog.Builder(LifeCycleTestActivity.this).create(); dialog.setMessage("You Clicked on the button"); dialog.setTitle("Dialog!"); dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.setCancelable(true); dialog.show(); /* Dialog dialog = new Dialog(LifeCycleTestActivity.this); dialog.setTitle("Dialog!"); dialog.setCancelable(true); dialog.show(); */ } }); } @Override protected void onPause() { Log.d(TAG, "onPause() called"); super.onPause(); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume() called"); } } 

se llama a onPause() cuando su actividad ya no se encuentra en la parte superior de la stack de actividades. Un cuadro de diálogo en sí mismo no es una actividad, por lo que no reemplazará la actividad actual en la parte superior de la stack, por lo que no hará que nada se detenga.

Sin embargo, un cuadro de diálogo no necesita implementar un diálogo (minúsculas). Por ejemplo, no es raro implementar uno con una Actividad cuyo tema está configurado como el de un diálogo. En este caso, mostrar el diálogo como una Actividad hará que la nueva Actividad esté en la parte superior de la stack, pausando lo que previamente estaba allí.

He estado haciendo un montón de código con diálogos, incluido el AlertDialog que mencionas, y también he intentado verificar si se onPause() sobre la actividad cuando aparece el diálogo, pero hasta ahora mi conclusión es que la actividad simplemente sigue ejecutándose y que no se llama a onPause() .

No estoy seguro de si ayuda, pero al menos ahora sabe que hay otros que experimentan lo que está experimentando 🙂

Es incorrecto que la actividad ya no esté en la parte superior de la stack de actividades en la fase onPause.

Condicione una actividad para estar en estado de Pausa –

  • Actividad parcialmente visible, por ejemplo, diálogo sobre la actividad.
  • El objeto Activity se conserva en la memoria, mantiene toda la información de estado y miembros, y permanece adjunto al administrador de ventanas.

    por ejemplo, el botón Inicio presionado hace que la actividad entre en Pausa (). Aún en la cima de la stack.

En la figura 1. Activity3 se destruirá y se eliminará de la stack superior

En la figura 2. Ahora, la Tarea A va al fondo, pero la Actividad X sigue en la parte superior de la stack. Si anula el método onPause () en este estado

enter image description here

Figura 1. Una representación de cómo cada actividad nueva en una tarea agrega un elemento a la stack posterior. Cuando el usuario presiona el botón Atrás, la actividad actual se destruye y la actividad anterior se reanuda.

enter image description here

Figura 2. Dos tareas: la Tarea B recibe la interacción del usuario en primer plano, mientras que la Tarea A está en el fondo, esperando a que se reanude.

Creo que recuerdo haber leído en una versión anterior del Android Lifecycle que se llamó a OnPause cuando no se exhibía ninguna de las actividades. es decir, si un poco de tu actividad aún es visible en una ventana emergente, no se invocará OnPause.

Tal vez algunos otros expertos pueden responder por este comportamiento?

En mi experiencia un poco rara en onResume se llama con dialog.setCanceledOnTouchOutside(true); pero onPause nunca se llama.

Dicho esto, creo que la documentación podría centrarse en los cuadros de diálogo del sistema (por ejemplo, bajo en batería).

@hackbot

se llama a OnPause () cuando tu actividad ya no está en la parte superior de la actividad> stack. Un cuadro de diálogo en sí mismo no es una actividad, por lo que no reemplazará la actividad> actual en la parte superior de la stack, por lo que no hará que nada se detenga.

todo depende de la implementación …

¿Qué es un Diálogo? es una ventana agregada a Display por WindowManager /// para que la ventana cuando se muestra esté encima de todo … (orden Z)

qué es actividad … es “cosa” que también crea su ventana

cuando se muestra un cuadro de diálogo o su ventana aparece sobre una actividad existente, se anula parcialmente la ventana de actividad, por lo que la actividad existente se moverá a un estado parcialmente invisible y obtendrá una llamada a OnPause () desde ActivityThread .

pero para estar seguro también tenemos que considerar aquí un pensamiento …

el estado de la ventana si se muestra una ventana independiente en la parte superior o es una ventana secundaria y una de sus páginas principales es una ventana de actividad.

así que cuando lo sepamos

  • Window.LayoutParams (FLAGS) que utilizamos para agregar
  • y qué IBinder se usa para que aparezca la Ventana

Conoceremos cómo se comportará la actividad cuando se muestren las ventanas una sobre la otra … ya que cada winndow tiene una callback que la actividad o el diálogo utiliza para gestionar sus estados …

componentes involucrados:

  • android.os.IBinder

  • android.view.Window

  • android.view.Window.Callback

  • android.view.WindowManager

  • android.view.WindowManager.LayoutParams

  • android.view.Display

por cierto:

si quiere saber las ventanas en la pantalla [aplicable solo para el proceso que posee – como la ventana pertenece al proceso y esas son Sandboxed – cada proceso es una JVM separada que dice “ART”] puede usar una replección ver:

  • android.view.WindowManagerImpl
  • android.view.WindowManagerGlobal

onPause() se onPause() cada vez que una actividad pasa a segundo plano y el cuadro de Dialog u otra Activity aparece en primer plano. Esto se hace para dar prioridad a algo con lo que el usuario está interactuando. Por ejemplo: supongamos que está en la pantalla de inicio (que a su vez es una actividad) de una aplicación, se dice que la pantalla de inicio está en foreground . y cuando va a la siguiente pantalla presionando un botón o aparece un cuadro de diálogo, la siguiente screen/Activity/Dialog aparece en primer foreGround y la pantalla de inicio va a retroceder, lo que significa que se llamó al método onPause() de onPause() .