AlarmManager и WakeLock
Я хочу использовать диспетчер тревог в своей деятельности. Я настроил будильник на методе основной активности 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 в методе 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 ответа
Теперь приведенный ниже код работает отлично.
- 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();
Я столкнулся с той же проблемой, и самое интересное, что он работал на дуэтах Samsung Galaxy S, а не на Galaxy Nexus. Мое решение заключалось в создании статической блокировки в методе Broadcast reciever onReciever ().
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);
Надеюсь, это поможет кому-то.
Ты используешь
am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+eltime*60000, sender);
чтобы установить будильник, и в нем вы используете AlarmManager.RTC_WAKEUP, поэтому я считаю, что действие, которое вы намереваетесь запустить, будет запущено, даже когда устройство спит. Возможно, вам не нужен вейклок.
Когда вы используете wakelock, вам нужно это разрешение: android.permission.WAKE_LOCK. Это проблема в ваших кодах?