- Activity task manager android
- a) Task Affinity:
- In general, what is affinity?
- Where can one define Task Affinity?
- b) Launch modes:
- 1. “standard”:
- 2. “singleTop”
- 3. “singleTask”
- 4. “singleInstance”
- General Note on using “singleTask” & “singleInstance”:
- 1. “FLAG_ACTIVITY_NEW_TASK”:
- Notes:
- 2. “FLAG_ACTIVITY_SINGLE_TOP”:
- 3. “FLAG_ACTIVITY_CLEAR_TOP”:
- Русские Блоги
- Процесс запуска Activity и ActivityManagerService
Activity task manager android
Activity Express Task Manager
версия: 1.22
Последнее обновление программы в шапке: 04.02.2011
Описание:
Программа похожа на jkAppSwitch, а значит ничего лишнего, всё просто, удобно, информативно.
Основные возможности:
Работает на 2.2
Удобный интерфейс (большие кнопки)
По короткому тапу переключается на приложение
По длинному тапу убивает процесс
Умеет:
Автозапускаться
Отключать иконку
Показывать кол-во процессов и свободный объём памяти
Показывать сколько занимает ОЗУ отдельный процесс
Настраивать действие при нажатии на пиктограмме программы
Настраивать отображение списка программ/процессов
Сообщение отредактировал vadeus — 28.12.14, 19:38
из замеченного-
1-слишком крупное меню. если запущенно несколько приложений (или когда показны фоновые процессы) ,то приходится пролитывать список. мне это не совсем удобно.
2-не нашел как поставить открытие приложения на хард кнопку!! это надо ярлык выносить на рабочий стол. или задумывается виджет?
3-очень удобно сделана настройка действия на короткий/длинный тап. но как то подтупливает при переключении, убивании.
всё ок. по интерфейсу лучше чем ТаскКиллер «системную» часть ещё не смотрел как работает.
в начале первый раз лаг когда завершаешь саму себя телефон пару секунд лагает ничего нажать нельзя, но потом всё это обрабатывается.
Если по функционалу всё будет ок и баг пофиксят буду пользоваться 100%.
нашёл когда выделяешь галочкой, потом жмёшь закрыть отмеченные всё ок, но всё же не так быстро как просто долгим закрыть.
ООООчень порадовала поддержка системных процессов.
Можно добавить ещё просто кнопку где-то рядом с свободной памятью чтобы выгружало приложения пользователя или пользователя+которые он занёс в некий список.
Сообщение отредактировал MaZaXAkA01rus — 13.11.10, 02:46
Обновление: Activity Express Task Manager 1.22
Новое в версии:
- Изменение интерфейса: крупные иконки /крупный шрифт
- Перестал сам себя показывать в списке процессов (опция)
- Множественный выбор процессов
- Сортировка процессов по имени и размеру
- Возможность убирать приложения с SU правами
- Автозакрытие простаивающих процессов (опция сохранения батарейки)
- Отключение графического интерфейса (опция сохранения батарейки)
Источник
a) Task Affinity:
In general, what is affinity?
Like all of you have affinity for Android App Development,
Activities also have affinity towards default package, that is the reason all the Activities in one App falls under one task, by default.
Where can one define Task Affinity?
You define affinity per activity in your AndroidManifest.xml.
Affinity of an Activity is defined by following attribute within tag:
This parameter accepts a String. By default, every activity has same affinity as your package attribute value of mainfest tag.
Affinity of a Task is defined by the affinity of its root Activity.
b) Launch modes:
It is used to instructs Android system on how to launch a particular activity.
Two ways to define launchMode for an Activity:
Defining launch modes in Manifest File:
1. “standard”:
This is the default mode. In case you don’t define any launchMode, the new activity is launched in standard mode.
Here, a new instance of the Activity will be created — everytime.
2. “singleTop”
This is just as same as “standard” mode, except for — Android will perform an extra check “whether this activity is already on the top of the Activity Stack.”
If YES, then it won’t create a new instance of the Activity but instead it will call the onNewIntent() of the same Activity.
Have a look at the Activity Stack for “standard” & “singleTop” launch modes. Consider the Activity Intent order as: A → B → B → B
3. “singleTask”
Here, the referred Activity will be launched in the new Task.
(PS: You can notice this in Recents window)
So, you just define “launchMode”: “singleTask” and it will all work magically, huh?
Your current activity has to have a “taskAffinity” value defined other than the default package name. Or else, even though you have tagged it as “singleTask” it will still open it in the same damn Task.
One last important point to note is:
You CAN still have other Activities coming on top of this Activity, even in the newly created Task.
4. “singleInstance”
Well, this is exactly same as “singleTask” with one teeny-tiny difference.
That is:
You CANNOT have other Activities coming on top of this Activity. This Activity is a lone warrior in the Tasks playground. 😎
General Note on using “singleTask” & “singleInstance”:
When you launch an activity with a launchMode defined in Manifest, the Android system looks for the taskAffinity first. Then in the main stack of Tasks (i.e. Recents screen), Android checks if there is a task already present with the root Activity having same taskAffinity as the one for intended Activity, if Yes , then the Activity is opened in that task, else a new task is created and with Intended Activity placed at its root .
Defining launch modes using Intent Flags:
1. “FLAG_ACTIVITY_NEW_TASK”:
Now, putting it straight — this is just as same behaviour as
launchMode — singleTask.
Here, you do the same thing programmatically while creating your Intent for new Activity. Your code will look something like this:
Notes:
a) If you haven’t defined taskAffinity value different from the default one, setting this flag will have no effect. (Just like you did when using launchMode — singleTask)
b) The default behaviour of back press on newly created activity in a new task is — GO TO HOMESCREEN. If you want to go back to the Activity in your main task, that started this new Activity, then you have to define it in Manifest of your app. See the following snippet:
2. “FLAG_ACTIVITY_SINGLE_TOP”:
Again, this is same as launchMode — singleTop. You have to set the Intent Flag as follows:
Now, if the Activity to be launched is on the Top of the Activity stack, then instead of creating a new Activity, it will call onNewIntent() of the already open Activity. A sample snippet is as follows:
3. “FLAG_ACTIVITY_CLEAR_TOP”:
There are two scenarios of use here:
a) All Activities in the same Task:
As expected, this flag will clear all the Activities on the top of Intended Activity in the stack and bring it to Foreground.
b) Activities spread across different tasks:
If this flag is set along with FLAG_ACTIVITY_NEW_TASK then the system will bring the required Task that contains the intended Activity to Foreground, and clear all the Activities on the top of that Activity.
That will be a wrap on Android Tasks from my side.
Источник
Русские Блоги
Процесс запуска Activity и ActivityManagerService
Версия SDK: 29.0.2
Начните с процесса запуска Android.
Запуск устройства Android должен пройти три этапа: загрузчик, ядро Linux и системная служба Android, и первый запускаемый процесс — это процесс init, а затем другие процессы создаются процессом init (среди них процесс Zygote). Процесс ServiceManager используется для механизма Binder, но я не буду упоминать его здесь. ActivityManagerService зарегистрирован в SystemServer и создает поток для выполнения работы при запуске системы. SystemServer создается процессом Zygote (большинство процессов приложений и системных процессов Android создаются им), а вход является основной функцией ZygoteInit:
Процесс Zygote вызывает собственный метод и разветвляет процесс SystemServer. Просто поймите описанные выше шаги, сосредоточившись на ActivityManagerService. ① ^ <①>① Кода достаточно. Поскольку SystemServer находится в новом процессе, давайте посмотрим на основную функцию SystemServer:
Он получает экземпляр Lifecycle через SystemServiceManager, а затем вызывает метод getService для получения экземпляра ActivityManagerService, чтобы SystemServer удерживал этот экземпляр.
Однако ActivityManagerService еще не запущен. Давайте посмотрим на метод startService. Он вызывает абстрактный метод onStart SystemService, а ActivityManagerService.Lifecycle наследует от него.
Таким образом, даже если ActivityManagerService запущен (ActivityManagerService также выполняет ряд настроек в методе startBootstrapServices, который здесь не будет).
ActivityManagerService содержит класс ActivityTaskManagerService, который описывается следующим образом:
Тогда ActivityManagerService по-прежнему содержит этот объект.Когда только что вызывается метод построения ActivityManagerService, он начинает создавать ActivityTaskManagerService.
Откуда приходит ActivityTaskManagerService? Напомним, что этот метод построения был вызван в методе startService ActivityManagerService.Lifecycle, и он был вызван из startBootstrapServices SytemServer. Оглядываясь назад, мы увидели:
Этот парень также был создан с использованием того же метода, продолжайте следить:
ActivityManagerService получает экземпляр ActivityTaskManagerService.
Вернемся к методу run класса SystemServer и посмотрим вниз:
Не обращайте внимания на основные сервисы, просто посмотрите на другие сервисы:
Он вызывает метод startHomeOnAllDisplays объекта ActivityTaskManagerInternal для запуска рабочего стола. Однако ActivityTaskManagerInternal является абстрактным классом, и ActivityManagerService.LocalService наследует его. И он вызывает RootActivityContainer.startHomeOnAllDisplays.
Он создается ActivityTaskManagerService:
При создании ActivityManagerService создается RootActivityContainer.
Что такое ActivityDisplay?
Поскольку Android поддерживает многоэкранный дисплей, mActivityDisplays сохраняет ActivityStack на физическом экране. ActivityStack включает TaskStack, а TaskStack включает ActivityRecord.
Носильщик здесь, следующий текст и изображения взяты из информационной ссылки, указанной в начале:
Поле на рисунке можно понимать как содержащуюся связь: например, TaskRecord содержит несколько ActivityRecords; соединительную линию на рисунке можно понимать как эквивалентную взаимосвязь, например, на ActivityRecord будут ссылаться TaskRecord и ProcessRecord, они разные Размеры для управления ActivityRecord.
- ActivityRecord — это наименьшая единица управления Activity, соответствующая пользовательскому интерфейсу и основная единица планирования Activity в AMS.
- TaskRecord — это структура управления стеком. Каждая TaskRecord может иметь одну или несколько ActivityRecords. ActivityRecord в верхней части стека представляет видимый в данный момент интерфейс. При запуске Activity вам необходимо найти хост-задачу Activity. Если она не существует, вам нужно создать новую, что означает, что все ActivityRecords должны иметь хост.
- ActivityStack — это структура управления стеком. Каждый ActivityStack может иметь одну или несколько TaskRecords. TaskRecord в верхней части стека представляет видимые в данный момент задачи.
- ActivityStackSupervisor управляет несколькими ActivityStack, но в настоящее время существует только один Focused ActivityStack.
- ProcessRecord записывает все ActivityRecords, принадлежащие процессу. ActivityRecords, запущенные в разных TaskRecord, могут принадлежать одному и тому же ProcessRecord. AMS использует структуру данных ProcessRecord для поддержания информации о состоянии процесса во время выполнения.Когда создается системный процесс (system_process) или процесс приложения, ProcessRecord инициализируется через AMS.
Однако вышеприведенной статье 16 лет, и в настоящее время могут быть некоторые изменения, но это не мешает нам понять ее механизм. Далее продолжайте следить (мои английские подонки не переведут следующие комментарии):
Вы это видели? У меня есть экземпляр с именем homeIntent, а затем он называется startHomeActivity. Перед этим давайте посмотрим, что находится перед ним:
Откуда взялась Фабрика?
Давайте сначала посмотрим на эти два новых класса:
Тогда посмотрите вниз:
HomeActivity запускается через класс ActivityStarter. Личные возможности ограничены, поэтому я не буду анализировать их дальше. После запуска рабочего стола запустите приложение с рабочего стола. Поскольку рабочий стол также является Activity, мы можем рассматривать проблему как Activity, запускающую Activity. Давайте посмотрим на метод Activity startActivity:
startActivity вызывает startActivityForResult:
Переменная mParent относится к типу Activity, и все они вызывают метод Instrumentation.execStartActivity. Что такое приборы?
Его мощная функция отслеживания жизненного цикла приложения и активности обычно используется в среде тестирования приложений Android, но я не буду здесь упоминать об этом.
Хорошо, затем спуститесь и углубитесь ♂ в:
IActivityTaskManager.Stub.asInterface (b) использует AIDL для генерации IActivityManager (здесь нет исходного кода, его нельзя отследить) и возвращает класс реализации ActivityManagerService. Отследите его метод startActivity:
mActivityTaskManager ранее сказал, что это ссылка на ActivityTaskManagerService, если вы забыли, где его взять, вернитесь и посмотрите.
Это то же самое, что и запуск homeActivity, упомянутого ранее, ActivityManagerService и даже процесс создания Activity. (Он проанализировал третью статью, приведенную в начале статьи, и те, кому интересно, могут продолжить работу)
Примечания:
① ActivityManagerService фактически не только управляет Activity, но также управляет четырьмя основными компонентами. Предоставляются управление и запрос состояния компонентов, задач, состояния информации о батарее, услуги управления полномочиями и вспомогательные функции для запроса информации во время работы системы.
Источник