Урок 25. Task. Что это такое и как формируется
В этом уроке узнаем, куда помещается Activity, пока его не видно. И откуда оно достается при нажатии кнопки назад. В хелпе об этом написано достаточно понятно. Я сделаю краткий перевод основной части этого хелпа и использую их схемы.
Task
Мы уже знаем, что приложение может содержать несколько Activity. И что Activity умеет вызывать Activity из других приложений с помощью Intent и Intent Filter. Если вы хотите отправить письмо из вашего приложения, вы вызываете Activity почтовой программы и передаете ей данные. Письмо уходит и вы возвращаетесь в ваше приложение. Создается ощущение, что все это происходило в рамках одного приложения. Такая «бесшовность» достигается за счет того, что оба Activity (ваше и почтовое) были в одном Task.
Прежде, чем продолжу объяснять, хочу сразу привести аналогию, чтобы тему легче было понять. В скобках я буду давать понятия-аналоги из Android.
Механизм организации Activity в Android очень схож по реализации с навигацией в браузере. Вы находитесь в одной вкладке(Task) и открываете страницы (Activity) переходя по ссылкам (Intent). В любой момент можете вернуться на предыдущую страницу, нажав кнопку Назад. Но кнопка Вперед отсутствует, т.к. страница, на которой была нажата кнопка Назад, стирается из памяти. И надо снова нажимать ссылку, если хотим попасть на нее. Если вам надо открыть что-то новое, вы создаете новую вкладку и теперь уже в ней открываете страницы, переходите по ссылкам, возвращаетесь назад. В итоге у вас есть несколько вкладок. Большинство из них на заднем фоне, а одна (активная, с которой сейчас работаете) – на переднем.
В итоге список аналогий браузера и Android таков:
Теперь вам будет более понятен текст про Task.
Task – группа из нескольких Activity, с помощью которых пользователь выполняет определенную операцию. Обычно стартовая позиция для создания Task – это экран Домой (Home).
Находясь в Home вы вызываете какое-либо приложение из списка приложений или через ярлык. Создается Task. И Activity приложения (которое отмечено как MAIN в манифест-файле) помещается в этот Task как корневое. Task выходит на передний фон. Если же при вызове приложения, система обнаружила, что в фоне уже существует Task, соответствующий этому приложению, то она выведет его на передний план и создавать ничего не будет.
Когда Activity_A вызывает Activity_B, то Activity_B помещается на верх (в топ) Task и получает фокус. Activity_A остается в Task, но находится в состоянии Stopped (его не видно и оно не в фокусе). Далее, если пользователь жмет Back находясь в Activity_B, то Activity_B удаляется из Task и уничтожается. А Activity_A оказывается теперь на верху Task и получает фокус.
В каком порядке открывались (добавлялись в Task) Activity, в таком порядке они и содержатся в Task. Они никак специально не сортируются и не упорядочиваются внутри. Набор Activity в Task еще называют back stack. Я буду называть его просто — стэк.
Схема (с офиц.сайта) демонстрирует пример:
В верхней части то, что видит пользователь. В нижней – содержимое Task. Видно, как при вызове новых Activity они добавляются в верх стэка. А если нажата кнопка Назад, то верхнее Activity из стэка удаляется и отображается предыдущее Activity.
Допустим у нас есть Task с несколькими Activity. Он на переднем фоне, мы с ним работаем сейчас.
— если мы нажмем кнопку Home, то ничего не будет удалено, все Activity сохранятся в этом Task-е, а сам Task просто уйдет на задний фон и его всегда можно будет вызвать оттуда, снова вызвав приложение, Activity которого является корневым для Task-а. Либо можно удерживать кнопку Home и мы увидим как раз список Task-ов, которые расположены на заднем фоне.
— если же в активном Task-е несколько раз нажимать кнопку Назад, то в итоге в стэке не останется Activity, пустой Task будет удален и пользователь увидит экран Home.
Там еще как всегда куча нюансов и сложностей, но мы пока остановимся на этом и в дебри не полезем. Этих знаний вполне хватит, чтобы ответить на вопросы предыдущего урока: почему на шаге 2 MainActivity исчезло с экрана, но осталось висеть в памяти и не было уничтожено? Ведь на шаге 3 было уничтожено ActivityTwo после того, как оно пропало с экрана. А на шаге 4 было в итоге уничтожено и MainActivity. Почему шаг 2 стал исключением?
Теперь вы знаете, почему. Потому, что на шаге 2 MainActivity осталось в стэке, а ActivityTwo вставилось на верх стэка и получило фокус. Ну а на шаге 3 и 4 были удалены Activity из верха стэка, в Task не осталось Activity, и мы увидели экран Home.
Если бы мы на шаге 3 нажали не Back, а Home, то Task с обоими Activity ушел бы задний фон и ничего не было бы уничтожено.
Paused
Теперь давайте откроем проект с прошлого урока P0241_TwoActivityState. Мы хотели поймать состояние Paused для Activity. Это состояние означает, что Activity не в фокусе, но оно видно, пусть и частично. Мы можем этого добиться, если присвоим диалоговый стиль для ActivityTwo. Оно отобразится как всплывающее окно и под ним будет частично видно MainActivity – оно и будет в статусе Paused. Давайте реализуем.
Для этого открываем AndroidManifest.xml, вкладка Application, находим там ActivityTwo и справа в поле Theme пишем такой текст: @android:style/Theme.Dialog
Все сохраняем и запускаем приложение.
MainActivity: onCreate()
MainActivity: onStart()
MainActivity: onResume()
MainActivity: onPause()
ActivityTwo: onCreate()
ActivityTwo: onStart()
ActivityTwo: onResume()
Видим, что не был вызван метод onStop для MainActivity, а значит приложение не было переведено в состояние Stopped и находится в режиме Paused.
ActivityTwo: onPause()
MainActivity: onResume()
ActivityTwo: onStop()
ActivityTwo: onDestroy()
MainActivity восстановилось одним лишь вызовом onResume, а onStart не понадобился, т.к. оно было в состоянии Paused, а не Stopped.
Мы четко увидели разницу между этим примером и им же на прошлом уроке. И MainActivity у нас был в состоянии Paused.
Далее можно нажать Back, а можно Home — вы уже знаете, что произойдет в обоих случаях. По логам можно убедиться в этом.
Чтобы вернуть ActivityTwo нормальный режим отображения, зайдите снова в манифест и удалите строку из поля Theme.
Кстати, у вас уже вполне достаточно знаний, чтобы создать приложение с кучей Activity, прописать вызовы и поиграться, посмотреть логи. Тем самым закрепите темы LifeCycle и Task.
На следующем уроке:
— вызываем Activity используя неявный вызов и Intent Filter
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Tasks что это за папка
Сообщения: 156
Благодарности: 5
Автор: riaspb61
Дата: 20-02-2023
Здравствуйте. OC Win 7 32 prof. Собственно, вопрос в теме. Планировщик при запуске ругается на «Выбранная задача 0 больше не существует» и т.д. Тему http://forum.oszone.net/thread-246700.html изучал, но ничего не помогло, это сообщение продолжает появляться при запуске планировщика. Если я удалю вообще все из Tasks — это поможет? Или нет и наоборот, могут появиться проблемы с ОС? В C:\WINDOWS\Tasks ничего лишнего нет. Спасибо.
Сообщения: 20046
Благодарности: 3123
Цитата riaspb61:
Если я удалю вообще все из Tasks — это поможет? » |
Прежде чем удалять, заархивируйте эту папку, удаляйте и пробуйте.
Посмотрите тут
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\
——-
Хочу ли я — Могу ли я — Говно ли я — Магнолия
Это сообщение посчитали полезным следующие участники:
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Сообщения: 156
Благодарности: 5
Цитата yurfed:
Посмотрите тут Код: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\ » |
Сделал архив этой ветки реестра, все почистил в TaskCache\Tasks — не помогло, при запуске планировщика стал ругаться на разные задачи.
Сделал копию Windows\system32\Tasks, удалил все оттуда (содержимое каталогов Microsoft и WPD) вместе с нужной задачей — планировщик запустился корректно. Создал по новой нужную задачу — пока все хорошо. Спасибо.
Это сообщение посчитали полезным следующие участники:
Сообщения: 2597
Благодарности: 247
Цитата riaspb61:
Планировщик при запуске ругается на «Выбранная задача 0 больше не существует» и т.д. » |
а в самом планировщике посмотреть, какие есть задачи? И удалить ту, которой нету?
Сообщения: 156
Благодарности: 5
Цитата bredych:
а в самом планировщике посмотреть, какие есть задачи? И удалить ту, которой нету? » |
Я с этого начинал — там была одна моя задача (запуск cmd-файла по расписанию, обновление Консультанта Плюс). Больше в самом планировщике ничего не было. Но он продолжал ругаться «Выбранная задача 0 больше не существует». Найти, что это за задача, я так и не смог. Пришлось очистить все.
Подскажите что за папка C:\WINDOWS\Tasks. Там имеется ярлык добавить задания. Можно ли все это удалить?
Там есть задания на программы которых уже нет. Остальные тоже непонятно что. Может ли все это тормозить систему?
Лучший ответ
Эта папка планировщика заданий. В ней по умолчанию ничего не должно быть кроме 2х скрытых файлов (desktop.ini и sa.dat). Все остальное можно удалить.
Давид КолесникУченик (116) 2 года назад
что будет если удалить desktop.ini и sa.dat
catgame .Ученик (199) 1 год назад
что делать если там нет desktop.ini??
Остальные ответы
используй windowsfix.ru
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.
Tasks. Программа для хранения списка дел под Android
Когда-то давно я писал про такую замечательную программу для хранения списка дел под Android как DGT GTD, которой я пользовался больше двух лет, периодически поглядывая на другие подобные программы, но все они были не настолько удобные, как эта. В принципе, она меня практически всем устраивала кроме одной мелочи. Дело в том, что в свое время после прочтения книги Дэвида Аллена «Как привести дела в порядок», который и создал принцип GTD, я вдохновился идеей разделения задач на сроки выполнения, когда выполнение каких-то задач намечается на определенную дату, но другие задачи помещаются в папку «Сделать в ближайшее время» или «Сделать когда-нибудь». Вот эта папка «Сделать в ближайшее время» очень помогает в выборе того, за какую задачу взяться в данный момент или какие задачи запланировать себе на завтра. Поэтому хотелось бы, чтобы такие задачи всегда отображались в виджете на экране телефона сразу после задач, запланированных на определенную дату. К сожалению, виджет DGT GTD позволяет отображать или задачи из определенной папки, или задачи, которые выполнение которых запланировано на ближайшее время.
DGT GTD, в принципе, позволяет сделать что-то подобное — его виджет может отображать не только задачи, приписанные к определенным датам, но и так называемые «Избранные задачи». Но сама идея избранных задач мне как-то не нравилась, чувствуешь, что используешь инструмент не по назначению. Еще в DGT GTD есть возможность установить для задачи «плавающую» дату, это значит, что если вы не выполнили какую-то запланированную на сегодня задачу, то она не становится просроченной, а просто ее дата выполнения переносится на завтра. С помощью такого поведения также можно организовать папку «Сделать в ближайшее время», но это еще более обходной путь.
И вот тут мне попалась бесплатная программа с «оригинальным» названием Tasks с припиской «Astrid To-Do List Clone». Особенно в ней подкупило то, что это программа с открытыми исходниками, которые можно скачать с github. Как я понял, исходный Astrid — это программа для хранения списка дел, которую развивал Yahoo!, но несколько лет назад проект закрыли, хотя ее исходники также можно найти на github.
Основной способ разделения задач в Tasks — это теги, которые по сути выполняют задачу папок с той разницей, что одной задаче можно присвоить сразу несколько тегов.
На самом деле для задач использование тегов вместо папок удобно, поскольку есть задачи, которые могут относиться к разным категориям, да и не обязательно теги должны выполнять задачу папок. Например, в Tasks, к сожалению, нет такого понятия как проект, для выполнения которого нужно выполнить ряд задач (или, говоря другими словами, нет вложенных задач), но роль проектов для объединения задач могут взять на себя теги. К сожалению, в этом случае визуально теги-папки и теги-проекты не будут отличаться, но если у вас не так много проектов, то это может быть не так страшно.
Меня программа Tasks подкупила другой возможностью — фильтрами задач. Вы можете создать фильтры, которые будут всегда показаны в боковом списке до тегов, при этом фильтры могут задаваться в виде: задачи, которые удовлетворяют условию A или условию B. Например, не следующем скриншоте видны фильтры «Ближайшее», «Завтра» и «Неделя».
Всего есть пять условий для фильтров, которые можно использовать:
- Задача помечена тегом.
- Имя тега содержит…
- Конечный срок выполнения задачи.
- Приоритет задачи.
- Название задачи содержит…
При этом фильтр может содержать несколько условий, объединенных логическими операциями «И», «ИЛИ», «И НЕ».
Вот, например, как выглядит фильтр «Ближайшее», в который попадают задачи, которые нужно выполнить в течение недели или помеченные тегом «Next» (этим тегом я помечаю задачи, которые нужно выполнить в первую очередь, но конкретная дата для них может быть еще не назначена).
Фильтры особенно полезны тем, что виджет для рабочего стола, который прилагается к Tasks, позволяет отображать определенный фильтр, таким образом, например, у меня фильтр «Ближайшее» всегда виден, и для того, чтобы посмотреть, что мне нужно сделать в ближайшее время, мне не нужно запускать программу.
Что касается возможностей описания задач, то без излишеств, но основные параметры задавать можно.
Для каждой задачи вы можете задавать:
- Название.
- Срок для выполнения.
- Периодичность повторения задачи.
- Приоритет (всего имеется 4 приоритета).
- Теги.
- Напоминание (о напоминаниях я скажу чуть позже).
- Описание.
- Дату, до которой не стоит показывать задачу в списке.
- Время, которое вы планируете потратить на выполнение задачи, и время, которое вы уже на нее потратили.
Напоминание может срабатывать не только по времени, но и в пространстве, т.е. вы можете задать место, при нахождении в ε-окрестности которого вы будете уведомлены, что здесь вы должны что-то сделать. Удобно для напоминания о том, что надо что-то купить в ближайшем магазине. Правда, сами координаты задаются не очень удобно, хотелось бы их отмечать на карте, но приходится ограничиваться лишь поиском по адресу или названию.
Еще к недостаткам можно отнести странное поведение виджета при смене дня. Я так и не понял, в какой момент задачи в виджете переходят из состояния «Завтра» в состояние «Сегодня», причем в самой программе все нормально, но утром задачи, запланированные на данное число часто остаются «завтрашними». Иногда список обновляется при каком-то небольшом изменении, например, если поставить галку напротив уже выполненного пункта, иногда обновляется сам. В общем, какой-то глюк.
На данный момент я продолжаю пользоваться программой Tasks в основном из-за фильтров, но периодически поглядываю на другие подобные программы, но пока ничего больше у меня не прижилось. Может быть скоро я напишу отдельный пост про то, как я организую свои задачи и про то, что хотелось бы видеть в программе для хранения списка задач.
PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.