2010-11-23 20 views
7

Je suis nouveau à la notion de WakeLock et j'ai besoin de votre aide.Questions débutants: Wakelocks

Questions:

  1. Je suppose WakeLock être un certain type de verrouillage qui, lorsqu'il est tenu par le code empêche l'exécution de l'appareil de couchage. Que faire si l'appareil est déjà en mode veille/veille, le code va-t-il alors s'exécuter? En supposant qu'il n'acquerrait jamais un WakeLock?

  2. Lorsqu'une tâche de longue durée (environ 7-8 sec) est effectuée dans un thread d'arrière-plan (AsyncTask), est-ce que je devrais être gêné par le fait de tenir un WakeLock? AsyncTask l'a-t-il déjà acquis pour moi?

  3. des liens vers des documentations officielles et des écrits sur les wakelocks sont appréciés.

Merci.

+0

Je voudrais aussi savoir ceci. Plus précisément, dans quelles conditions le téléphone va-t-il dormir? Si je commence une activité continue (télécharger un fichier dans mon cas) lorsque le téléphone est éveillé, y a-t-il une chance que le téléphone dorme pendant que mon processus fonctionne? – Timmmm

Répondre

4

1.Si le téléphone est en mode veille, mis à part un appel téléphonique entrant, vous pouvez utiliser AlarmManager pour réveiller le téléphone.

De la documentation de la classe AlarmManager:

Le gestionnaire d'alarme est titulaire d'une méthode aussi longtemps que OnReceive() du récepteur d'alarme réveil CPU verrouillage est en cours d'exécution. Cette garantit que le téléphone ne sera pas sommeil jusqu'à ce que vous avez fini de gérer la diffusion. Une fois les retours onReceive() , le gestionnaire d'alarmes publie ce verrou de sillage. Cela signifie que, dans certains cas, le téléphone sera mis en veille dès que votre méthode onReceive() se terminera à . Si votre récepteur d'alarme a appelé Context.startService(), il est possible que le téléphone dorme avant le lancement du service demandé . Pour empêcher cela, votre BroadcastReceiver et le service devra mettre en œuvre une politique de verrouillage de réveil séparé pour assurer que le téléphone continue de fonctionner jusqu'à ce que le service devienne disponible.

2.Dans vous travaillez avec un AsyncTask, vous voulez publier les résultats sur le thread d'interface utilisateur sur onPostExecute()

De la documentation AsyncTask:

AsyncTask permet une bonne et facile utilisation du thread UI. Cette classe permet d'effectuer des opérations en arrière-plan et de publier des résultats sur le thread d'interface utilisateur sans avoir à manipuler les threads et/ou les gestionnaires.

3. Je vous suggère d'avoir lu dans la documentation officielle de Power Manager ce qui donne une bonne introduction au concept WakeLock.

3
  1. En général, le seul code qui fonctionnerait alors que le téléphone est en train de dormir est un BroadcastReceiver. En fait, le téléphone se réveille une seconde, exécute le code BroadcastReceiver et dort de nouveau. Comme vous ne devez jamais exécuter de code long dans un BroadcastReceiver (utilisez-le pour lancer un Service à la place), vous pouvez supposer que votre code n'est jamais exécuté pendant que le téléphone est en veille. Bien sûr, si vous utilisez un BroadcastReceiver pour démarrer un Service, vous devriez normalement obtenir un WakeLock.

  2. Avec un AsyncTask initié par l'utilisateur, vous n'avez pas vraiment besoin de vous inquiéter de WakeLocks. Il est peu probable que le téléphone soit en veille pendant qu'il fonctionne. Je ne suis pas sûr si ils obtiennent un WakeLock, mais en mettant mon téléphone pour dormir tout en exécutant une norme AsyncTask ne semble pas l'interrompre.

  3. Comme l'a dit STED, vérifier cela: http://developer.android.com/reference/android/os/PowerManager.html

Fondamentalement, la seule fois où vous avez besoin de vous soucier de WakeLocks est quand vous soit attendez votre tâche soit interrompue par le sommeil (comme cela est le cas si vous régler une alarme qui réveille le téléphone brièvement) ou si vous ne pouvez absolument pas interrompre la tâche. Sinon, assurez-vous de gérer gracieusement les interruptions.

+0

Mes tests ont montré que vous pouvez utiliser une alarme pour déclencher un service, vous n'avez donc pas du tout besoin du récepteur de diffusion. Quelqu'un s'il vous plaît corrigez-moi si je me trompe à ce sujet (peut-être que cela ne fonctionne que sur certaines versions de l'OS). Pendant ce temps, voir https://github.com/commonsguy/cwac-wakeful#readme pour une discussion sur les services qui gardent l'appareil éveillé jusqu'à ce qu'ils terminent leur tâche. –