Wake serrures android de service récurrents
J'ai cette application qui a besoin d'exécuter un service (arrière-plan) qui émet régulièrement des bips.
Le téléphone doit émettre un signal sonore toute la journée pendant 5 secondes chaque minute (utilisé un gestionnaire dans le service). J'ai mis en œuvre ce service qui le fait parfaitement, mais lorsque le téléphone passe en mode de veille prolongée, l'exécution des arrêts de ce conducteur s'arrête. À l'aide de cette réponse de la question ALORS, j'ai réussi à utiliser la fonction wake verrous et il fonctionne très bien. Mais quand j'ai choisi de mettre le téléphone en mode de veille prolongée, le conducteur s'arrête en cours d'exécution. Où dois-je placer le wakelock dans le service. L'extrait de Code ci-dessous.
public class PlaySound extends Service{
PowerManager.WakeLock wl ;
PowerManager pm;
private SoundManager mSoundManager;
boolean wakeUpFlag = false;
@Override
public void onCreate(){
super.onCreate();
mSoundManager = new SoundManager();
mSoundManager.initSounds(getBaseContext());
mSoundManager.addSound(1, R.raw.sound);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startservice();
return START_STICKY;
}
private void startservice() {
System.out.println("Started the service");
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {
toastHandler.sendEmptyMessage(0);
}
}, 0, 60000);
}
private final Handler toastHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
result =start();
System.out.println("result"+result);
close();
}
};
protected void close() {
try {
if(wakeUpFlag){
wl.release();
System.out.println("Released the wakelock");
}
if(!pm.isScreenOn()){
System.out.println("Screen is off - back to sleep");
pm.goToSleep(1000);
}
else{
System.out.println("Screen is on - no need to sleep");
}
bs.close();
writer.close();
System.out.println("Closed socket and writer");
System.out.println("Size of file:"+f.length()/1024);
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
public void start(){
try{
wakeUpFlag = false;
pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
if(!pm.isScreenOn()) {
wakeUpFlag = true;
wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"CollectData");
System.out.println("Screen off - wake lock acquired");
wl.acquire();
}
else{
System.out.println("Screen on - no need of wake lock");
}
}
catch(Exception e){
e.printStackTrace();
}
mSoundManager.playSound(1);
}
OriginalL'auteur i_raqz | 2011-03-13
Vous devez vous connecter pour publier un commentaire.
Suivre le modèle Mark Murphy fournit avec le WakefulIntentService. Je suggère à ramasser ses livres, non seulement pour l'explication détaillée de cette classe et par l'exemple, il inclut dans l'un d'eux, mais pour les autres la richesse de l'information que vous trouverez en eux.
J'ai récemment mis en œuvre ce modèle pour mon application principale et cette classe fonctionne comme un charme.
OriginalL'auteur Chris Stewart
Je ne pense pas que vous utilisez le bon drapeau accorinding android documentation fior PowerManager:
En d'autres termes, essayez d'utiliser
PARTIAL_WAKE_LOCK
que c'est le seul qui garantit le processeur pour exécuterOriginalL'auteur ninjasense
Je pense que tu ferais mieux d'utiliser android.app.AlarmManager pour programmer une alarme de réveil. Attention tout de même - vous ne voulez pas faire long l'exécution de travaux dans votre onReceive() méthode qui est normalement appelé sur le thread principal, et va s'accrocher à votre activité. Vous aurez toujours besoin d'acquérir le wakelock pour la durée de votre tâche pour empêcher le téléphone de couchage à mi-chemin à travers.
OriginalL'auteur kingrichardthethird