2010-01-11 6 views
44

Mon WakeLock ne garde pas mon appareil éveillé.Comment faire fonctionner un WakeLock Android?

En OnCreate() J'ai:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag"); 
mWakeLock.acquire(); 

alors:

new CountDownTimer(1320000, 200) { 

    public void onTick(long millisUntilFinished) { 
     // I update a progress bar here.           
    } 

    public void onFinish() { 
     // I finish updating the progress bar. 
     mWakeLock.release(); 
    } 
}.start(); 

L'écran se éteint avant la fin de la minuterie, comment puis-je l'écran reste visible?

mWakeLock est un champ déclaré précédemment comme ceci:

private PowerManager.WakeLock mWakeLock; 

Mon appareil utilise Android 1.6. J'apprécierais vraiment toute aide pour résoudre ceci.

Répondre

49

Avez-vous configuré le permission requis dans votre manifeste?

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

En effet. Vérifiez votre sortie logcat au moment où vous appelez le wakelock. Le système vous avertit généralement des autorisations manquantes. –

+0

J'ai ces autorisations définies, et le système d'exploitation Android mentionne les autorisations lorsque j'installe l'application. – Curyous

+1

Je ne fais que deviner, mais une autre chose à vérifier est qu'au moment où vous avez créé le verrou de réveil, l'écran ne s'est pas déjà éteint. Pour acquérir(), seules les garanties préservent/restaurent l'état d'alimentation au moment où le verrou de sillage a été créé. Après tout: à partir de la description de votre problème, nous ne pouvons pas être sûr que l'écran était toujours visible/visible au moment où vous avez appelé CountDownTimer.start(). –

2

J'ai un problème similaire. Je peux faire en sorte que l'écran reste allumé, mais si j'utilise un verrouillage de réveil partiel et que l'écran est éteint, ma fonction onFinish n'est pas appelée tant que l'écran n'est pas allumé.

Vous pouvez vérifier votre verrou de sillage à l'aide de mWakeLock.isHeld(), tout d'abord, pour vous assurer que vous l'obtenez. Le plus simple est d'ajouter cela au code, de lui définir un point d'arrêt dans le débogueur, puis de le vérifier.

Dans mon cas, je comprends, mais le verrou de sillage partiel ne semble pas faire quoi que ce soit. Voici mon code de travail pour le verrouillage de l'écran.

protected void setScreenLock(boolean on){ 
     if(mWakeLock == null){ 
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
             PowerManager.ON_AFTER_RELEASE, TAG); 
     } 
     if(on){ 
     mWakeLock.acquire(); 
     }else{ 
      if(mWakeLock.isHeld()){ 
       mWakeLock.release(); 
      } 
     mWakeLock = null; 
     } 

    } 

ADDENDA:

Droid Eris utilisateurs et DROID me sont rapportent que cela ne fonctionne pas sur leurs appareils, mais il fonctionne très bien sur mon G1. Sur quel appareil testez-vous? Je pense que cela peut être un bug Android. WakeLock ne cause généralement pas de problèmes de redémarrage.

104

Il peut y avoir d'autres problèmes dans votre codage. WakeLock brouille fortement la batterie, si elle n'est pas relâchée après utilisation. WakeLock est un moyen inefficace de garder l'écran allumé. Au lieu de cela, utilisez le WindowManager pour faire la magie. La ligne suivante suffira le WakeLock. L'autorisation WakeLock est également nécessaire pour que cela fonctionne. Aussi ce code est plus efficace que le wakeLock.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Vous n'avez pas besoin de réinitialiser le WakeLock manuellement. Ce code permettra au système Android de gérer le verrouillage automatiquement. Lorsque votre application est au premier plan, WakeLock est maintenu et le système android libère le verrou automatiquement.

Essayez et poster votre commentaire ...

+0

Je ne pense pas que vous avez besoin de l'autorisation de verrouillage de réveil pour le faire de la manière WindowManager. – Karu

