Mantenga la actividad en ejecución sobre el bloqueo de pantalla cuando las pantallas se alargan

Así que construí una aplicación que funciona como un reemplazo de pantalla de bloqueo. Utilizo un receptor de difusión y un servicio para iniciar mi actividad después de Intent.ACTION_SCREEN_OFF . Así que cada vez que el usuario bloquea la pantalla de mi actividad se inicia, entonces cuando presionan el botón de desbloqueo de mi actividad ya se está ejecutando sobre la pantalla de bloqueo. Pero esto sólo funciona si el usuario intenta despertar / desbloquear el teléfono después de un corto período de tiempo. Si esperan demasiado, la actividad ha desaparecido. No estoy seguro de por qué esto está sucediendo y lo que puedo hacer para mantener la actividad allí no importa cuánto tiempo el usuario espera para tratar de desbloquear su teléfono.

Pensé en y traté de escuchar Intent.ACTION_SCREEN_ON pero luego hay un retraso entre el momento en que el usuario pulsa el botón de encendido en su teléfono para despertarlo y cuando la aplicación se carga y aparece en la pantalla. Durante esta brecha el usuario puede ver el sistema operativo Android

¿Qué pasa si usas un wakelock . Por ejemplo:

 @Override public void onCreate(Bundle savedInstanceState) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); wl.acquire(); // do your things, even when screen is off } @Override protected void onDestroy() { wl.release(); } 

También debe tener un permiso wakelock es AndroidManifest.xml

 uses-permission android:name="android.permission.WAKE_LOCK" 

Una forma de intentarlo es asegurarse de que la aplicación nunca duerme. En los sueños cortos permanecerá funcionando. En sueños largos su aplicación en sí está dormido. Pude conseguir alrededor de esto yo mismo con usar el PowerManager.Wakelock. El único problema es que esto agotará más batería si su aplicación está utilizando ciclos de CPU.

 /** wake lock on the app so it continues to run in background if phone tries to sleep.*/ PowerManager.WakeLock wakeLock; @Override public void onCreate(Bundle savedInstanceState) { ... // keep the program running even if phone screen and keyboard go to sleep PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); ... } // use this when screen sleeps wakeLock.acquire(); // use this once when phone stops sleeping wakeLock.release(); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.