Как убедиться, что в Android есть только одно из заданных действий?

#android #android-activity

#Android #android-activity

Вопрос:

Я не уверен, какая лучшая реализация для приложения, которое должно периодически проверять какое-либо условие и поднимать тревогу, если условие выполнено.

Допустим, в моем основном действии MainActivity есть кнопка «пуск«, которая запускает службу переднего CheckConditionService плана, которая проверяет условие один раз в секунду. Если условие выполнено, должно быть запущено новое действие AlarmActivity , у которого есть кнопка «стоп-сигнал«, и также должен быть запущен периодический звуковой сигнал. Если пользователь нажимает «остановить сигнал тревоги«, AlarmActivity он должен быть уничтожен и CheckConditionService должен прекратить периодический звуковой сигнал и продолжить периодическую проверку состояния.

Теперь может быть несколько необычных вариантов использования, на которые я хочу обратить внимание:

  1. Пользователь может (случайно или специально) закрыть AlarmActivity вместо нажатия кнопки «остановить сигнал тревоги«, или она может быть закрыта системой, потому что она слишком долго находилась в фоновом режиме. В этом случае пользователь должен иметь возможность повторно открыть AlarmActivity , щелкнув значок приложения или уведомление на переднем CheckConditionService плане.
  2. С другой стороны, нажатие на одно из них никогда не должно создавать состояние, в котором одновременно открывается более одного AlarmActivity .
  3. Может быть, я забыл о каком-то другом необычном поведении, на которое следует обратить внимание? Предложения приветствуются!

Вопрос: каков наилучший и самый чистый способ сделать это? Что должно CheckConditionService быть вызвано, если условие выполнено и должен начаться сигнал тревоги? И что можно MainActivity сделать в onCreate() 1. чтобы узнать, поднят ли в данный момент сигнал тревоги, и поэтому он должен запуститься AlarmActivity , и 2. открыт ли AlarmActivity уже и, если да, не открывать второй экземпляр AlarmActivity , а открывать существующий?

Ответ №1:

  1. Создайте ForegroundService
  2. Создайте статическую переменную, возможно Boolean , типа, если вы хотите проверить состояние условия, например: CheckConditionService.isConditionMet .
    Убедитесь Update , что в любой задаче, которую вы запускаете в этой службе.
  3. Используйте заставку, чтобы определить, какое действие следует открыть, в зависимости от результата, возвращенного из CheckConditionService.isConditionMet .
    Вот хорошая статья: https://medium.com/@shishirthedev/the-right-way-to-implement-a-splash-screen-in-android-acae0e52949a
  4. Чтобы предотвратить случайное закрытие AlarmActivity , вы можете отключить onBackPressed() ,
    однако пользователь всегда может отойти с помощью Home Button или проведите пальцем (жесты в более новых версиях).
    Точка 3 может быть удобной там.
  5. Для использования только одного экземпляра или одного состояния AlarmActivity
    используйте singleTask флаг в манифесте для этого действия.

Комментарии:

1. Спасибо! Что вы подразумеваете под «Обязательно обновляйте в любой задаче, которую вы запускаете в этой службе».?

2. Если я использую singleTask for AlarmActivity и если он уже открыт, будет ли каждый вызов для startActivity() этого действия просто возвращать его на передний план? Какие функции внутри AlarmActivity будут вызываться в этом случае?

3. @Kolodez как вы сказали, вы проверяете, выполняется ли условие каждую секунду, поэтому, если оно соответствует условию, пометьте статическую переменную isConditionMet как true, иначе сохраните ее начальное значение как false . Итак, что происходит, если пользователь закрыл AlarmActivity , нажав home, и пользователь открывается из launcher или запускается с startActivity() помощью, нового экземпляра activity не будет. amp; в a Rare Case , если пользователь открывает приложение и в то же время условие было выполнено, пользователь будет перенаправлен на AlarmActivity (проверка из SplashActivity)

4. Спасибо. Похоже, ваше предложение работает. 🙂

5. Рад это слышать. 🙂