Я пытаюсь создать будильник со списком времени срабатывания, который я уже сохранил в Parse. У меня пока будильник срабатывает. Но теперь я хочу, чтобы он выключался, даже когда устройство спит. Я понимаю, что мне нужно внедрить wakelock в свой сервис, что я уже сделал. Я также понимаю, что мне нужно включить «FLAG_SHOW_WHEN_LOCKED | FLAG_TURN_SCREEN_ON, FLAG_FULLSCREEN». В настоящее время единственным известным мне способом является использование get Window. Но я знаю, что getWindow не для обслуживания. Итак, мне нужна помощь в том, как решить эту проблему.

У меня есть AlarmService с этим кодом:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);
    Toast.makeText(this,"onStartCommand()",Toast.LENGTH_SHORT).show();

    //wake lock
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, "My Wake Log");
    mWakeLock.acquire();

    //This code below doesn't work because getWindow is not for Service. what is my other option?
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.activity_reminder_screen);

    //start alarm screen
    Intent intent = new Intent(this, AlarmScreenActivity.class);
    ReminderIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

    return flags;
}

Служба отключается после нажатия кнопки «Сохранить» в добавлении активности тревоги следующим образом:

//set time into calendar instance
Calendar calendar= Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,mAlarmDetails.timeHour);
calendar.set(Calendar.MINUTE,mAlarmDetails.timeMinute);

AlarmManager reminder = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(this, AlarmService.class);
PendingIntent pendingIntent = PendingIntent.getService(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

reminder.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);

Заранее спасибо

ОБНОВЛЕНИЕ Я попытался превратить свою службу в Activity и иметь этот код внутри:

public class AlarmService extends Activity {
private MediaPlayer mMediaPlayer;
private PowerManager.WakeLock mWakeLock;


@Override
public void onCreate(Bundle savedInstateState) {
    super.onCreate(savedInstateState);
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = pm.newWakeLock(/***PowerManager.FULL_WAKE_LOCK*/WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, "My Wake Log");
    mWakeLock.acquire();
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
            WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    setContentView(R.layout.activity_alarm_screen);


}

Я также изменил getService в ожидающем намерении с кнопки на getActivity. Но после того, как я изменил их, ничего не появляется. будильник не появляется.

0
stanley santoso 16 Июл 2015 в 02:39

2 ответа

Вам не нужно удерживать wake lock. Делайте это только тогда, когда вы хотите, чтобы устройство не переходило в спящий режим. В вашем случае вы просто хотите, чтобы устройство разбудило вас. Использование либо RTC_WAKEUP, либо ELAPSED_REALTIME_WAKEUP позволит достичь этой цели. Вы можете получить блокировку пробуждения при пробуждении, чтобы предотвратить немедленное возвращение устройства в спящий режим, если вы собираетесь обрабатывать событие асинхронно.

RTC_WAKEUP не работает

RTC_WAKEUP не включает экран, все, что он делает, это пробуждает процессор, чтобы ваша работа была выполнена. Чтобы экран включился, вам необходимо получить ПОЛНУЮ блокировку.

0
Community 23 Май 2017 в 14:58
Я хочу, чтобы будильник срабатывал, даже когда устройство спит. Как видите, при добавлении будильника в моей активности уже есть RTC_WAKEUP. Телефон не будит.
 – 
stanley santoso
16 Июл 2015 в 02:51
Вы проверили правильность расчета времени? Распечатайте время будильника и System.currentTimeMillis() и посмотрите, является ли разница ожидаемым значением.
 – 
Phuong Nguyen
16 Июл 2015 в 02:53
Время точно подходящее. Я знаю это, потому что он отлично работает, если я удалю весь wakelock. Но тогда он погаснет только после того, как я разблокирую экран/телефон.
 – 
stanley santoso
16 Июл 2015 в 02:55
Кстати, почему вы используете сервис для запуска активности? У вас может быть ожидающее намерение запустить действие напрямую. PendingIntent pintent = PendingIntent.getActivity(SomeActivity.this, 0, намерение, PendingIntent.FLAG_UPDATE_CURRENT);
 – 
Phuong Nguyen
16 Июл 2015 в 02:58
Итак, я думаю, если я превращу эту услугу в деятельность, проблема будет решена? Я скоро попробую.
 – 
stanley santoso
16 Июл 2015 в 03:03

Вам понадобится либо служба пробуждающих намерений, либо WakefulBroadcastReceiver — измените ожидающее намерение на широковещательную рассылку (PendingIntent pendingIntent = PendingIntent.getBroadcast...) настройте приемник и в приемнике запустите службу Wakeful Intent — или настройте WakefulBroadcastReceiver. Диспетчер предупреждений удерживает блокировку во время работы onReceive. Используя WIS (или WBR, я их не использовал), вы по существу получаете блокировку, которая активна между завершением onReceive и запуском службы. См.: https://stackoverflow.com/a/20332558/281545

0
Community 23 Май 2017 в 14:58