#android #android-activity
#Android #android-activity
Вопрос:
Я не уверен, какая лучшая реализация для приложения, которое должно периодически проверять какое-либо условие и поднимать тревогу, если условие выполнено.
Допустим, в моем основном действии MainActivity
есть кнопка «пуск«, которая запускает службу переднего CheckConditionService
плана, которая проверяет условие один раз в секунду. Если условие выполнено, должно быть запущено новое действие AlarmActivity
, у которого есть кнопка «стоп-сигнал«, и также должен быть запущен периодический звуковой сигнал. Если пользователь нажимает «остановить сигнал тревоги«, AlarmActivity
он должен быть уничтожен и CheckConditionService
должен прекратить периодический звуковой сигнал и продолжить периодическую проверку состояния.
Теперь может быть несколько необычных вариантов использования, на которые я хочу обратить внимание:
- Пользователь может (случайно или специально) закрыть
AlarmActivity
вместо нажатия кнопки «остановить сигнал тревоги«, или она может быть закрыта системой, потому что она слишком долго находилась в фоновом режиме. В этом случае пользователь должен иметь возможность повторно открытьAlarmActivity
, щелкнув значок приложения или уведомление на переднемCheckConditionService
плане. - С другой стороны, нажатие на одно из них никогда не должно создавать состояние, в котором одновременно открывается более одного
AlarmActivity
. - Может быть, я забыл о каком-то другом необычном поведении, на которое следует обратить внимание? Предложения приветствуются!
Вопрос: каков наилучший и самый чистый способ сделать это? Что должно CheckConditionService
быть вызвано, если условие выполнено и должен начаться сигнал тревоги? И что можно MainActivity
сделать в onCreate()
1. чтобы узнать, поднят ли в данный момент сигнал тревоги, и поэтому он должен запуститься AlarmActivity
, и 2. открыт ли AlarmActivity
уже и, если да, не открывать второй экземпляр AlarmActivity
, а открывать существующий?
Ответ №1:
- Создайте
ForegroundService
- Создайте статическую переменную, возможно
Boolean
, типа, если вы хотите проверить состояние условия, например:CheckConditionService.isConditionMet
.
УбедитесьUpdate
, что в любой задаче, которую вы запускаете в этой службе. - Используйте заставку, чтобы определить, какое действие следует открыть, в зависимости от результата, возвращенного из
CheckConditionService.isConditionMet
.
Вот хорошая статья: https://medium.com/@shishirthedev/the-right-way-to-implement-a-splash-screen-in-android-acae0e52949a - Чтобы предотвратить случайное закрытие
AlarmActivity
, вы можете отключитьonBackPressed()
,
однако пользователь всегда может отойти с помощьюHome Button
или проведите пальцем (жесты в более новых версиях).
Точка3
может быть удобной там. - Для использования только одного экземпляра или одного состояния
AlarmActivity
используйтеsingleTask
флаг в манифесте для этого действия.
Комментарии:
1. Спасибо! Что вы подразумеваете под «Обязательно обновляйте в любой задаче, которую вы запускаете в этой службе».?
2. Если я использую
singleTask
forAlarmActivity
и если он уже открыт, будет ли каждый вызов дляstartActivity()
этого действия просто возвращать его на передний план? Какие функции внутриAlarmActivity
будут вызываться в этом случае?3. @Kolodez как вы сказали, вы проверяете, выполняется ли условие каждую секунду, поэтому, если оно соответствует условию, пометьте статическую переменную
isConditionMet
как true, иначе сохраните ее начальное значение какfalse
. Итак, что происходит, если пользователь закрылAlarmActivity
, нажав home, и пользователь открывается из launcher или запускается сstartActivity()
помощью, нового экземпляра activity не будет. amp; в aRare Case
, если пользователь открывает приложение и в то же время условие было выполнено, пользователь будет перенаправлен наAlarmActivity
(проверка из SplashActivity)4. Спасибо. Похоже, ваше предложение работает. 🙂
5. Рад это слышать. 🙂