4 votes

AlarmManager et WakeLock

Je veux utiliser un gestionnaire d'alarmes dans mon activité. J'ai mis en place une alarme dans la méthode onPause de l'activité principale comme ceci,

Intent intent= new Intent(namaz_vakti_activity.this, namaz_vakti_activity.class);
PendingIntent sender = PendingIntent.getActivity(this, 1234567, intent,Intent.FLAG_ACTIVITY_NEW_TASK);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
eltime=Calendar.getInstance().getTime().getHours()*60+Calendar.getInstance().getTime().getMinutes();
eltime=(long)(Sun_Rise*60)-eltime;
if (eltime<0) 
    eltime=eltime+24*60;
eltime=eltime-pre_time;
if (eltime<=0) 
    eltime=eltime+24*60;
if (uyandirma)
{
    am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender);
    Toast.makeText(this,"Uyandirma saati "+ConvertTime(Sun_Rise-pre_time/60.0),Toast.LENGTH_SHORT).show();
}
else
{
    am.cancel(sender);
}

namaz_vakti_activity est mon activité principale. Les méthodes onPause et onResume lui appartiennent.

J'utilise également un wakelock à la méthode onResume pour empêcher le mode sommeil de se produire.

pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,"namaz_vakti_activity");
wl.acquire();

Le but principal de ce code est de relancer mon activité principale (namaz_vakti_activitiy) à un moment précis. Si l'appareil n'est pas en mode veille, le code fonctionne bien. Cependant, s'il est en mode sommeil, il donne une erreur et cesse de fonctionner. Je pense que la solution est simple, et je suis dans le blidness de code.

7voto

Mesut Points 113

Maintenant le code ci-dessous fonctionne parfaitement.

  • alarmmanager fonctionne bien. Cependant, il ne s'allume pas sur l'écran, je dois donc utiliser wakelock.
  • alarmmanager réveille l'appareil (vous avez tout à fait raison, huang), mais l'activité ne peut pas se concentrer. Je dois donc définir une nouvelle ligne (Android 2.0 ou supérieur supporte ces drapeaux : getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) ;

Le code résumé est ci-dessous.

public void onCreate(Bundle savedInstanceState)

...

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

...

protected void onResume()

    ...

//pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
//wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,"namaz_vakti_activity");
//wl.acquire();

MPX=MediaPlayer.create(this, R.raw.azan1);

...

if (eltime==0 && uyandirma && !MPX.isPlaying())
{
    MPX.setVolume(1,1);
    MPX.start();
}

protected void onPause()

    ...

    Intent intent= new Intent(namaz_vakti_activity.this, namaz_vakti_activity.class);
    PendingIntent sender = PendingIntent.getActivity(this, 1234567, intent,Intent.FLAG_ACTIVITY_NEW_TASK);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    eltime=Calendar.getInstance().getTime().getHours()*60+Calendar.getInstance().getTime().getMinutes();
    eltime=(long)(Sun_Rise*60)-eltime;
    if (eltime<0)
        eltime=eltime+24*60;
    eltime=eltime-pre_time;
    if (eltime<=0)
        eltime=eltime+24*60;
    if (uyandirma)
    {
        am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender);
        Toast.makeText(this,"Uyandirma saati "+ConvertTime(Sun_Rise-pre_time/60.0),Toast.LENGTH_SHORT).show();
    }
    else
    {
        am.cancel(sender);
    }

    if (MPX.isPlaying())
    {
        MPX.pause();
        MPX.release();
    }

    //if (wl.isHeld()) wl.release();

2voto

Huang Points 3252

Vous utilisez

am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender); 

pour définir une alarme, et à l'intérieur de celle-ci vous utilisez AlarmManager.RTC_WAKEUP, donc je crois que l'activité que vous avez l'intention de lancer sera lancée même lorsque le dispositif est endormi. Peut-être n'avez-vous pas besoin d'un wakelock.

Lorsque vous utilisez wakelock, vous avez besoin de cette permission : Android.permission.WAKE_LOCK. Est-ce le problème dans vos codes ?

2voto

JibranAhmed Points 151

J'étais confronté au même problème et la chose la plus intéressante était que cela fonctionnait sur les duos Samsung Galaxy S mais pas sur le Galaxy Nexus. Ma solution était de créer un verrou statique dans la méthode onReciever() de Broadcast reciever.

private static PowerManager.WakeLock wakeLock;

public static void acquireWakeLock(Context ctx) {
    if (wakeLock != null)
        wakeLock.release();

    PowerManager pm = (PowerManager) ctx
            .getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE,
            "aqs_wake_lock");
    wakeLock.acquire();
}

public static void releaseWakeLock() {
    if (wakeLock != null)
        wakeLock.release();
    wakeLock = null;
}

J'ai appelé acquireWakeLock() avant d'appeler startActivity() et ensuite dans la méthode OnCreate() de l'activité lancée, j'ai joué le son de l'alarme après un certain délai, c'est-à-dire dans onPause() et à l'arrêt du son de l'alarme, j'ai terminé l'activité et libéré le wakeLock en appelant releaseWakeLock().

new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            playSound(getApplicationContext(), getAlarmUri());
        }
    }, 1000);

J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X