android: receptor de difusión para pantalla y pantalla apagada

Me preguntaba si es posible registrar un receptor de transmisión que detecte la activación / desactivación de la pantalla en el manifiesto de la aplicación. La razón por la que no me gusta el método progtwigble es que requiere que la aplicación se ejecute para detectar tal cosa, mientras que: “Las aplicaciones con Receptores de difusión registrados en el manifiesto no tienen que estar ejecutándose cuando el Intento es difusión para que los receptores ejecuten “(fuente: libro de desarrollo de aplicaciones de Android 2 profesional)

Mi aplicación es en realidad una aplicación de locking de pantalla que, al usar la forma progtwigble, debe ejecutarse todo el tiempo: S

¿Hay alguna forma de evitarlo?

Estoy intentando lo siguiente en el manifiesto:

      

y clase simple MyBroadCastReciever:

 public class MyBroadCastReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Log.i("Check","Screen went OFF"); Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show(); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { Log.i("Check","Screen went ON"); Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show(); } } } 

Las dos acciones para activar y desactivar la pantalla son:

 android.intent.action.SCREEN_OFF android.intent.action.SCREEN_ON 

Pero si registra un receptor para estas transmisiones en un manifiesto, entonces el receptor no recibirá estas transmisiones.

Para este problema, debe crear un servicio de larga ejecución, que registra un receptor de difusión local para estos fines. Si lo hace de esta manera, su aplicación buscará la pantalla solo cuando se esté ejecutando su servicio, lo que no irritará al usuario.

PD: inicie el servicio en primer plano para que funcione más tiempo.

Un simple fragmento de código será algo como esto:

 IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(mScreenStateReceiver, screenStateFilter); 

No se olvide de anular el registro del receptor en el Servicio onDestroy :

 unregisterReceiver(mScreenStateReceiver); 

Solo en el caso de personas que preguntan por qué el receptor no funciona con las difusiones declaradas en manifiesto para ACTION_SCREEN_ON y ACTION_SCREEN_OFF:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

No puede recibir esto a través de componentes declarados en manifiestos, solo registrándose explícitamente con Context.registerReceiver ().

Este es un bash protegido que solo puede ser enviado por el sistema.

Necesita crear un servicio en segundo plano para verificarlo. Entonces puede configurarlo programáticamente.