web-dev-qa-db-fra.com

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

Je me demandais simplement s'il était possible d'enregistrer un récepteur de diffusion qui détecte l'écran ON/OFF dans le manifeste de l'application. La raison pour laquelle je n'aime pas la méthode programmable est qu'elle nécessite que l'application soit en cours d'exécution afin de détecter une telle chose, tandis que: "Les applications avec des récepteurs de diffusion enregistrés dans le manifeste ne doivent pas être en cours d'exécution lorsque l'intention est diffusion pour les récepteurs à exécuter "(source: Professional Android 2 livre de développement d'applications)

Mon application est en fait une application à écran de verrouillage 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:

<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>

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();
        }
    }
}
58
himura

Les deux actions pour activer et désactiver 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 de cette façon, votre application ne recherchera l'écran que lorsque votre service sera en cours d'exécution, ce qui n'irritera pas l'utilisateur.

PS: démarrez le service au premier plan pour le faire fonctionner plus longtemps.

Un simple extrait de code ressemblera à 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ésinscrire le récepteur dans le Service onDestroy :

unregisterReceiver(mScreenStateReceiver);

Juste au cas où ceux qui demandent pourquoi le récepteur ne fonctionne pas avec les émissions déclarées en manifeste pour ACTION_SCREEN_ON et 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

Vous ne pouvez pas recevoir cela via des composants déclarés dans des manifestes, 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.

78

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

0
wildapps