- Launcher activity android studio это
- Полный список
- DetailsActivity, как часть приложения
- WhatsNewActivity, отдельное от приложения
- Что такое Activity и его жизненный цикл в Android
- Жизненный цикл Activity
- Методы жизненного цикла
- Запуск Activity
- Запуск Activity без ожидаемого результата
- Запуск Activity на результат
- Пример запуска Activity
- Прерывание Activity
- Стадия экземпляра Activity
- Заключение
Launcher activity android studio это
Если очень грубо определить, что такое лаунчер, то это приложение, которое может представлять домашний экран устройства и показывать список работающих на устройстве приложений. Другими словами, лаунчер это то, что вы видите при нажатии кнопки Home на устройстве. Сейчас вы скорее всего используете стандартный лаунчер, который был установлен вместе с операционной системой. На Play Market существует множество таких программ, установив которые, вы можете видоизменить оформление своего аппарата:
Фактически каждый производитель смартфонов и планшетов имеет свой собственный лаунчер и стиль оформления (например, Samsung — TouchWiz, HTC — Sense).
В этом уроке мы научимся создавать простой лаунчер с базовым пользовательским интерфейсом. В нашем приложении будет два экрана:
— домашний экран, отображающий обои рабочего стола;
— экран, показывающий список установленных приложений и некоторую информацию о них;
Итак, начинаем. Создаем новый проект, названия традиционно оставляем по умолчанию, можете ввести какие нибудь свои. Минимальная версия для запуска приложения — Android 2.2, выбираем Blank Activity.
Сразу идем редактировать файл манифест приложения. Нам нужно добавить здесь 2 activity и задать им некоторые настройки. Открываем файл AndroidManifest.xml и добавим туда следующее:
В этот код мы добавили категории android.intent.category.HOME и android.intent.category.DEFAULT для того, чтобы наше приложение вело себя как лаунчер и отображалось при нажатии на кнопку Home устройства.
Также нужно настроить режим запуска launchMode на singleTask для того, чтобы на данный момент работает только одно нужное Activity. Для отображения пользовательской картинки на заставке, мы использовали настройку темы Theme.Wallpaper.NoTitleBar.FullScreen.
Второе activity, как уже было сказано, будет отображать установленные на устройстве приложения и немного информации о них. Для этой activity не будет использоваться никаких особенных настроек, назовем ее AppsListActivity:
Создадим xml файл разметки для будущего класса HomeActivity. В папке res/layout создаем файл по имени activity_home.xml. Он будет содержать всего одну кнопку, при нажатии на которую пользователь с домашнего экрана будет попадать на экран со списком установленных приложений:
Далее создаем файл xml для AppsListActivity в той же папке, назовем его activity_apps_list.xml. Он будет содержать ListView для отображения списка приложений:
Создаем еще один xml файл по имени list_item.xml. Этот файл будет определять вид заданного выше ListView. Каждый пункт списка будет представлять одно установленное на устройство приложение. Здесь будет отображаться иконка, название и имя пакета приложения. Отображение иконки будет происходить через элемент ImageView, а имя приложения и пакета в TextView:
Теперь нужно создать необходимые java классы. Когда будете создавать классы, убедитесь, что они связаны с данными в файле манифеста, что мы выполняли в начале.
Создаем в приложении файл HomeActivity.java, задаем ему наследование от класса Activity и настраиваем переход на другой экран со списком приложений при нажатии на кнопку, созданную нами ранее (подробный урок по созданию перехода):
Создаем еще одно activity с именем AppsListActivity.java. Настроим этому классу вид интерфейса с ранее созданного файла activity_apps_list.xml:
Уже сейчас можно попробовать протестировать приложение на эмуляторе/устройстве. Пока, что оно не обладает желаемым функционалом, но все же. Запустите приложение и нажмите кнопку Home, вы увидите окно в котором вам будет предложено выбрать лаунчер для запуска, стандартный и наш. Запускаем наш и видим примерно следующее:
Мы видим заставку рабочего стола и нашу кнопку запуска второго activity.
Полюбовались и хватит, возвращаемся к работе в Android Studio. Создаем еще один класс по имени AppDetail, который будет содержать более детальную информацию о приложении, название пакета, имя приложения и иконку. Код этого класса предельно простой и выглядит так:
В методе loadApps класса AppsListActivity мы используем метод queryIntentActivities, он нужен для того, чтобы выбрать все объекты Intent, которые имеют категорию Intent.CATEGORY_LAUNCHER. Запрос будет возвращать список приложений, которые могут быть запущены нашим лаунчером. Мы запускаем цикл по результатам запроса и создаем и добавляем каждый его пункт в список по имени apps. Чтобы реализовать все сказанное, добавляем следующий код:
Теперь нужно настроить отображение списка приложений. В созданном списке apps мы поместили все необходимые данные о приложении, теперь их надо отобразить в созданном в начале урока ListView. Для этого мы создаем ArrayAdapter и описываем метод getView, а также связываем ArrayAdapter с ListView:
Когда пользователь нажимает на пункты списка с приложениями, то наш лаунчер должен запускать соответствующее приложение. Это будет выполняться благодаря методу getLaunchIntentForPackage , создающего намерение Intent, запускающее нужное приложение:
Осталось собрать все описанные выше методы в один рабочий механизм. В классе AppsListActivity вызываем методы loadApps, loadListView и addClickListener:
Запускаем наше приложение. Теперь при нажатии на кнопку вызова второго activity «Show Apps» мы видим список из установленных приложений. При нажатии на выбранный элемент списка, мы будем запускать соответствующее приложение:
Поздравляю! Теперь в придачу до собственных калькулятора, браузера, конвертера и много другого, мы имеем еще и собственный Android Launcher. Надеюсь урок был вам интересен и полезен.
Источник
Полный список
В прошлом уроке мы уже рассмотрели, как отобразить Activity по нажатию на уведомление. Но там был простой случай. В этом уроке рассмотрим более интересные случаи.
Чтобы понимать все, о чем дальше пойдет речь, вам понадобятся знания об Activity Tasks Stack. Почитать об этом можно в документации или в Уроке 116.
Для примера возьмем почтовое приложение, состоящее из трех экранов: список писем (MainActivity), содержимое письма (DetailsActivity) и информация о новой версии (WhatsNewActivity). При запуске приложения MainActivity отображает письма, а по нажатию на письмо открывается DetailsActivity c содержимым письма.
У приложения есть какой-то сервис, который связан с сервером. Когда на сервере появляется новое письмо, сервис скачивает его и показывает пользователю уведомление. Пользователь нажимает на него и открывается DetailsActivity для просмотра письма.
Аналогично, сервис получает информацию о новой версии приложения и создает уведомление для этого события. По нажатию на уведомление будет открываться WhatsNewActivity, в котором будут подробно расписаны новые фичи приложения.
Но открывать два этих Activity мы будем разными способами.
DetailsActivity мы будем открывать так же, как если бы оно было открыто из MainActivity. Т.е. мы откроем сразу два Activity (одно за другим): MainActivity и DetailsActivity. Нажав Назад в открывшемся DetailsActivity пользователь попадет в MainActivity.
С экраном WhatsNewActivity ситуация другая. Он предназначен только для открытия из уведомления. Из приложения его открыть невозможно. Т.е. в приложении просто нет такого списка или такой кнопки, которые открыли бы WhatsNewActivity. Потому что это не особо важная информация, и, если вы вдруг сами захотели посмотреть ее, вы можете сходить на сайт приложения.
Давайте рассмотрим, как реализуются два этих варианта
DetailsActivity, как часть приложения
Сначала настроим DetailsActivity в манифесте:
Атрибут parentActivityName и тег meta-data здесь делают абсолютно одно и тоже — они сообщают, что DetailsActivity открывается из MainActivity. Т.е. MainActivity является родительским для DetailsActivity. Различие лишь в том, что meta-data работает для Android 4.0.3 и ниже, а parentActivityName — для Android 4.1 и выше. Т.е. указываем параметр parentActivity двумя разными способами для обеспечения совместимости. Если ваше приложение уже не поддерживает Android ниже 4.1, то meta-data вы можете не указывать.
Далее создаем уведомление. Все так же, как мы рассматривали в прошлом уроке. Отличаться будет только создание PendingIntent.
EXTRA_ITEM_ID — это ваша строковая константа
Рассмотрим по шагам, что здесь происходит.
Создаем обычный Intent для открытия DetailsActivity. Передаем туда id, чтобы Activity знало, какую информацию ему надо отобразить. Тут все понятно и обычно.
Затем создаем TaskStackBuilder — инструмент, который поможет нам сформировать последовательность вызовов Activity. Нам надо, чтобы сначала запустилось родительское Activity для DetailsActivity (т.е. MainActivity), а затем и само DetailsActivity.
Вызываем метод )» target=»_blank» rel=»noopener noreferrer»>addParentStack и указываем в нем DetailsActivity, т.е. просим в стек вызовов добавить Activity, которое является родительским для DetailsActivity. TaskStackBuilder идет в манифест и видит, что для DetailsActivity в качестве родительского (parentActivityName) прописано MainActivity. TaskStackBuilder добавляет MainActivity в стек вызовов.
В addNextIntent мы просто передаем Intent для запуска DetailsActivity. TaskStackBuilder добавит его в свой стек вызовов.
В итоге TaskStackBuilder содержит в стеке вызовов два Activity: сначала MainActivity, а затем DetailsActivity.
Методом getPendingIntent он формирует PendingIntent, который мы сможем передать в билдер уведомления. И по нажатию на уведомление будут открыты Activity, которые были в стеке вызовов, сформированном в TaskStackBuilder.
Запускаем, жмем на уведомление
И открываются два Activity. Нажав Назад в DetailsActivity мы попадаем в MainActivity.
Все работает, но осталась одна мелочь. Уведомление не закрывается по нажатию на него. Можно использовать setAutoCancel, как мы делали в прошлом уроке, но это не совсем правильно в данном случае.
Допустим вам приходит уведомление о новом письме. Но вы пока не открывали это уведомление, а решили сразу зайти в приложение, там уже увидели новое письмо, открыли его, прочитали и закрыли приложение. Письмо теперь прочитано вами, а уведомление продолжает висеть, хотя оно уже не актуально.
Правильнее будет удалять уведомление при открытии соответствующего ему письма. Рассмотрим, как это можно реализовать.
Код создания уведомления:
Весь код нам уже знаком. Пройдусь только по части id.
У вас есть id письма (itemId), пусть он будет long. Используя itemId, вы можете создать id для уведомления (notificationId) и далее указать его в методе notify.
Теперь, чтобы удалить уведомление, вам необходимо использовать такой же notificationId в методе cancel.
Реализуем это в DetailsActivity:
Достаем itemId из Intent. Из itemId снова формируем notificationId и используем его в методе cancel.
В результате, при открытии письма в DetailsActivity, уведомление, соответствующее этому письму, будет удалено. И неважно, пришли вы на этот экран сами или по нажатию на уведомление.
Важно, чтобы notificationId, используемый при показе и удалении уведомления совпадал. В нашем примере мы вычисляем его из itemId, просто взяв int часть от long. У вас может быть другой способ получения или формирования этого id.
WhatsNewActivity, отдельное от приложения
Рассмотрим другой вариант. Напомню, что он предполагает открытие Activity отдельно от приложения.
Для этого Activity должно быть настроено следующим образом в манифесте:
launchMode установлен в singleTask, чтобы Activity искало или создавало свой таск. taskAffinity делаем пустым, чтобы Activity не ушло в основной таск приложения. excludeFromRecents нужен, чтобы таск этого Activity не отображался в recent списке приложений.
Создание уведомления выполняется по обычной схеме, только в Intent надо добавить пару флагов, чтобы Activity стартовало в новом пустом таске
В итоге, по нажатию на уведомление будет открываться Activity в отдельном от вашего приложения таске.
И его не будет видно в списке последних запущенных приложений
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Что такое Activity и его жизненный цикл в Android
Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)
Из моей предыдущей статьи вы узнали, что Intents позволяют отправлять сообщения с одного компонента Android на другой. А очень важным компонентом является Activity.
Activities являются основной частью разработки приложений для Android. И невозможно понять Activity, не понимая их жизненных циклов. В этом материале вы узнаете всё о жизненном цикле Activity.
Жизненный цикл Activity
Activity — это отдельный экран в Android. Это как окно в приложении для рабочего стола, или фрейм в программе на Java. Activity позволяет вам разместить все ваши компоненты пользовательского интерфейса или виджеты на этом экране.
Важно понимать, что у Activity есть жизненный цикл, проще говоря, это означает, что она может быть в одном из различных стадий, в зависимости от того, что происходит с приложением при действиях пользователя.
Методы жизненного цикла
Давайте поближе рассмотрим жизненный цикл Android Activity. Каждый раз, когда Activity меняет стадию, вызывается один из следующих методов жизненного цикла для класса Activity.
onCreate() : вызывается при первой инициализации Activity. Вам нужно выполнить этот метод для выполнения любой инициализации в вашей Activity.
onStart() : это вызывается, когда Activity готова и отображается пользователю в первый раз, так как Activity готовится стать интерактивной и выйти на передний план. После завершения вызова этого метода, будет вызван метод onResume() .
onResume() : когда Activity переходит в это состояние, оно начинает взаимодействовать с пользователем. Activity продолжает работать в этом состоянии, пока что-либо не уведёт фокус от приложения или Activity (например, входящий звонок). Если это произойдет, будет вызван метод onPause() .
onPause() : этот метод используется для приостановки действий, которые не должны происходить, пока Activity в стадии паузы. Вызов этого метода указывает на то, что пользователь покинул приложение. К примеру, входящий звонок может перевести, проигрыватель музыки в состояние паузы. Это должно заглушить или остановить воспроизводящуюся музыку. Когда пользователь возвращается в приложение, вызывается метод onResume() .
onStop() : этот метод вызывается, если Activity больше не видна в приложении. Такое может случится, если подгружена другая Activity и она занимает весь экран устройства. Когда вызывает этот метод, Activity сообщается перейти в состояние прекращения работы. В этом состоянии, система либо вызывает onRestart() для возврата взаимодействия с Activity, либо вызывает метод onDestroy() , чтобу убрать Activity.
onDestroy() : этот метод вызывается перед тем, как Activity будет завершена. Система вызывает этот метод, когда пользователь завершает Activity, или если система временно убирает процесс, содержащий Activity, для высвобождения места. С этом методом, обязательно освободите любые ресурсы, созданные вашей Activity, иначе ваше приложение будет иметь утечку памяти.
onRestart() : это вызывается, если Activity перезапускается, после того, как было остановлено.
Запуск Activity
Большинство пользовательских взаимодействий приводит к изменению действующей Activity. Поэтому приложение моно раз переключается между Activity за свой жизненный цикл.
Необходимо связывать Activity друг с другом, если требуется чтобы одна Activity запускала другую. Для запуска Activity используйте либо startActivity() , либо startActivityForResult() . В обоих случаях вы должны передать Intent.
Запуск Activity без ожидаемого результата
startActivity() используется, если недавно запущенная Activity не должна возвращать результат.
Следующий фрагмент кода показывает как начать другую Activity, используя этот метод:
Можно также выполнять действия по передачи данных от одной Activity к другой. В этом случае, ваша текущая Activity (вызывающая Activity) хочет передать данные целевой Activity. Вот когда полезны Intents. Чтобы узнать больше об использовании Intents для запуска Activity, смотрите мой предыдущий урок.
Запуск Activity на результат
startActivityForResult() используется для запуска другой Activity и ожидает получение данных в эту свежезапущенную Activity. Другими словами, используйте это если хотите получить результат от целевой Activity в вызывающую Activity, т.е. если целевая Activity собирает некую пользовательскую информацию в модальном диалоговом окне.
Вы получите результат от Activity в методе onActivityResult(int requestCode, int resultCode, Intent data) . Результат будет возвращен в качестве Intent.
Пример запуска Activity
Вот пример, который показывает как работает запуск Activity
Во-первых создайте MainActivity с вашим методом onCreate() , файл макета и кодом запроса.
В методе onCreate() вы создадите новый экземпляр намерения (intent) чтобы запустить вторую Activity.
Когда будете готовы к запуску Activity, скажем в ответ на нажатие кнопки, вы вызовете startActivityForResult() , которая передаст свеже-созданное намерение и код запроса.
В вашей MainActivity , вам всё же нужно обработать результат событий Activity. Это выполняется путём реализации метода onActivityResult() . Вот так вы и получите результат от другой Activity.
Вот как это должно выглядеть:
Теперь создайте вашу SecondActivity . Это должно быть похоже на код ниже.
Прерывание Activity
Перед завершением Activity, будут вызваны соответствующие методы жизненного цикла.
Метод onPause() должен остановить все «слушания» и обновления интерфейса. Метод onStop() должен сохранять данные приложения. И наконец, метод onDestroy() высвободит любые ресурсы, выделенные для Activity.
Когда пользователь переключается обратно на приложение, которое было прервано системным событием, вызывается метод onResume() . На основе сохраненных данных, могут перерегистрироваться «слушатели» и переключиться обновления интерфейса.
Стадия экземпляра Activity
Activity нужен способ сохранить полезное состояние и пользовательские данные, которые она получила. Эти данные могут быть получены от пользователя или созданы, пока Activity не отображалась на экране.
Например, изменение ориентации устройства могут вызвать крушение Activity и её повторное создание. В этом случае, нужно убедиться, что сохранены все состояния Activity, прежде чем она распадётся и снова перезапустится. В противном случае, любые данные, которые были у вашей Activity в это время будут полностью утеряны.
Чтобы сохранить состояние Activity, можно переопределить метод onSaveInstanceState(). Этот метод передаёт объект Bundle , в качестве параметра. Пакет (bundle) может содержать строки, простые типы данных или объекты. В этом методе, просто добавьте любые данные о важном состоянии в пакет (bundle). Позже этот пакет вернется Activity, так что вы сможете восстановить состояние Activity.
Чтобы извлечь сохраненное состояние из пакета и восстановить его (состояние), примените метод onRestoreInstanceState() . Этот callback вызывается между методами жизненного цикла onStart() и onResume() .
Мы получше рассмотрим состояние экземпляра Activity в будущих статьях.
Заключение
После просмотра этого материла, вы хорошо поймете, как работает жизненный цикл Activity. И вы узнали, что есть два способа запуска Activity, а также получение указателей на то, как обрабатывается состояние экземпляра в жизненном цикле Activity.
Спасибо за чтение, и пока вы здесь, ознакомьтесь с некоторыми другими нашими материалами о кодировании приложений для Android.
Источник