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:
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?
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.
Vous avez besoin d'un verrouillage de réveil partiel.
Exemple détaillé ici dans une question précédente:
J'utilise juste un service d'avant-garde.