Я пытаюсь создать будильник со списком времени срабатывания, который я уже сохранил в 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. Но после того, как я изменил их, ничего не появляется. будильник не появляется.
2 ответа
Вам не нужно удерживать wake lock. Делайте это только тогда, когда вы хотите, чтобы устройство не переходило в спящий режим. В вашем случае вы просто хотите, чтобы устройство разбудило вас. Использование либо RTC_WAKEUP, либо ELAPSED_REALTIME_WAKEUP позволит достичь этой цели. Вы можете получить блокировку пробуждения при пробуждении, чтобы предотвратить немедленное возвращение устройства в спящий режим, если вы собираетесь обрабатывать событие асинхронно.
RTC_WAKEUP не включает экран, все, что он делает, это пробуждает процессор, чтобы ваша работа была выполнена. Чтобы экран включился, вам необходимо получить ПОЛНУЮ блокировку.
Вам понадобится либо служба пробуждающих намерений, либо WakefulBroadcastReceiver — измените ожидающее намерение на широковещательную рассылку (PendingIntent pendingIntent = PendingIntent.getBroadcast...
) настройте приемник и в приемнике запустите службу Wakeful Intent — или настройте WakefulBroadcastReceiver. Диспетчер предупреждений удерживает блокировку во время работы onReceive. Используя WIS (или WBR, я их не использовал), вы по существу получаете блокировку, которая активна между завершением onReceive и запуском службы. См.: https://stackoverflow.com/a/20332558/281545
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.