5

Bonjour J'essaie d'utiliser un service pour contrôler un wakelock afin de pouvoir laisser l'écran allumé en permanence lorsque mon application est en cours d'exécution. Je crée le wakelock et l'active dans onCreate() et le libère dans onDestroy() mais j'ai l'erreur "wl ne peut pas être résolu". Quelqu'un peut-il expliquer comment je peux surmonter cela? Code ci-dessous:Utilisation d'un wakelock dans un service Android 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

Répondre

5

N'êtes-vous pas manquer la ligne

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

dans OnDestroy()? C'est une variable locale dans onCreate(), mais elle n'est pas du tout déclarée dans onDestroy().

Ou, plus probable, vous pouvez en faire un champ de classe WakeLockService au lieu d'une variable locale.

9

Eh bien, même si vous utilisiez une variable d'instance, je pense que ce n'est pas la façon de le faire. Qui va appeler destroy()? J'espère que non, c'est le travail d'OS pour le faire. Mais lorsque vous maintenez un verrou de sillage, il est hautement improbable que votre méthode destroy() soit appelée, car le système d'exploitation va d'abord détruire d'autres activités/services. En outre, il est trop tard pour acquérir le verrou de sillage dans la méthode onCreate(). Avant d'atteindre le onCreate(), le téléphone est peut-être déjà allumé lorsque vous déclenchez le service à partir d'une alarme par rapport à une activité en arrière-plan.

Il est difficile de dire ce que vous devriez faire différemment car vous ne donnez pas beaucoup de contexte. Le cours habituel des événements est celui-ci. Un BroadcastReceiver est appelé et dans le onReceive() vous acquérez le verrou de sillage et le placez dans une variable statique sur votre service. Lorsque le service est terminé, il doit appeler stopSelf(), libérer le verrou de sillage, puis annuler la variable statique qui conserve une référence au verrou. En outre, si vous utilisez un service, un verrou de sillage complet n'est probablement pas ce que vous voulez, mais un verrou de sillage partiel est. Vous n'avez pas besoin de l'écran pour rester allumé, non?

Désolé, mais les verrous de réveil sont très compliqués à utiliser, à cause précisément des problèmes que j'ai décrits ci-dessus. C'est définitivement un sujet avancé et c'est facile à bousiller. Si vous le faites, votre application aura des commentaires très laids, parce que tenir pendant trop longtemps est une infraction majeure car elle draine la batterie. Ne prenez pas cela dans le mauvais sens, mais étant donné la nature du problème que vous avez posté ici (syntaxe/erreur du compilateur), je suggère fortement de rechercher une solution sans service et réveiller le verrou.

+0

Merci pour le commentaire. Dans l'application sur laquelle je travaille, j'ai besoin que le téléphone soit en mode 100% wake, c'est pourquoi j'ai utilisé le verrou de réveil complet. – Tom

+0

Un wakelock partiel devrait être suffisant pour alimenter le CPU et utiliser le réseau. – Eno

+0

Merci de ma part. Votre explication est succincte, et plus utile que la question et la réponse combinées :) – Melllvar

Questions connexes