Этот вопрос уже имеет ответ здесь:
Я реализовал BroadcastReceiver, который инициирован AlarmManager. AlarmManager инициализируется на BOOT_COMPLETED. Таким образом, я должен объявить получатель в декларации.
Моя проблема состоит в том, что я хочу, чтобы BroadcastReceiver только сделал что-то, когда ни одна из моих собственных операций не находится на переднем плане (иначе, пользователь не взаимодействует с моим приложением). Я вытягиваю информацию от удаленного сервера и не хочу уведомлять пользователя, если он в настоящее время находится в моем приложении так или иначе.
До сих пор мне не удалось найти способ определить, находится ли мое приложение на переднем плане. Существует ли способ сделать такую вещь? ActivityManager говорит мне, если мое приложение работает, но не, является ли это на переднем плане.
Проблемой является в значительной степени то же, как описано здесь: Сообщите Действию от BroadcastReceiver, ТОЛЬКО ЕСЛИ это находится на переднем плане
РЕШЕНИЕ:
После оценки нескольких решений я хочу быстро обрисовать в общих чертах то, что я думаю, лучший метод для контакта с операциями в фоне/переднем плане.
Предпочтительный путь состоит в том, чтобы зарегистрировать бытовой радиоприемник в onResume методе Вашего действия и вычеркивать из списка его на операциях по onPause. Любой сервис или другой фоновый элемент будут, чем потребность отправить широковещательное намерение с определенным действием, которое прервет Ваше действие.
Если Ваше действие будет на переднем плане, то ему зарегистрируют его поглощенный получатель и может непосредственно иметь дело с намерением, отправляют из Вашей службы. Если это не будет на переднем плане, то это не получит намерение, но сервис, который включил широковещательную передачу, будет знать, что никто не прервал ее широковещательное намерение и сможет иметь дело с этим самим. Например, это могло, чем запуск желаемое действие, показывать уведомление и т.д.
Ваша активность может отслеживать свое собственное состояние относительно того, находится ли она в передний план (установите логическое значение true
в onStart ()
, в false
в onStop ()
). Увы, это логическое значение не предоставляется вам в Activity
автоматически.
ActivityManager # getRunningAppProcesses ()
возвращает Список RunningAppProcessInfo
. Каждый RunningAppProcessInfo
имеет поле, называемое важностью. значение, равное RunningAppProcessInfo.IMPORTANCE_FOREGROUND
, похоже, показывает, какие действия активно наблюдаются пользователем. Существует также RunningAppProcessInfo.IMPORTANCE_VISIBLE
, который ниже, но, возможно, стоит проверить.