Я хочу иметь одно приложение, работающее в фоновом режиме, которое знает, когда работает какое-либо из встроенных приложений (обмен сообщениями, контакты и т. Д.).
Итак, мои вопросы:
Как мне запускать приложение в фоновом режиме.
Как мое фоновое приложение может узнать, какое приложение в данный момент запущено на переднем плане.
Будем очень благодарны за отзывы людей с опытом.
Ответы:
Что касается «2. Как мое фоновое приложение может узнать, какое приложение в данный момент запущено на переднем плане».
НЕ используйте
getRunningAppProcesses()
метод, так как из моего опыта он возвращает всевозможный системный мусор, и вы получите несколько результатов, которые имелиRunningAppProcessInfo.IMPORTANCE_FOREGROUND
. ИспользуйтеgetRunningTasks()
вместоЭто код, который я использую в своем сервисе для идентификации текущего приложения переднего плана, это очень просто:
Вот и все, тогда вы можете легко получить доступ к деталям приложения / активности переднего плана:
Это требует дополнительного разрешения в манифесте активности и отлично работает.
источник
getRunningTasks()
устарело в API 21 (Lollipop) - developer.android.com/reference/android/app/…Мне пришлось нелегко найти правильное решение. приведенный ниже код является частью cyanogenmod7 (настройки планшета) и протестирован на android 2.3.3 / gingerbread.
методы:
это, надеюсь, ответит на этот вопрос во всех отношениях (:
источник
mActivityManager.getRunningTasks(1).get(0).topActivity
?Попробуйте следующий код:
Имя процесса - это имя пакета приложения, работающего на переднем плане. Сравните его с названием пакета вашего приложения. Если это то же самое, то ваше приложение работает на переднем плане.
Надеюсь, это ответит на ваш вопрос.
источник
Начиная с леденца на палочке, это изменилось. Пожалуйста, найдите ниже код, прежде чем этот пользователь должен перейти в Настройки -> Безопасность -> (Прокрутите вниз до последнего) Приложения с доступом к использованию -> Предоставьте разрешения нашему приложению
источник
Для случаев, когда нам нужно проверить из нашего собственного сервиса / фонового потока, находится ли наше приложение на переднем плане или нет. Вот как я это реализовал, и у меня он отлично работает:
Теперь, чтобы проверить из других классов, находится ли приложение на переднем плане, просто вызовите:
Обновление (как указано в SHS ):
Не забудьте зарегистрироваться для обратных вызовов в
onCreate
методе вашего класса Application .источник
Чтобы определить приложение переднего плана, которое вы можете использовать для обнаружения приложения переднего плана, вы можете использовать https://github.com/ricvalerio/foregroundappchecker . Он использует разные методы в зависимости от версии Android устройства.
Что касается сервиса, репо также предоставляет необходимый вам код. По сути, позвольте студии Android создать службу для вас, а затем onCreate добавить фрагмент, который использует appChecker. Однако вам нужно будет запросить разрешение.
источник
Принимая во внимание, что
getRunningTasks()
это устарело иgetRunningAppProcesses()
ненадежно, я решил объединить 2 подхода, упомянутых в StackOverflow:источник
Класс ActivityManager - подходящий инструмент для просмотра запущенных процессов.
Для работы в фоновом режиме вы обычно хотите использовать службу .
источник
Это сработало для меня. Но дает только название главного меню. То есть, если пользователь открыл экран «Настройки» -> «Bluetooth» -> «Имя устройства», RunningAppProcessInfo называет его просто «Настройки». Не удалось развернуть Furthur
источник
Сделайте что-нибудь вроде этого:
источник
В леденцах и выше:
Добавить в mainfest:
И сделайте примерно так:
источник
Вот как я проверяю, находится ли мое приложение на переднем плане. Обратите внимание: я использую AsyncTask, как указано в официальной документации Android.
`
и выполните AsyncTask следующим образом.
new CheckIfForeground().execute();
источник
Я объединил два решения в одном методе, и он работает у меня для API 24 и для API 21. Остальные я не тестировал.
Код на Котлине:
и в манифесте
источник