studio - start broadcast receiver android
android: receptor de difusión para pantalla y pantalla apagada (2)
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 intento protegido que solo puede ser enviado por el sistema.
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 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 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 bloqueo de pantalla que, al usar la forma programable, debe ejecutarse 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 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();
}
}
}
Necesita crear un servicio en segundo plano para verificarlo. Entonces puede configurarlo programáticamente.