Android: récepteur de diffusion pour écran et écran éteint

Je me demandais s’il est possible d’enregistrer un récepteur de diffusion qui détecte Screen ON / OFF dans le manifeste de l’application. La raison pour laquelle je n’aime pas la méthode programmable est que l’application est en cours d’exécution pour détecter une telle chose, alors que: “Les applications avec des récepteurs de diffusion enregistrés dans le manifeste n’ont pas besoin d’être exécutées lorsque l’intention est diffusion pour que les récepteurs s’exécutent “(source: livre professionnel sur le développement d’applications Android 2)

Mon application est en fait une application lockscreen qui, en utilisant la méthode programmable, doit être exécutée tout le temps: S

Y a-t-il un moyen de contourner cela?

J’essaie ce qui suit dans le manifeste:

      

et simple classe 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(); } } } 

Les deux actions pour l’activation et la désactivation de l’écran sont les suivantes:

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

Mais si vous enregistrez un récepteur pour ces émissions dans un manifeste, le récepteur ne recevra pas ces émissions.

Pour ce problème, vous devez créer un service de longue durée qui enregistre un récepteur de diffusion local à ces fins. Si vous procédez ainsi, votre application ne recherchera l’écran que lorsque votre service est en cours d’exécution, ce qui n’irritera pas l’utilisateur.

PS: lance le service en premier plan pour le faire fonctionner plus longtemps.

Un extrait de code simple sera quelque chose comme ceci:

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

N’oubliez pas de désenregistrer le destinataire dans le onDestroy du service :

 unregisterReceiver(mScreenStateReceiver); 

Juste au cas où des personnes se demanderaient pourquoi le récepteur ne fonctionne pas avec les émissions de déclaration dans le manifeste pour ACTION_SCREEN_ON et 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

Vous ne pouvez pas recevoir cela via les composants déclarés dans les manifestes, mais uniquement en vous enregistrant explicitement avec Context.registerReceiver ().

Il s’agit d’une intention protégée qui ne peut être envoyée que par le système.

Vous devez créer un service d’arrière-plan pour le vérifier. Ensuite, vous pouvez le définir par programmation.