Detectar el evento "botón de inicio presionado" en el servicio android que muestra una interfaz de usuario (similar a los cabezales de chat de Facebook)

En facebook chatheads, que son parte de la aplicación de mensajería de Facebook, me di cuenta del siguiente comportamiento: Por lo que puedo ver, la cabeza de chat en sí y la pantalla de chat abierto son partes de un servicio. No hay actividad.

¿Como puedo estar seguro? Después de presionar a casa en la pantalla abierta de chat, se minimiza de nuevo a una cabeza de chat, y puedo reabrir de inmediato la pantalla de chat. Si la pantalla de chat era una actividad, reabrir la actividad a través de startActivity(intent) después de presionar el botón de inicio, retrasaría el inicio de la actividad, como se especifica aquí: Inicio de una actividad de un servicio después de pulsar el botón HOME sin los 5 segundos retrasar

Y aquí: ¿ Razón por 5 segundos de demora para mostrar una actividad al presionar el botón de inicio?

En mi método onCreate del servicio, utilizo el código siguiente para exhibir una interfaz de usuario del servicio:

 public class ServiceTest extends Service { ... @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); windowManager.addView(someView, params); } .... } 

¿Alguien tiene una idea de cómo puedo recibir el evento "botón de inicio pulsado" directamente desde un servicio que muestra una interfaz de usuario? Me gustaría minimizar mi vista (similar a las cabezas de chat de Facebook) cuando el usuario presiona el botón de inicio.

8 Solutions collect form web for “Detectar el evento "botón de inicio presionado" en el servicio android que muestra una interfaz de usuario (similar a los cabezales de chat de Facebook)”

Bien después de hacer mi propia investigación sobre ese tema, he llegado con las siguientes conclusiones:

Facebook "interceptar" los botones de navegación proporcionando el atributo TYPE_SYSTEM_OVERLAY bandera. Mire en esta respuesta del poste proporcionada por @jawsware

Haciendo lo que él aconseja no hacer – conducirá al "afecto" de controlar los botones de navegación

Usar esta bandera proporciona el foco en su superposición, y toma el foco de la actividad detrás.

Con la onFocusChangedListener devolución de llamada onFocusChangedListener o el oyente OnKey que reacciona a ella con el cierre del modo de pantalla completa de la superposición.

Que también explica cómo reaccionan a él desde los 3 botones de navegación – inicio / atrás / tareas recientes

Puede lograrlo reemplazando View.onCloseSystemDialogs (). Es posible que deba comprobar View.java porque este método no está visible en doc. API.

Obviamente, no podemos detectar 'Botón Inicio presionado' en general. En la mayoría de los casos, la ventana es creada por startActivity (). Y la rutina CloseSystemDialogs, que es causada por 'Botón Inicio presionado', es manejada por la clase interna del framework android, PhoneWindow.DecorView como antepasado de vista de ViewRootImpl. Pero cuando agregamos vistas al encargado de ventana directamente, el antepasado de la visión de ViewRootImpl está siendo nuestra visión de encargo pero PhoneWindow.DecorView. Comprobar el código fuente de ViewRootImpl.java puede ser más fácil de entender.

KeyEvent.KEYCODE_APP_SWITCH causa la rutina de closeSystemDialogs, también. Esto explica cómo funciona facebook chatheads.

Puede supervisar (por ejemplo, comprobar cada 200 ms) la actividad de ejecución máxima y ver si es su actividad o alguna otra actividad y saber cuándo cambia. Esto también le permitirá manejar casos como una llamada entrante.

 ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE); am.getRunningTasks(1).get(0).topActivity... 

Ok completar la edición de mi respuesta,

Anule el método debajo de su actividad.

  @Override public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } 

Después de sobrepasar el método anterior, ahora puede escuchar fácilmente la tecla HOME Key en su actividad usando el método onKeyDown ().

  @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); 

Prueba esta esperanza ayuda

Esta es mi manera. Funciona bien. Ponerlo en la función onReceive ().

 if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } 

Estoy bastante seguro de que Facebook no escucha las pulsaciones de botón de inicio, porque su lógica requiere que los jefes de chat aparezcan independientemente de qué aplicación sea visible, siempre y cuando no sea facebook.

Una manera sencilla y cruda de hacerlo sería mantener un indicador estático visible en su singleton de aplicación y modificarlo desde cada actividad que tenga. En la onPause (), póngala en false , y en onResume () y onCreate () establezca en true .

A continuación, simplemente verifique el estado de esta bandera y actúe en consecuencia. Si es cierto, significa que su aplicación es visible.

Es posible que desee añadir una pequeña pausa antes de actuar sobre ella para evitar que sus vistas inyectadas parpadeen cada vez que se cambia una actividad.

Aquí está trabajando código de ejemplo.

 mLinear = new LinearLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLinear.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLinear); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //params WindowManager.LayoutParams params = new WindowManager.LayoutParams( width, height, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, params); 

Puede agregar la categoría HOME a su archivo de manifiesto.

  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • ¿Cómo saber cuántas aplicaciones se ejecutan en segundo plano en android?
  • ResultReceiver no sobrevive a la rotación de la pantalla
  • Cómo reiniciar el servicio después de que la aplicación sea eliminada de las tareas recientes
  • Servicio de Android: proceso vs. no
  • ¿Puedo iniciarService desde la aplicación # onCreate ()?
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () en CountDownTimer
  • Temporizador de cuenta atrás Android en segundo plano
  • Servicio con cola de prioridad en Android
  • Obtener ubicación GPS a través de un servicio en Android
  • Adquisición de instancia del servicio de fondo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.