web-dev-qa-db-fra.com

Comment puis-je faire fonctionner mon service Android lorsque l'écran est éteint?

Lorsque l'écran s'éteint, mon service d'application est suspendu.

Je démarre mon service avec le code suivant:

if (mSharedPrefs.getBoolean("prefAutoUpdatesMain", false)) {
     Intent svc = new Intent(this, MyService.class);
     startService(svc);
}

Comment puis-je éviter la pause de service?


Ce que je dois faire dans MyService est de télécharger des données depuis Internet. Si je comprends le processus que je dois suivre est:

  1. Acquérir wakeLock
  2. Télécharger les données
  3. Relâchez wakeLock

Dans la méthode de téléchargement des données, il n'y a aucune référence à wakeLock, c'est l'application pour avoir le wakeLock, est-ce correct?

Les verrous de réveil sont comptés par défaut par référence. Je pense qu'il vaut mieux un wakeLock sans comptage de référence, pour être sûr de le libérer, je me trompe?

47
kristby

Un WakeLock partiel est ce que vous voulez. Il maintiendra le CPU ouvert, même si l'écran est éteint.

Acquérir:

PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();

Pour libérer:

wakeLock.release();

WakeLock prend également en charge le comptage des références afin que vous puissiez avoir plusieurs éléments dans votre service qui nécessitent une fonctionnalité de réveil, et l'appareil peut se mettre en veille lorsqu'aucune d'entre elles n'est active.

À surveiller:

Si vous utilisez le comptage de références, assurez-vous que tous les chemins de contrôle à travers votre application seront correctement acquis/libérés ... enfin les blocs sont utiles ici.

Assurez-vous également de tenir WakeLocks rarement et pendant de courtes périodes. Ils s'additionnent en termes d'utilisation de la batterie. Acquérir votre serrure, faire vos affaires et libérer le plus tôt possible.

65
jscharf

Vous avez besoin d'un verrouillage de réveil partiel.

Exemple détaillé ici dans une question précédente:

Wake locks Android service recurrent

3
CL22

J'utilise juste un service d'avant-garde.

1
stefan