2012-01-20 14 views
8

Hola Stackoverflowers (lo sé, eso no suena como debería ...)En Android, se muestra cómo detectar un cuadro de diálogo del sistema (opciones de energía, aplicaciones recientes, batería baja ...)?

Bueno, creo que es casi todo en la pregunta: me gustaría detectar cualquier cosa que hace que la visualización de mi actividad para obtener incluso parcialmente oculto, por ejemplo opciones de energía, bandeja de aplicaciones recientes, notificación de batería baja, etc. ... y estoy teniendo dificultades para detectar estos eventos del sistema.

Estaba bastante seguro de que se llamaría a OnPause() cuando suceden tales eventos, pero parece estar equivocado ... ¿o soy yo?

¿Alguna otra idea? ... Preferiría no engancharme a cada acción de transmisión del sistema individualmente, ya que me gustaría ser lo más genérico posible (y reaccionar ante CUALQUIER COSA que oculte mi Actividad).

¡Gracias por cualquier entrada!

+1

Extraño. Según los documentos * onPause() * debería ser el camino a seguir: "En pausa: otra actividad está en primer plano y tiene foco, pero esta aún es visible.Es decir, otra actividad es visible encima de esta y esa actividad es parcialmente transparente o no cubre toda la pantalla. " – JimmyB

+0

Sí, creo que onPause() debería funcionar como usted quiera. ¿No está funcionando de esa manera para Si es así, ¿en qué dispositivo estás? ¿Y qué cuadros de diálogo del sistema has visto específicamente que no activen tu onPause()? – FoamyGuy

+0

Tan incrédulo como ustedes, pero estoy probando en una amplia gama de dispositivos (HTC/Samsung/Sony Ericsson) ninguno de los cuales llama a Pausa() cuando hago clic largo en el botón de encendido o el botón de inicio. Sin embargo, se invoca a OnPause() si solo hago clic en ellos. Me gana ... – Wouzz

Respuesta

0

Estaba bastante seguro de que se llamaría a OnPause() cuando suceden tales eventos, pero parece estar equivocado ... ¿o soy yo?

onPause() se llamará si otra actividad se hace cargo de la entrada de primer plano. Por lo tanto, si una aplicación de terceros aparece en primer plano, incluso con una actividad con tema de diálogo, se invocará onPause().

No es necesario llamar a onPause() desde los componentes del sistema operativo.

que preferiblemente no había gancho en cada acción de difusión del sistema de forma individual, ya que me gustaría ser tan genérico como sea posible (y reaccionar a cualquier cosa que esconde mi actividad).

Lo que desea no es posible. No todas las cosas que lista han emitido Intents, y hay otras técnicas que las personas pueden usar (por ejemplo, Toasts) que oscurecerán parte de su actividad de la cual no tendrán conocimiento.

+0

Hi CommonsWar e, gracias por su respuesta :) Buen punto, en realidad no tengo que preocuparme por las Tostadas. Pero me resulta extraño que no podamos reaccionar a los eventos que muestran capas de pantalla completa, como la bandeja de "aplicaciones recientes" o la de "opciones de energía", que incluso borran y oscurecen el fondo ... Tal vez pueda explicar mi caso de uso específico: trabajo en un reproductor de video, y todo lo que quiero hacer es detener la reproducción cuando el usuario no puede verla. ¿Es demasiado pedir? ... – Wouzz

+1

@Wouzz: imagino que es en parte una medida de seguridad, por lo que el malware no detecta estos eventos y muestra sus propios detalles sobre los demás. un intento de engañar a los usuarios. Si bien tu objetivo es noble, simplemente me centraré en una buena opción conveniente de rebobinar por 10 segundos, para que los usuarios que sientan que se perdieron algo puedan retroceder fácilmente en el tiempo. – CommonsWare

7

trabajando en una aplicación estilo kiosco Sé que algunos diálogos llegan al primer plano y pueden ser detectados por

ActivityManager activityManager = (ActivityManager)getBaseContext() 
     .getSystemService(Activity.ACTIVITY_SERVICE); 
    String className = activityManager.getRunningTasks(1).get(0).topActivity.getClassName(); 

Un ejemplo de ello es el diálogo Enlace Bluetooth que trae los com.android.settings al primer plano.

Un contraejemplo es el diálogo del botón de encendido (Apagar, Reiniciar, etc.) que no aparece en primer plano.

Tenga en cuenta que se puede cerrar los cuadros de diálogo del sistema (incluso el diálogo del botón de encendido) con esta emisión:

Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
     sendBroadcast(closeDialog); 

Pero en la mayoría (¿todos los nuevos) dispositivos de esta presentación será incluso cerrar el teclado de software, por lo que no es aconsejable tener un servicio en ejecución que frecuentemente lo envía ya que el usuario no podrá ingresar nada en un campo de texto.

Tenga en cuenta que este comportamiento definitivamente gratificará su aplicación como un malware, evitando que se publique en google play.

Cuestiones relacionadas