- Книга «Android. Программирование для профессионалов. 3-е издание»
- Структура книги
- Множественные загрузки
- Взаимодействие с главным потоком
- Создание фонового потока
- Программирование для профессионалов android 2016
- Книга «Android. Программирование для профессионалов. 4-е издание»
- GeoQuiz
- CriminalIntent
- BeatBox
- NerdLauncher
- PhotoGallery
- DragAndDraw
- Sunset
- Подробнее об интентах и задачах
- Создание приложения NerdLauncher
- Обработка неявного интента
- Создание явных интентов на стадии выполнения
Книга «Android. Программирование для профессионалов. 3-е издание»
Третье издание познакомит вас с интегрированной средой Android Studio, которая сильно облегчает разработку приложений. Вы не только изучите основы программирования, но и узнаете о возможностях самых распространенных версий Android; новых инструментах, таких как макеты с ограничениями и связывание данных; модульном тестировании; средствах доступности; архитектурном стиле MVVM; локализации; новой системе разрешений времени выполнения. Все учебные приложения были спроектированы таким образом, чтобы продемонстрировать важные концепции и приемы программирования под Android и дать опыт их практического применения.
Под катом более подробно о книге и отрывок из книги «Множественные загрузки»
Структура книги
В этой книге мы напишем восемь приложений для Android. Два приложения очень просты, и на их создание уходит всего одна глава. Другие приложения часто оказываются более сложными, а самое длинное приложение занимает 13 глав. Все приложения спроектированы так, чтобы продемонстрировать важные концепции и приемы и дать опыт их практического применения.
• GeoQuiz — в первом приложении мы исследуем основные принципы создания проектов Android, активности, макеты и явные интенты.
• CriminalIntent — самое большое приложение в книге, предназначено для хранения информации о проступках ваших коллег по офису. Вы научитесь использовать фрагменты, интерфейсы «главное-детализированное представление», списковые интерфейсы, меню, камеру, неявные интенты и многое другое.
• BeatBox — наведите ужас на своих врагов и узнайте больше о фрагментах, воспроизведении мультимедийного контента, архитектуре MVVM, связывании данных, тестировании, темах и графических объектах.
• NerdLauncher — нестандартный лаунчер, раскроет тонкости работы системы интентов и задач.
• PhotoGallery — клиент Flickr для загрузки и отображения фотографий из общедоступной базы
Flickr. Приложение демонстрирует работу со службами, многопоточное программирование, обращения к веб-службам и т. д.
• DragAndDraw — в этом простом графическом приложении рассматривается обработка событий касания и создание нестандартных представлений.
• Sunset — в этом «игрушечном» приложении вы создадите красивое представление заката над водой, а заодно освоите тонкости анимации.
• Locatr — приложение позволяет обращаться к сервису Flickr за изображениями окрестностей вашего текущего местонахождения и отображать их на карте. Вы научитесь пользоваться сервисом геопозиционирования и картами.
Множественные загрузки
В настоящее время сетевая часть PhotoGallery работает следующим образом: PhotoGalleryFragment запускает экземпляр AsyncTask, который получает JSON от Flickr в фоновом потоке, и разбирает JSON в массив объектов GalleryItem. В каждом объекте GalleryItem теперь хранится URL, по которому находится миниатюрная версия фотографии.
Следующим шагом должна стать загрузка этих миниатюр. Казалось бы, дополнительный сетевой код можно просто добавить в метод doInBackground() класса FetchItemsTask. Массив объектов GalleryItem содержит 100 URL-адресов для загрузки. Изображения будут загружаться одно за одним, пока у вас не появятся все сто. При выполнении onPostExecute(…) они все вместе появятся в RecyclerView.
Однако единовременная загрузка всех миниатюр создает две проблемы. Во-первых, она займет довольно много времени, а пользовательский интерфейс не будет обновляться до момента ее завершения. На медленном подключении пользователям придется долго рассматривать стену из Биллов.
Во-вторых, хранение полного набора изображений требует ресурсов. Сотня миниатюр легко уместится в памяти. Но что, если их будет 1000? Что, если вы захотите реализовать бесконечную прокрутку? Со временем свободная память будет исчерпана.
С учетом этих проблем реальные приложения часто загружают изображения только тогда, когда они должны выводиться на экране. Загрузка по мере надобности предъявляет дополнительные требования к RecyclerView и его адаптеру. Адаптер инициирует загрузку изображения как часть реализации onBindViewHolder(…).
AsyncTask — самый простой способ получения фоновых потоков, но для многократно выполняемых и продолжительных операций этот механизм изначально малопригоден. (О том, почему это так, рассказано в разделе «Для любознательных» в конце этой главы.)
Вместо использования AsyncTask мы создадим специализированный фоновый поток. Это самый распространенный способ реализации загрузки по мере надобности.
Взаимодействие с главным потоком
Специализированный поток будет загружать фотографии, но как он будет взаимодействовать с адаптером RecyclerView для их отображения, если он не может напрямую обращаться к главному потоку?
Вспомните пример с обувным магазином и двумя продавцами-Флэшами. Фоновый Флэш завершил свой телефонный разговор с поставщиком, и теперь ему нужно сообщить Главному Флэшу о том, что обувь была заказана. Если Главный Флэш занят, Фоновый Флэш не может сделать это немедленно. Ему придется подождать у стойки и перехватить Главного Флэша в свободный момент. Такая схема работает, но не слишком эффективно.
Лучше дать каждому Флэшу по почтовому ящику. Фоновый Флэш пишет сообщение о том, что обувь заказана, и кладет его в ящик Главного Флэша. Главный Флэш делает то же самое, когда он хочет сообщить Фоновому Флэшу о том, что какой-то товар закончился.
Идея почтового ящика чрезвычайно полезна. Возможно, у продавца имеется задача, которая должна быть выполнена скоро, но не прямо сейчас. В таком случае он кладет сообщение в свой почтовый ящик и обрабатывает его в свободное время.
В Android такой «почтовый ящик», используемый потоками, называется очередью сообщений (message queue). Поток, работающий с использованием очереди сообщений, называется циклом сообщений (message loop); он снова и снова проверяет новые сообщения, которые могли появиться в очереди (рис. 26.3).
Цикл сообщений состоит из потока и объекта Looper, управляющего очередью сообщений потока.
Главный поток представляет собой цикл сообщений, и у него есть управляющий объект, который извлекает сообщения из очереди сообщений и выполняет задачу, описанную в сообщении.
Мы создадим фоновый поток, который тоже использует цикл сообщений. При этом будет использоваться класс HandlerThread, который предоставляет готовый объект Looper.
Создание фонового потока
Создайте новый класс с именем ThumbnailDownloader, расширяющий HandlerThread. Определите для него конструктор и заглушку реализации метода с именем queueThumbnail() (листинг 26.4).
Листинг 26.4. Исходная версия кода потока (ThumbnailDownloader.java)
Классу передается один обобщенный аргумент . Пользователю ThumbnailDownloader понадобится объект для идентификации каждой загрузки и определения элемента пользовательского интерфейса, который должен обновляться после завершения загрузки. Вместо того чтобы ограничивать пользователя одним конкретным типом объекта, мы используем обобщенный параметр и сделаем реализацию более гибкой.
Метод queueThumbnail() ожидает получить объект типа T, выполняющий функции идентификатора загрузки, и String с URL-адресом для загрузки. Этот метод будет вызываться PhotoAdapter в его реализации onBindViewHolder(…).
Откройте файл PhotoGalleryFragment.java. Определите в PhotoGalleryFragment поле типа ThumbnailDownloader. В методе onCreate(…) создайте поток и запустите его. Переопределите метод onDestroy() для завершения потока.
Листинг 26.5. Создание класса ThumbnailDownloader (PhotoGalleryFragment.java)
В обобщенном аргументе ThumbnailDownloader можно указать любой тип. Однако вспомните, что этот аргумент задает тип объекта, который будет использоваться в качестве идентификатора для загрузки. В данном случае в качестве идентификатора удобно использовать объект PhotoHolder, так как он заодно определяет место, куда в конечном итоге поступят загруженные изображения.
Пара примечаний: во-первых, обратите внимание на то, что вызов getLooper() следует после вызова start() для ThumbnailDownloader (вскоре мы рассмотрим объект Looper более подробно). Тем самым гарантируется, что внутреннее состояние потока готово для продолжения, чтобы исключить теоретически возможную (хотя и редко встречающуюся) ситуацию гонки (race condition). До вызова getLooper() ничто не гарантирует, что метод onLooperPrepared() был вызван, поэтому существует вероятность того, что вызов queueThumbnail(…) завершится неудачей так как ссылка на Handler равна null.
Во-вторых, вызов quit() завершает поток внутри onDestroy(). Это очень важный момент. Если не завершать потоки HandlerThread, они никогда не умрут, словно зомби. Или рок-н-ролл.
Наконец, в методе PhotoAdapter.onBindViewHolder(…) вызовите метод queueThumbnail() потока и передайте ему объект PhotoHolder, в котором в конечном итоге будет размещено изображение, и URL-адрес объекта GalleryItem для загрузки.
Листинг 26.6. Подключение ThumbnailDownloader (PhotoGalleryFragment.java)
Запустите приложение PhotoGallery и проверьте данные LogCat. При прокрутке RecyclerView в LogCat появляются строки, сообщающие о том, что ThumbnailDownloader получает все запросы на загрузку.
Теперь, когда наша реализация HandlerThread заработала, следующим шагом становится создание сообщения с информацией, переданной queueThumbnail(), и его размещение в очереди сообщений ThumbnailDownloader.
Для Хаброжителей скидка 20% по купону — Android
Источник
Программирование для профессионалов android 2016
Библиотека программиста запись закреплена
Android. Программирование для профессионалов (2016) / Android Programming: The Big Nerd Ranch Guide (2013, pdf)
Авторы: Б. Харди, Б. Филлипс, К. Стюарт, К. Марсикано
Изучение Android — все равно, что жизнь в другой стране: даже если вы говорите на местном языке, на первых порах вы все равно не чувствуете себя как дома. Такое впечатление, что все окружающие знают что-то такое, чего вы еще не понимаете. И даже то, что уже известно, в новом контексте оказывается попросту неправильным.
Второе издание познакомит вас с интегрированной средой разработки Android Studio, которая поможет с легкостью создавать приложения для Android. Вы не только изучите основы программирования, но и узнаете о возможностях Lollipop, новых инструментах вспомогательных библиотек, а также некоторых ключевых инструментах стандартной библиотеки, включая SoundPool, анимацию и ресурсы. Все учебные приложения были спроектированы таким образом, чтобы продемонстрировать важные концепции и приемы программирования под Android и дать опыт их практического применения.
К посту прикреплена полная книга на английском языке в формате pdf.
Источник
Книга «Android. Программирование для профессионалов. 4-е издание»
Привет, Хаброжители! Познакомьтесь с возможностями программирования Android на языке Kotlin! Множество примеров приложений с четкими объяснениями ключевых концепций и API позволят легко разобраться в самых трудных задачах.
Эта книга посвящена прикладным методам разработки приложений на Kotlin, и подойдет для всех версий Android от 5.0 (Lollipop) до 8.1 (Oreo) и выше. Используйте Android Studio для создания приложений, чтобы проверять код на каждом этапе, интегрировать его с другими приложениями, работать с изображениями, воспроизводить аудио и делать многое другое. Каждая глава продумана (и протестирована) так, чтобы вы смогли получить максимум опыта и знания, необходимые для разработки под Android.
Для работы с этой книгой читатель должен быть знаком с языком Kotlin, включая такие концепции, как классы и объекты, интерфейсы, слушатели, пакеты, внутренние классы, анонимные внутренние классы и обобщенные классы.
Без знания этих концепций вы почувствуете себя в джунглях начиная со второй страницы. Лучше начните с вводного учебника по Kotlin и вернитесь к этой книге после его прочтения. Сегодня существует много превосходных книг для начинающих; подберите нужный вариант в зависимости от своего опыта программирования и стиля обучения. Мы рекомендуем книгу Kotlin Programming: The Big Nerd Ranch Guide.
Если вы хорошо разбираетесь в концепциях объектно-ориентированного программирования, но успели малость подзабыть Kotlin, скорее всего, все будет нормально. Мы приводим краткие напоминания о некоторых специфических возможностях Kotlin (таких как интерфейсы и анонимные внутренние классы). Держите учебник по Kotlin наготове на случай, если вам понадобится дополнительная информация во время чтения.
В этом издании мы провели капитальный ремонт и изменили буквально каждую главу. Самое большое изменение заключается в том, что программы теперь написаны на Kotlin, а не на Java. Поэтому неофициальным рабочим названием этого издания было «Android 4K».
Еще одно радикальное изменение — включение библиотек компонентов Android Jetpack. Теперь мы используем Jetpack-библиотеки (их еще называют AndroidX) вместо Support Library. Кроме того, мы включили новые API Jetpack, где это было уместно. Например, мы используем ViewModel для сохранения состояния пользовательского интерфейса при вращении. Мы используем Room и LiveData для реализации базы данных и запросов данных из нее. А для планирования фоновой работы мы используем WorkManager. И это лишь часть нововведений. В этой книге компоненты Jetpack в той или иной мере вплетены во все проекты.
Чтобы сфокусироваться на том, как разрабатываются современные приложения для Android, в этой книге используются библиотеки сторонних разработчиков, а не только API в пределах данного фреймворка или Jetpack. Один из примеров — отказ от HttpURLConnection и других сетевых API нижнего уровня в пользу использования Retrofit и его зависимых библиотек. Мы тем самым сильно отходим от наших предыдущих книг, но считаем, что такой подход подготовит вас к погружению в профессиональную разработку приложений после прочтения нашей книги. Выбранные библиотеки мы используем в повседневной жизни, разрабатывая приложения на Android для наших клиентов.
Эта книга не справочник. Мы старались помочь в преодолении начального барьера, чтобы вы могли извлечь максимум пользы из существующих справочников и пособий. Книга основана на материалах пятидневного учебного курса в Big Nerd Ranch. Соответственно предполагается, что вы будете читать ее с самого начала. Каждая глава базируется на предшествующем материале, и пропускать главы не рекомендуется.
На наших занятиях студенты прорабатывают эти материалы, но в обучении также важно и другое — ваш настрой и обстановка.
Желательно, чтобы ваша учебная среда была похожа на нашу. В частности, стоит хорошенько высыпаться и найти спокойное место для работы. Следующие факторы тоже сыграют положительную роль:
— Создайте учебную группу с друзьями или коллегами.
— Выделяйте время, когда вы будете заниматься исключительно чтением книги.
— Примите участие в работе форума книги на сайте forums.bignerdranch.com.
— Найдите специалиста по Android, который поможет вам в трудный момент.
В этой книге мы напишем семь приложений для Android. Два приложения очень просты, и на их создание уходит всего одна глава. Другие приложения часто оказываются более сложными, а самое длинное приложение занимает 11 глав. Все приложения спроектированы так, чтобы продемонстрировать важные концепции и приемы и дать опыт их практического применения.
GeoQuiz
В первом приложении мы исследуем основные принципы создания проектов Android, activity, макеты и явные интенты. Вы также научитесь без проблем работать с конфигурацией.
CriminalIntent
Самое большое приложение в книге предназначено для хранения информации о проступках ваших коллег по офису. Вы научитесь использовать фрагменты, интерфейсы «главное-детализированное представление», списковые интерфейсы, меню, камеру, неявные интенты и многое другое.
BeatBox
Наведите ужас на своих врагов и узнайте больше о фрагментах, воспроизведении мультимедийного контента, архитектуре MVVM, связывании данных, тестировании, темах и графических объектах.
NerdLauncher
Нестандартный лаунчер раскроет тонкости работы системы интентов, процессов и задач.
PhotoGallery
Клиент Flickr для загрузки и отображения фотографий из общедоступной базы Flickr. Приложение демонстрирует работу со службами, многопоточное программирование, обращения к веб-службам и т. д.
DragAndDraw
В этом простом графическом приложении рассматривается обработка событий касания и создание нестандартных представлений.
Sunset
Мы будем говорить о версиях Android, широко используемых на момент написания книги. Для данного издания это версии Android 5.0 (Lollipop, API уровня 21) — Android 9.0 (Pie, API уровня 28). Несмотря на то что более старые версии все еще используются, нам кажется, что усилия, требуемые для поддержки этих версий, того не стоят.
Если вы хотите получить информацию о поддержке версий Android ранее 5.0, вы можете почитать предыдущие издания этой книги. Третье издание было нацелено на Android 4.4 и выше, второе — на Android 4.1 и выше, а первое — на Android 2.3 и выше.
Даже после выхода новых версий Android приемы, изложенные в книге, будут работать благодаря политике обратной совместимости Android (подробности см. в главе 7). На сайте forums.bignerdranch.com будет публиковаться информация об изменениях, а также комментарии по поводу использования материала книги с последними версиями.
Подробнее об интентах и задачах
В этой главе мы используем неявные интенты для создания приложения-лаунчера, заменяющего стандартный лаунчер Android. На рис. 23.1 показано, как будет выглядеть приложение NerdLauncher.
NerdLauncher выводит список приложений на устройстве. Пользователь нажимает элемент списка, чтобы запустить соответствующее приложение.
Чтобы приложение работало правильно, нам придется углубить свое понимание интентов, фильтров интентов и схем взаимодействий между приложениями в среде Android.
Создание приложения NerdLauncher
В Android Studio выберите команду File ⇒ New Project, чтобы создать новый проект. Выберите пункт Add No Activity на вкладке Phone and Tablet. Присвойте приложению название NerdLauncher и назначьте имя пакета com.bignerdranch.android.nerdlauncher. Установите флажок Use AndroidX artifacts, а остальные настройки не изменяйте.
После инициализации проекта в Android Studio создайте новую пустую activity, выбрав команду File ⇒ New ⇒ Activity ⇒ Empty Activity. Присвойте activity имя NerdLauncherActivity и установите флажок Launcher Activity.
NerdLauncherActivity отображает список названий приложений в RecyclerView. Добавьте зависимость androidx.recyclingerview:recyclingerview:1.0.0 в файл app/build.gradle, как вы делали это в главе 9. Если вы хотите использовать более новые версии RecyclerView, их можно найти по ссылке developer.android.com/jetpack/androidx/releases/reecycleerview.
Измените содержимое файла res/layout/activity_nerd_launcher.xml в части кода RecyclerView, как показано в листинге 23.1.
Листинг 23.1. Обновление макета NerdLauncherActivity (layout/activity_nerd_launcher.xml)
Откройте файл NerdLauncherActivity.kt и спрячьте ссылку на объект RecyclerView в свойстве (уже скоро мы подключим данные к RecyclerView).
Листинг 23.2. Базовая реализация NerdLauncherActivity (NerdLauncherActivity.kt)
Запустите приложение и убедитесь в том, что пока все компоненты взаимодействуют правильно. Если все сделано без ошибок, вы становитесь владельцем приложения NerdLauncher, в котором отображается пустой виджет RecyclerView (рис. 23.2).
Обработка неявного интента
NerdLauncher отображает список запускаемых (launchable) приложений на устройстве. («Запускаемым» называется приложение, которое может быть запущено пользователем, если он щелкнет на значке на «Главном экране» или на экране лаунчера.) Для этого NerdLauncher запрашивает у системы список запускаемых главных activity.
Package Manager, о котором мы говорили в главе 15, используется для разрешения activity. У запускаемых главных activity фильтры интентов включают действие MAIN и категорию LAUNCHER. Вы уже видели в своих проектах фильтр интентов в файле manifests/AndroidManifest.xml:
Когда NerdLauncherActivity стал запускающей activity, фильтры интентов добавляются автоматически. (Проверьте манифест, если хотите.)
В файле NerdLauncherActivity.kt добавьте функцию setupAdapter() и вызовите его из onCreateView(. ). (Позднее эта функция создаст экземпляр RecyclerView.Adapter и назначит его объекту RecyclerView, но пока она просто генерирует список данных приложения.)
Также создайте неявный интент и получите список activity, соответствующих интенту, от PackageManager. Пока мы ограничимся простой регистрацией количества activity, возвращенных PackageManager.
Листинг 23.3. Получение информации у PackageManager (NerdLauncherActivity.kt)
Здесь мы создаем неявный интент с заданным действием ACTION_MAIN. Переменная CATEGORY_LAUNCHER добавлена в категории интента.
Вызов PackageManager.requestIntentActivities(Intent, Int) возвращает список, содержащий ResolveInfo для всех activity, у которых есть фильтр, соответствующий данному интенту. Вы можете указать флаги для изменения результатов. Например, флаг PackageManager.GET_SHARED_LIBRARY_FILES заставляет запрос включать в результаты дополнительные данные (пути к библиотекам, которые связаны с каждым приложением, удовлетворяющим требованиям). Здесь вы передаете 0, что указывает на то, что вы не хотите изменять результаты.
Запустите приложение NerdLauncher и посмотрите в выводе LogCat, сколько приложений вернул экземпляр PackageManager (у нас при первом пробном запуске их было 30).
В CriminalIntent для отправки отчетов использовался неявный интент. Чтобы представить на экране список выбора приложений, мы создали неявный интент, упаковали его в интент выбора и отправили ОС вызовом startActivity(Intent):
Почему мы не используем этот подход здесь? Вкратце: дело в том, что фильтр интентов MAIN/LAUNCHER может соответствовать или не соответствовать неявному интенту MAIN/LAUNCHER, отправленному через startActivity(Intent).
Оказывается, вызов startActivity(Intent) не означает «Запустить activity, соответствующую этому неявному интенту». Он означает «Запустить activity по умолчанию, соответствующую этому неявному интенту». Когда вы отправляете неявный интент с использованием startActivityForResult(Intent) (или startActivity(. )), ОС незаметно включает в интент категорию Intent.CATEGORY_DEFAULT.
Таким образом, если вы хотите, чтобы фильтр интентов соответствовал неявным интентам, отправленным через startActivity(Intent), вы должны включить в этот фильтр интентов категорию DEFAULT.
Activity с фильтром интентов MAIN/LAUNCHER является главной точкой входа приложения, которому она принадлежит. Для нее важно лишь то, что она является главной точкой входа приложения, а является ли она главной точкой входа «по умолчанию» — несущественно, поэтому она не обязана включать категорию CATEGORY_DEFAULT.
Так как фильтры интентов MAIN/LAUNCHER могут не включать CATEGORY_DEFAULT, надежность их соответствия неявным интентам, отправленным вызовом startActivity(Intent), не гарантирована. Поэтому мы используем интент для прямого запроса у PackageManager информации об activity с фильтром интентов MAIN/LAUNCHER.
Следующий шаг — отображение меток этих activity в списке RecyclerView экземпляра NerdLauncherFragment. Метка (label) activity представляет собой отображаемое имя — нечто, понятное пользователю. Если учесть, что эти activity относятся к лаунчеру, такой меткой, скорее всего, должно быть имя приложения.
Метки activity вместе с другими метаданными содержатся в объектах ResolveInfo, возвращаемых PackageManager.
Сначала отсортируйте объекты ResolveInfo, возвращаемые PackageManager, в алфавитном порядке меток, получаемых функцией ResolveInfo.loadLabel
(PackageManager).
Листинг 23.4. Алфавитная сортировка (NerdLauncherActivity.kt)
Теперь определите класс ViewHolder для отображения метки activity. Сохраните объект ResolveInfo activity в переменной класса (позднее мы еще не раз используем его).
Листинг 23.5. Реализация ViewHolder (NerdLauncherActivity.kt)
Затем добавьте реализацию RecyclerView.Adapter.
Листинг 23.6. Реализация RecyclerView.Adapter (NerdLauncherActivity.kt)
Здесь мы заполняем файл android.R.layout.simple_list_item_1 в функции onCreateViewHolder(. ). Файл simple_list_item_1 layout является частью фреймворка Android, поэтому вы ссылаетесь на него как на layout android.R.layout, а не как на R.layout. В нем содержится один TextView.
Наконец, измените код функции setupAdapter(), чтобы она создавала экземпляр ActivityAdapter и назначала его адаптером RecyclerView.
Листинг 23.7. Назначение адаптера RecyclerView (NerdLauncherActivity.kt)
Запустите NerdLauncher; вы увидите список RecyclerView, заполненный метками activity (рис. 23.3).
Создание явных интентов на стадии выполнения
Мы использовали неявный интент для сбора информации об activity и выводе ее в формате списка. Следующим шагом должен стать запуск выбранной activity при нажатии пользователем на элементе списка. Для запуска activity будет использоваться явный интент.
Для создания явного интента необходимо извлечь из ResolveInfo имя пакета и имя класса activity. Эти данные можно получить из части ResolveInfo с именем ActivityInfo. (О том, какие данные доступны в разных частях ResolveInfo, можно узнать из документации: developer.android.com/reference/kotlin/android/content/pm/ResolveInfo.html.)
Реализуйте в ActivityHolder слушателя нажатий. При нажатии на activity в списке по данным ActivityInfo этой activity создайте явный интент. Затем используйте этот явный интент для запуска выбранной activity.
Листинг 23.8. Запуск выбранной activity (NerdLauncherActivity.kt)
Обратите внимание: в этом интенте мы отправляем действие как часть явного интента. Большинство приложений ведет себя одинаково независимо от того, включено действие или нет, однако некоторые приложения могут изменять свое поведение. Одна и та же activity может отображать разные интерфейсы в зависимости от того, как она была запущена. Вам как программисту лучше всего четко объявить свои намерения и позволить activity запуститься так, как они считают нужным.
В листинге 23.8 мы получаем имя пакета и имя класса из метаданных и используем их для создания явной activity функцией Intent:
Этот способ отличается от того, который использовался нами для создания явных интентов в прошлом. Ранее мы использовали конструктор Intent, получающий объекты Context и Class:
Этот конструктор использует свои параметры для получения того, в чем Intent реально нуждается — ComponentName, имени пакета, объединенного с именем класса. Когда вы передаете Activity и Class для создания Intent, конструктор определяет полное имя пакета по Activity.
Однако решение с функцией setClassName(. ), автоматически создающей имя компонента, получается более компактным.
Запустите NerdLauncher и посмотрите, как работает запуск приложений.
Для Хаброжителей скидка 25% по купону — Android
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Источник