2012-02-28 16 views
49

Me preguntaba si es posible registrar un receptor de difusión que detecte la pantalla ON/OFF en el manifiesto de la aplicación. La razón por la que no me gusta el método programable 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 la intención es transmitido por los receptores de ejecución"(fuente: Profesional Android libro de desarrollo 2 Aplicación)android: receptor de difusión para pantalla y pantalla

Mi aplicación es en realidad una aplicación de pantalla de bloqueo, que mediante el uso de la forma programable deberá estar funcionando todo el tiempo: S

¿es Hay una forma de evitarlo?

Estoy intentando lo siguiente en el manifiesto:

<receiver android:name=".MyBroadCastReciever"> 
    <intent-filter> 
     <action android:name="android.intent.action.SCREEN_OFF"/> 
     <action android:name="android.intent.action.SCREEN_ON"/> 
    </intent-filter> 
</receiver> 

y simple clase 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(); 
     } 
    } 
} 
+0

¿me puede dar una muestra que funcione? Quiero hacer algo cuando bloqueo o desbloqueo de pantalla. –

Respuesta

66

Los dos recursos de pantalla de encendido y apagado 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 s.

Para este problema, debe crear un servicio de larga ejecución, que está registrando 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 's OnDestroy:

unregisterReceiver(mScreenStateReceiver); 

Por si acaso para las 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_ONhttps://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

no puede recibir esto a través de los componentes declarados en los manifiestos, sólo se registrándose explícitamente para ello con Context.registerReceiver().

Esta es una intención protegida que solo puede ser enviada por el sistema.

+4

bien, entonces no hay forma de evitarlo? ¿Así es como se hacen las aplicaciones de bloqueo de pantalla? – himura

+4

excelente respuesta, pero ¿por qué el receptor no funciona para estas transmisiones en manifiesto? –

+1

Si pudiera escuchar ACTION_SCREEN_OFF en el manifiesto, el sistema operativo tendría que iniciar un nuevo proceso para su aplicación si no se estaba ejecutando cuando se activó la transmisión. Los diseñadores de Android querían evitar esto, ya que a menudo implica que el dispositivo está a punto de entrar en un estado de baja energía. –

0

Necesita crear un servicio de fondo para comprobarlo. Entonces puede configurarlo programáticamente.

Cuestiones relacionadas