AlarmManager и WakeLock - PullRequest
       37

AlarmManager и WakeLock

4 голосов
/ 19 марта 2011

Я хочу использовать диспетчер тревог в своей деятельности.Я настроил будильник в методе основной активности 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);
}

namaz_vakti_activity - моя основная деятельность.к нему принадлежат методы onPause и onResume.

Я также использую метод wakelock at onResume для предотвращения возникновения спящего режима.

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();

Основная цель кода - запустить мою основную деятельность(namaz_vakti_activitiy) снова в определенное время.Если устройство не находится в спящем режиме, код работает хорошо.Однако, если он находится в спящем режиме, он выдает ошибку и перестает работать.Я думаю, что решение простое, и я нахожусь в слепоте кода.

Ответы [ 3 ]

7 голосов
/ 19 марта 2011

Теперь приведенный ниже код работает отлично.

  • AlarmManager работает хорошо. Тем не менее, это не на экране, поэтому я должен использовать WakeLock
  • AlarmManager будит устройство (вы абсолютно правы, Хуан), но деятельность не может получить фокус. Поэтому я должен определить новую строку (Android 2.0 или выше поддерживает эти флаги: getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Ниже приведен краткий код.

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();
2 голосов
/ 05 июля 2013

Я столкнулся с той же проблемой, и самое интересное, что он работал на дуэтах Samsung Galaxy S, а не на Galaxy Nexus.Мое решение состояло в том, чтобы создать статическую блокировку в методе onReciever () 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;
}

вызывать acquWakeLock () перед вызовом startActivity (), а затем в методе OnCreate () запущенного действия. Я воспроизводил сигнал тревоги.после некоторой задержки, т. е. в onPause () и при остановке звука будильника, я заканчиваю действие и освобождаю wakeLock, вызывая releaseWakeLock ().

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

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

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 19 марта 2011

Вы используете

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

для установки будильника, и внутри него вы используете AlarmManager.RTC_WAKEUP, поэтому я считаю, что действие, которое вы намереваетесь запустить, будет запущено, даже когда устройство спит.Возможно, вам не нужен wakelock.

Когда вы используете wakelock, вам нужно это разрешение: android.permission.WAKE_LOCK.Это проблема в ваших кодах?

...