#android #service #alarmmanager #intentservice
#Android #Обслуживание #alarmmanager #intentservice
Вопрос:
Я создаю приложение, похожее на игру, и я читал обо всех различных подходах к запуску чего-либо со службами в фоновом режиме, на переднем плане, с сигналами тревоги и так далее, И я немного сбит с толку.
Мое приложение будет выглядеть следующим образом (пример):
- пользователь нажимает кнопку в Main, после чего он может закрыть приложение
- через 30 минут откроется Activity1
- пользователь завершает все, что ему нужно сделать в этом действии, что запускает запуск следующего действия через 2 часа
- через 2 часа откроется Activity2
- пользователь завершает все, что ему нужно сделать, и там, запуская следующий
- через день открывается Activity3 и так далее
Какой подход был бы наилучшим? Есть ли служба, работающая непрерывно, чтобы открывать эти действия, или настроить новый будильник для запуска каждый раз, когда пользователь завершает одно из действий?
Комментарии:
1. Если вы хотите разрядить батарею пользователя, запустите сервис. Но лучше использовать alarm manager, потому что Android может отключить давно работающую службу.
2. Как пользователь вообще узнает, что действия начинаются с каждого интервала? — используйте
AlarmManager
для запуска намерений после нажатия кнопки. Не устанавливайте более 3 сигналов тревоги. Установите один сигнал тревоги, а когда он сработает, установите следующий сигнал тревоги.3. Например, действие может начать воспроизводить звук. Разве нельзя установить более одного будильника?
Ответ №1:
Пожалуйста, не создавайте сервис только для того, чтобы он мог простаивать в течение нескольких часов. Это не имеет смысла.
Что вам нужно сделать, так это создать сигнал тревоги. что-то вроде:
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 14);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, alarmIntent);
Это всего лишь общий пример для Alarm API. Вам нужно будет настроить его под свои нужды.
Наконец, пожалуйста, имейте в виду: alarms не устойчив к загрузке! То есть: если по какой-либо причине устройство пользователя выйдет из строя, все ваши сигналы тревоги будут потеряны.
если вы хотите, чтобы ваше приложение было устойчивым к загрузке, вам нужно будет зарегистрироваться на событие с именем RECEIVE_BOOT_COMPLETED (думаю, после загрузки), где вы перезапустите ожидающие сигналы тревоги:
//manifest:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".MyBootReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
//java class
public class MyBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
// restart alarms
}
}
}
Надеюсь, это поможет