+0

oui l'autorisation de réveil n'est pas nécessaire. Mise à jour du poste –

+0

WOW! J'ai utilisé le powermanager pour acquérir le wakelock dans de nombreuses applications, ce qui m'a donné beaucoup de problèmes! C'est un moyen très efficace! merci @AndroidKid! – udiboy1209

1

Assurez-vous que mWakeLock est accidentellement nettoyé avant que vous êtes prêt à le libérer. Si c'est finalisé, le verrou est libéré. Cela peut arriver, par exemple, si vous le définissez sur null et que le garbage collector s'exécute ensuite. Cela peut également se produire si vous avez accidentellement défini une variable locale du même nom au lieu de la variable au niveau de la méthode.

Je vous recommande également de vérifier LogCat pour les entrées qui ont la balise PowerManagerService ou la balise que vous passez à newWakeLock. Essayez d'utiliser l'indicateur ACQUIRE_CAUSES_WAKEUP lorsque vous créez le verrou de sillage.

23

Il vous suffit d'écrire ceci:

private PowerManager.WakeLock wl; 

    protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen"); 
    }//End of onCreate 

      @Override 
     protected void onPause() { 
      super.onPause(); 
      wl.release(); 
     }//End of onPause 

     @Override 
     protected void onResume() { 
      super.onResume(); 
      wl.acquire(); 
     }//End of onResume 

puis ajouter l'autorisation dans le fichier manifeste

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

Maintenant, votre activité sera toujours éveillé. Vous pouvez faire d'autres choses comme w1.release() selon vos besoins.

2

Merci pour ce sujet. J'ai eu du mal à implémenter une minuterie dans mon code pendant 5 minutes pour faire une activité, parce que mon téléphone que j'ai paramétré pour éteindre/dormir environ 2 minutes. Avec les informations ci-dessus, il semble que j'ai pu faire le travail.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    /* Time Lockout after 5 mins */ 
    getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

    Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 

     public void run() { 

     Intent i = new Intent(AccountsList.this, AppEntryActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(i); 
     finish(); 
     return; 

     } 

    }, 300000); 
    /* Time Lockout END */ 
} 
2

extrait exemple de code d'android developers site

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    } 

Best Practices for Background Jobs

6

Pour obtenir le même programmation, vous pouvez utiliser suivant

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

ou l'ajout suivant dans la mise en page se produira également au-dessus tâche

android:keepScreenOn="true" 

Les détails que vous pouvez obtenir de suivre url http://developer.android.com/training/scheduling/wakelock.html

J'ai utilisé combinaison suivante pour réveiller mon écran lorsque keyguard verrouillé et garder mon écran

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
6

Ajouter permission AndroidManifest.xml , comme indiqué ci-dessous

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

AVANT vos balises de déclaration <application>, mais APRÈS les balises <manifest>, essayez ensuite de faire en sorte que votre méthode onCreate() contienne uniquement l'instanciation WakeLock.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "My Tag"); 
} 

puis dans votre lieu de méthode onResume()

@Override 
public void onResume() { 
    mWakeLock.aquire(); 
} 

et dans votre lieu de méthode onFinish()

@Override 
public void onFinish() { 
    mWakeLock.release(); 
} 
1
{PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 
WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyWakeLock"); 
wakeLock.acquire();} 

utiliser ce code et ne pas oublier de permettre wakelock dans Android manifeste

2

Protégez l'écran

Première façon:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Deuxième moyen:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:keepScreenOn="true"> 
    ... 
</RelativeLayout> 

Gardez la CPU:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

et

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); 
wakeLock.acquire(); 

Pour libérer le verrou de sillage, appelez wakelock.release(). Cela libère votre revendication à la CPU. Il est important de libérer un verrou de sillage dès que votre application a fini de l'utiliser pour éviter de décharger la batterie.

Docs here.

Questions connexes