Есть ли собственный способ Android получить ссылку на текущую активность в службе?
У меня есть служба, работающая в фоновом режиме, и я хотел бы обновить свою текущую активность, когда происходит событие (в службе). Есть ли простой способ сделать это (как тот, который я предложил выше)?
android
service
android-activity
Джордж
источник
источник
Ответы:
Вы не можете владеть "действующим в данный момент действием".
Intent
на мероприятие - вот пример проекта, демонстрирующего эту схемуPendingIntent
(например, черезcreatePendingResult()
), что служба вызываетbindService()
, а служба вызовет метод события для этого объекта обратного вызова / прослушивателя.Intent
в мероприятие сBroadcastReceiver
резервным копированием с низким приоритетом (для повышения,Notification
если действие не отображается на экране) - вот сообщение в блоге, в котором больше об этом шаблонеисточник
instanceof
проверок if или рефакторинга действий для совместного использования общего суперкласса или интерфейса. И если вы собираетесь провести рефакторинг действий, вы можете также сделать это таким образом, чтобы лучше соответствовать структуре и охватывать больше сценариев, например, ни одно из ваших действий не было активным. # 4, вероятно, наименее трудоемкий и самый гибкий.Обновление : это больше не работает с действиями других приложений с Android 5.0
Вот хороший способ сделать это с помощью менеджера активности. Вы в основном получаете рабочие задачи от менеджера активности. Сначала он всегда вернет текущую активную задачу. Оттуда вы можете получить topActivity.
Пример здесь
Есть простой способ получить список запущенных задач из сервиса ActivityManager. Вы можете запросить максимальное количество задач, выполняемых на телефоне, и по умолчанию текущая активная задача возвращается первой.
После этого вы можете получить объект ComponentName, запросив topActivity из вашего списка.
Вот пример.
Вам понадобится следующее разрешение в вашем манифесте:
источник
As of LOLLIPOP, this method is no longer available to third party applications: the introduction of document-centric recents means it can leak person information to the caller. For backwards compatibility, it will still return a small subset of its data: at least the caller's own tasks, and possibly some other tasks such as home that are known to not be sensitive.
Предупреждение: нарушение Google Play
Google пригрозил удалить приложения из Play Store, если они используют службы специальных возможностей в целях недоступности. Однако, по сообщениям, это пересматривается .
Используйте
AccessibilityService
AccessibilityService
.onAccessibilityEvent
обратном вызове проверьте тип события, чтобы определить, когда изменяется текущее окно.TYPE_WINDOW_STATE_CHANGED
PackageManager.getActivityInfo()
.Преимущества
GET_TASKS
разрешения.Недостатки
AccessibilityService
, он не может нажать кнопку ОК, если приложение поместило наложение на экран. Некоторые приложения, которые делают это, Velis Auto Brightness и Lux. Это может сбивать с толку, поскольку пользователь может не знать, почему он не может нажать кнопку или как ее обойти.AccessibilityService
будет знать текущую активность до первого изменения активности.пример
обслуживание
AndroidManifest.xml
Слейте это в свой манифест:
Сервисная информация
Поместите это в
res/xml/accessibilityservice.xml
:Включение службы
Каждому пользователю приложения необходимо явно включить
AccessibilityService
его, чтобы его можно было использовать. Посмотрите этот ответ StackOverflow о том, как это сделать.Обратите внимание, что пользователь не сможет нажать кнопку ОК при попытке включить службу специальных возможностей, если приложение поместило на экран наложение, например Velis Auto Brightness или Lux.
источник
settingsActivity
изyour.app.ServiceSettingsActivity
, так что вы должны изменить это на вашу собственную деятельность настройки для службы доступности. Я думаю, что настройка параметров в любом случае необязательна, поэтому я удалил эту часть из своего ответа, чтобы упростить ее.onAccessibilityEvent
не получает никаких событий, но если я отключаю и снова включаю Accessibility Service, то служба повторно активируется иonAccessibilityEvent
начинает работать.Это может быть сделано:
Реализуйте свой собственный класс приложения, зарегистрируйтесь для ActivityLifecycleCallbacks - так вы сможете увидеть, что происходит с нашим приложением. При каждом возобновлении вызова обратный вызов назначает текущую видимую активность на экране, а при паузе удаляет назначение. Он использует метод,
registerActivityLifecycleCallbacks()
который был добавлен в API 14.В вашем сервисном вызове
getApplication()
и приведите его к имени класса вашего приложения (в данном случае App). Чем вы можете позвонитьapp.getActiveActivity()
- это даст вам текущую видимую активность (или ноль, если нет видимой активности). Вы можете получить название деятельности, позвонивactiveActivity.getClass().getSimpleName()
источник
onActivityResumed()
,onActivityPaused()
иgetActiveActivity()
посмотреть , как это Callet, если когда - нибудь так.activity
иactiveActivity
такие же , перед назначениемactiveActivity
сnull
тем чтобы ошибки во избежание из - за приобщены порядок вызова методов жизненного цикла различных видов деятельности.Я не мог найти решение, которым наша команда была бы довольна, поэтому мы сделали свое дело. Мы используем,
ActivityLifecycleCallbacks
чтобы отслеживать текущую активность, а затем выставлять ее через сервис:Затем настройте свой DI-контейнер для возврата экземпляра
MyApplication
forContextProvider
, например(Обратите внимание, что реализация
getCurrent()
кода в приведенном выше коде опущена. Это просто статическая переменная, установленная в конструкторе приложения)источник
activity
иcurrentActivity
такие же , перед назначениемcurrentActivity
сnull
тем чтобы ошибки во избежание из - за приобщены порядок вызова методов жизненного цикла различных видов деятельности.использование
ActivityManager
Если вы хотите знать только приложение, содержащее текущую активность, вы можете сделать это, используя
ActivityManager
. Техника, которую вы можете использовать, зависит от версии Android:ActivityManager.getRunningTasks
( пример )ActivityManager.getRunningAppProcesses
( пример )Преимущества
Недостатки
ActivityManager.RunningAppProcessInfo.processState
Пример (на основе кода KNaito )
манифест
Добавьте
GET_TASKS
разрешение наAndroidManifest.xml
:источник
Я использую это для моих тестов. Это API> 19, и только для действий вашего приложения.
источник
Используйте этот код для API 21 или выше. Это работает и дает лучший результат по сравнению с другими ответами, он отлично определяет процесс переднего плана.
источник
Вот мой ответ, который работает просто отлично ...
Вы должны быть в состоянии получить текущую активность таким образом ... Если вы структурируете свое приложение с несколькими действиями с большим количеством фрагментов, и вы хотите отслеживать текущую активность, это займет много работы. Моим сенарио было то, что у меня есть одно задание с несколькими фрагментами. Поэтому я могу отслеживать текущую активность через объект приложения, который может хранить все текущее состояние глобальных переменных.
Вот способ. Когда вы запускаете свою активность, вы сохраняете эту активность с помощью Application.setCurrentActivity (getIntent ()); Это приложение будет хранить его. В своем классе обслуживания вы можете просто сделать так: Intent currentIntent = Application.getCurrentActivity (); . GetApplication () startActivity (currentIntent);
источник
Я не знаю, является ли это глупым ответом, но решил эту проблему, сохраняя флаг в общих настройках каждый раз, когда я вводил onCreate () любого действия, затем я использовал значение из общих предпочтений, чтобы выяснить, что это за приоритетное действие.
источник
Только недавно узнал об этом. С apis как:
targetSdkVersion 26
ActivityManager.getCurrentActivity (контекст)
Надеюсь, что это полезно.
источник
getCurrentActivity()
вActivityManager
классе нет функции ( developer.android.com/reference/android/app/ActivityManager ). Забавно , что эта функция не существует:ActivityManager.isUserAMonkey()
.