В этом уроке узнаем, куда помещается Activity, пока его не видно. И откуда оно достается при нажатии кнопки назад. В хелпе об этом написано достаточно понятно. Я сделаю краткий перевод основной части этого хелпа и использую их схемы.
Task
Мы уже знаем, что приложение может содержать несколько Activity. И что Activity умеет вызывать Activity из других приложений с помощью Intent и Intent Filter. Если вы хотите отправить письмо из вашего приложения, вы вызываете Activity почтовой программы и передаете ей данные. Письмо уходит и вы возвращаетесь в ваше приложение. Создается ощущение, что все это происходило в рамках одного приложения.
Такая «бесшовность» достигается за счет того, что оба Activity (ваше и почтовое) были в одном Task.
Прежде, чем продолжу объяснять, хочу сразу привести аналогию, чтобы тему легче было понять. В скобках я буду давать понятия-аналоги из Android.
Механизм организации Activity в Android очень схож по реализации с навигацией в браузере. Вы находитесь в одной вкладке(Task) и открываете страницы (Activity) переходя по ссылкам (Intent). В любой момент можете вернуться на предыдущую страницу, нажав кнопку Назад.
Что такое Task и async/await
Но кнопка Вперед отсутствует, т.к. страница, на которой была нажата кнопка Назад, стирается из памяти. И надо снова нажимать ссылку, если хотим попасть на нее. Если вам надо открыть что-то новое, вы создаете новую вкладку и теперь уже в ней открываете страницы, переходите по ссылкам, возвращаетесь назад. В итоге у вас есть несколько вкладок. Большинство из них на заднем фоне, а одна (активная, с которой сейчас работаете) – на переднем.
В итоге список аналогий браузера и 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. Я буду называть его просто — стэк.
Схема (с офиц.сайта) демонстрирует пример:
Тормозит компьютер windows 10 глючит ❓ Быстрое удаление вирусов Security Task Manager
В верхней части то, что видит пользователь. В нижней – содержимое 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.
Давайте реализуем.
Все сохраняем и запускаем приложение.
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
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Источник: startandroid.ru
Task что это за программа и нужна ли она
Tasks.org: To-Do Lists по умолчанию»
Теги можно было бы интегрировать в текст в виде #тег — перемещались бы через Google Tasks на другие устройства
Желательно иметь поиск по тегам и мульти тегам.
Удивил выбор интервала поиска местоположения, к тому же с предостережением о повышении расхода зарядки — в других программах это как то вообще не представлено, внимание не акцентируется, батарея вроде не расходуется. В чем подвох?
01.07.15, 21:08 | #6
●
Не хватает выбора списка при запуске «по умолчанию»
Теги можно было бы интегрировать в текст в виде #тег — перемещались бы через Google Tasks на другие устройства
Желательно иметь поиск по тегам и мульти тегам.
Удивил выбор интервала поиска местоположения, к тому же с предостережением о повышении расхода зарядки — в других программах это как то вообще не представлено, внимание не акцентируется, батарея вроде не расходуется. В чем подвох?
«умолчальный список» я обычно вывожу виджетом Pure Calendar. Там много тонких настроек, которые обычно отсутствуют в других программах.
Раньше Astrid что-то добавлял в заголовки Google tasks. Теперь по-видимому он синхронизирует между устройствами только стандартные гугловские поля. Пока возился с тегами, не заметил этого. 🙁
Вот поиск мне здесь очень нравится. В правом верхнем углу выбирается опция: new filter.
У меня уже не помню в каком менеджере задач, умолчальная проверка геолокации хорошо так пожирала батарейку, пришлось даже запретить программе работать в фоне.
02.07.15, 22:30 | #7
●
добавлю еще одно важное замечание для тех кто интересуется данной программой. В программе используются два типа списков — один на основе google tasks, а второй собственный (на основе тегов, т.е. одна задача может быть сразу в разных списках). Ограничения в том, что собственные списки хранятся локально и не синхронизируются, а со списками google можно работать только в режиме просмотра (т.е отбирать задачи), но ни управлять ими, ни даже включать в них задачи пока нельзя.
Источник: 4pda.to
Какие плюсы и минусы у Task и Thread?
Гугл говорит мне что, класс Task это более высокоуровневый, современный и и менее ресурсоемкий способ писать программы с использованием многопоточности и лучше использовать только, а про Thread стоит вообще забыть.
Сегодня был на собеседовании, где люди пишут высокоэффективные, нагружённые решения на С# много лет. И когда я сказал «Task лучше Thread» на меня посмотрели как на идиота.
Видимо я чего-то не понимаю. Подскажите что и для каких целей лучше?
- Вопрос задан более года назад
- 939 просмотров
1 комментарий
Простой 1 комментарий
Ну там пишут, что Task — это абстракция, когда тебе неважно что это такое именно, тебе просто надо запустить что-то асинхронно. А Thread — это конкретно именно отдельный thread.
Другими словами, запуская что-то через Task, оно может выполиться в thread или в thread pool
А когда ты запускаешь Thread — это будет точно Thread.
Лучшего тут нет, зависит от того, что тебе нужно. В общем случае Task получается выгоднее, так как за тебя компилятор решит что тут лучше.
Решения вопроса 1
По сути таск это пул потоков, за которыми не нужно особо следить и ими легче пользоваться, а так же они могут возвращать значения. Их можно использовать, например для запросов на сервер, для разрузки основного потока — например что-то сложное посчитать. Thread то быстрее, но task дает больше возможностей и меньше внимания к себе
Ответ написан более года назад
Нравится 1 3 комментария
а Task хуже подходит для (допустим) больших вычислений потому что. почему? ему никогда не выделается ресурсов больше какой то границы, а Thread может использовать хоть все? или это какое то странное правило хорошего тона? или почему еще?
Thread то быстрее
Зависит от конкретной ситуации. Вообще, если правильно варить — примерно одинаково.
Task не обязательно будет грузить пул потоков.
Untiwe, я, в основном, использую Task. Thread использую редко. Task используется, где нужна высокая производительность. Например, при работе с несколькими однотипными устройствами по USB одновременно у Task выше скорость передачи данных. И Task хорош тем, что можно выделить конкретную задачу с автоматическим завершением.
Особенно в асинхронных. И управление данными в таком случае куда проще. Thread такое не позволяет, надо вручную им управлять. Иначе будут неизбежны ошибки. Обычно Thread выделяю там, где он будет работать на протяжении работы всей программы.
Или для выделения нескольких основных потоков. И то их там немного.
Ответы на вопрос 3
Какой вопрос — такой и ответ
Ответ написан более года назад
Нравится 2 7 комментариев
the promise of a result in the future
Это напоминает мне coroutines из python или promise из javascript где задачи выполняются из одного потока, просто он между ними переключается «под капотом» А это уже не отельные потоки как в Thread.
In general, I’d recommend that you use the higher level abstraction wherever you can: in modern C# code you should rarely need to explicitly start your own thread.
Это примерно то, что я сегодня сказал Task лучше Thread и на меня посмотрели как на идиота. Видимо или люди в компании чего то не понимают, или сам Джон Скит)
sharpcorner отвечает на мой вопрос
It can be used whenever you want to execute something in parallel. Asynchronous implementation is easy in a task, using’ async’ and ‘await’ keywords.
Why we need a Thread
When the time comes when the application is required to perform few tasks at the same time.
Но из этого ответа я так и не понял что и где лучше
Это напоминает мне coroutines из python или promise из javascript
Если пройти дальше по ссылке https://stackoverflow.com/questions/4130194/what-i. то там есть такое:
In computer science terms, a Task is a future or a promise. (Some people use those two terms synonymously, some use them differently, nobody can agree on a precise definition.) Basically, a Task «promises» to return you a T, but not right now honey, I’m kinda busy, why don’t you come back later?
Это примерно то, что я сегодня сказал Task лучше Thread и на меня посмотрели как на идиота
Так это от задач зависит. Task удобно использовать как просто «написал — и забыл», не особо заботясь что там и как будет выполняться. А у чуваков, видимо, задачи более низкоуровневые и им такие вольности с тасками не нравятся и хотят контролить потоки более тщательно.
Вы, видимо, в разных контекстах проблем общались.
Developer, это хорошо, но я так и не понял, что, для каких целей подходит лучше и почему?
Untiwe, Я бы попросил их объяснить почему они выбрали Thread вместо Task. Пусть проявят свои профессиональные качества 🙂 Это же собеседование — общение в обе стороны. Вот и выявишь некомпетентность их команды.
Источник: qna.habr.com
O!task
1.Создавай проекты, фиксируй сроки и бюджеты на проект
В каждом проекте есть возможность создавать неограниченное количество задач, блокнотов, а также фиксировать бюджет, заказчика и многое другое
2.Задачи в проекте в удобном формате — Список или Канбан
В задачах можно выставить сроки, задать приоритет, добавить вложение писать комментарии и многое другое
3.Объедени контакты всех своих клиентов, с возможностью выгрузки
По каждому клиенту можно увидеть общую сумму оплат, которую он принес и все проекты, которые заказал
4.Фиксируй доходы и расходы, с привязкой к проекту и клиенту
Данные о платежах учитываются как в каждом отдельном проекте, так и в общем разделе “Платежи”
5.Храни файлы проектов и любые другие файлы в облаке
В зависимости от тарифа тебе будет доступно до 50 Гб пространства в облаке для файлов
6.Приглашай коллег и работайте над проектом вместе
Система идеально подходит для небольших команд до 10 человек
Источник: a2is.ru