android: receptor de transmisión para pantalla encendida y apagada

Resuelto himura asked hace 54 años • 2 respuestas

Me preguntaba si es posible registrar un receptor de transmisió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 esté ejecutándose para detectar tal cosa, mientras que: "Las aplicaciones con receptores de transmisión registrados en el manifiesto no tienen que estar ejecutándose cuando la intención es transmisión para que los receptores la ejecuten" (fuente: libro Desarrollo profesional de aplicaciones Android 2)

Mi aplicación es en realidad una aplicación de pantalla de bloqueo que, al utilizar la forma programable, debe estar ejecutándose todo el tiempo: S

¿Hay alguna 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 clase MyBroadCastReciever simple:

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();
        }
    }
}
himura avatar Jan 01 '70 08:01 himura
Aceptado

Las dos acciones para encender y apagar la pantalla son:

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

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

Para solucionar este problema, debe crear un servicio de larga duración, que registre un receptor de transmisión local para estos propósitos. Si lo hace de esta manera, su aplicación buscará la pantalla apagada solo cuando su servicio se esté ejecutando, lo que no irritará al usuario.

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

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

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

No olvide cancelar el registro del receptor en el servicio onDestroy :

unregisterReceiver(mScreenStateReceiver);

Por si acaso para las personas que preguntan por qué el receptor no funciona con las transmisiones declaradas en el 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().

Esta es una intención protegida que solo puede enviar el sistema.

Sadeshkumar Periyasamy avatar Feb 28 '2012 07:02 Sadeshkumar Periyasamy