Question

Bonjour, Je suis en train d'utiliser un service pour contrôler un wakelock afin que je puisse en permanence quitter l'écran lorsque mon application est en cours d'exécution. Je crée le wakelock et l'activer dans onCreate () et la libération dans OnDestroy () mais je reçois l'erreur « wl ne peut pas être résolu ». Quelqu'un peut-il expliquer comment je peux obtenir plus de cela? Code ci-dessous:

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();
    }
}
Était-ce utile?

La solution

ne sont pas vous manque la ligne

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

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

Ou, plus probable, vous voudrez peut-être faire un champ de classe WakeLockService au lieu d'une variable locale.

Autres conseils

Eh bien, même si vous utilisez une variable d'instance, je pense que ce n'est pas la façon de le faire. Qui est va destroy() d'appel? Je l'espère pas, c'est le travail du système d'exploitation pour le faire. Mais lorsque vous tenez un verrou sillage, il est très peu probable que votre méthode de destroy() s'appelle, parce que le système d'exploitation va d'abord détruire d'autres activités / services.

En plus de cela, il est trop tard pour acquérir le verrou de sillage dans la méthode onCreate(). Avant onCreate() est atteinte, le téléphone aurait pu aller dormir déjà lorsque vous déclenchez le service d'une alarme par rapport d'une activité qui est en arrière-plan.

Il est difficile de dire ce que vous devez faire autrement que vous ne donnez pas contexte beaucoup. Le cours normal des événements est la suivante. Un BroadcastReceiver est appelé et dans le onReceive() vous acquérir le verrou de sillage et de le mettre dans une variable statique sur votre service. Lorsque le service est fait, il devrait appeler stopSelf(), libérer le verrou de sillage et null la variable statique qui maintient une référence à la serrure.

En outre, si vous utilisez un service de réveil un verrou complet est très probablement pas ce que vous voulez, mais un verrou de réveil partiel est. Vous n'avez pas besoin de l'écran pour rester, non?

Désolé, mais les verrous de sillage sont vraiment compliquées à utiliser, car exactement les questions que j'ai décrit ci-dessus. Il est définitivement un sujet avancé et il est facile de bousiller. Si vous le faites, votre application devient très laid commentaires, car tenant pour est trop long une infraction grave car il draine la batterie. Ne prenez pas ce dans le mauvais sens s'il vous plaît, mais étant donné la nature du problème que vous avez signalé ici (erreur de syntaxe / compilateur) Je suggère fortement à la recherche d'une solution sans blocage de service et de réveil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top