Разное

Android программирование для профессионалов 3 е издание: Android. Программирование для профессионалов. 3-е издание

Содержание

Android. Программирование для профессионалов. 3-е издание

Руководство для разработчиков.

Филлипс Б., Стюарт К., Марсикано К. «Android. Программирование для профессионалов» Питер, 2017 год, 688 стр., 3-е изд., ISBN: 978-5-4461-0413-0; (17,8 мб. pdf)

Для изучения этой книги вы должны быть знакомы с языком Java, включая: классы и объекты, интерфейсы, слушатели, пакеты, вну-тренние классы, анонимные внутренние классы и обобщенные классы. В третьем издании вы познакомитесь с интегрированной средой Android Studio, которая значительно облегчает разработку ваших приложений. Вы не только изучите основы программирования, но и узнаете о возможностях самых распространенных версий Android. А также новых инструментах, это — макеты с ограничениями и связывание данных, модульное тестирование, средства доступности, архитектурный стиль MVVM, локализации и новой системе разрешений времени выполнения. Все учебные приложения были спроектированы таким образом, чтобы продемонстрировать важные концепции и приемы программирования под Android и дать опыт их практического применения.

Оглавление книги

Содержание

Изучение Android 22
Необходимые инструменты 26
Глава 1. Первое приложение Android 28
Глава 2. Android и модель MVC 57
Глава 3. Жизненный цикл активности 78
Глава 4. Отладка приложений Android 98
Глава 5. Вторая активность 112
Глава 6. Версии Android SDK и совместимость 135
Глава 7. UI-фрагменты и FragmentManager 146
Глава 8. Вывод списков и RecyclerView 177
Глава 9. Создание пользовательских интерфейсов с использованием макетов и виджетов 201
Глава 10. Аргументы фрагментов 221
Глава 11. ViewPager 233
Глава 12. Диалоговые окна 244
Глава 13. Панель инструментов 262
Глава 14. Базы данных SQLite 283
Глава 15. Неявные интенты 302
Глава 16. Интенты при работе с камерой 318
Глава 17. Двухпанельные интерфейсы 332
Глава 18. Локализация 350
Глава 19. Доступность 367
Глава 20. Привязка данных и MVVM 384
Глава 21. Модульное тестирование и воспроизведение звуков 409
Глава 22. Стили и темы 431
Глава 23. Графические объекты 448
Глава 24. Подробнее об интентах и задачах 463
Глава 25. HTTP и фоновые задачи 483
Глава 26. Looper, Handler и HandlerThread 508
Глава 27. Поиск 530
Глава 28. Фоновые службы 546
Глава 29. Широковещательные интенты 572
Глава 30. Просмотр веб-страниц и WebView 593
Глава 31. Пользовательские представления и события касания 608
Глава 32. Анимация свойств 620
Глава 33. Отслеживание местоположения устройства 634
Глава 34. Карты 658
Глава 35. Материальный дизайн 671
Послесловие 686

СкачатьPDF

Похожая литература

528

https://www.htbook.ru/kompjutery_i_seti/programmirovanie/android-programmirovanie-dlya-professionalov-trete-izdaniehttps://www.htbook.ru/wp-content/uploads/2019/03/android-programmirovanie-dlya-professionalov-trete-izdanie.jpghttps://www.htbook.ru/wp-content/uploads/2019/03/android-programmirovanie-dlya-professionalov-trete-izdanie.jpgПрограммирование и БДAndroid,ПрограммированиеРуководство для разработчиков.
Филлипс Б., Стюарт К., Марсикано К. ‘Android. Программирование для профессионалов’ Питер, 2017 год, 688 стр., 3-е изд., ISBN: 978-5-4461-0413-0; (17,8 мб. pdf)
Для изучения этой книги вы должны быть знакомы с языком Java, включая: классы и объекты, интерфейсы, слушатели, пакеты, вну-тренние классы, анонимные внутренние классы и обобщенные классы….SomМихаил
Михайлов[email protected]Техническая литература

Книга «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, широко используемых на момент написания книги. Для данного издания это версии 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)

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/app_recycler_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>

Откройте файл NerdLauncherActivity.kt и спрячьте ссылку на объект RecyclerView в свойстве (уже скоро мы подключим данные к RecyclerView).

Листинг 23.2. Базовая реализация NerdLauncherActivity (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   private lateinit var recyclerView: RecyclerView
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_nerd_launcher)
      recyclerView = findViewById(R.id.app_recycler_view)
      recyclerView.layoutManager = LinearLayoutManager(this)
      }
   }

Запустите приложение и убедитесь в том, что пока все компоненты взаимодействуют правильно. Если все сделано без ошибок, вы становитесь владельцем приложения NerdLauncher, в котором отображается пустой виджет RecyclerView (рис. 23.2).

Обработка неявного интента

NerdLauncher отображает список запускаемых (launchable) приложений на устройстве. («Запускаемым» называется приложение, которое может быть запущено пользователем, если он щелкнет на значке на «Главном экране» или на экране лаунчера.) Для этого NerdLauncher запрашивает у системы список запускаемых главных activity.

Package Manager, о котором мы говорили в главе 15, используется для разрешения activity. У запускаемых главных activity фильтры интентов включают действие MAIN и категорию LAUNCHER. Вы уже видели в своих проектах фильтр интентов в файле manifests/AndroidManifest.xml:

<intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Когда NerdLauncherActivity стал запускающей activity, фильтры интентов добавляются автоматически. (Проверьте манифест, если хотите.)

В файле NerdLauncherActivity.kt добавьте функцию setupAdapter() и вызовите его из onCreateView(…). (Позднее эта функция создаст экземпляр RecyclerView.Adapter и назначит его объекту RecyclerView, но пока она просто генерирует список данных приложения.)

Также создайте неявный интент и получите список activity, соответствующих интенту, от PackageManager. Пока мы ограничимся простой регистрацией количества activity, возвращенных PackageManager.

Листинг 23.3. Получение информации у PackageManager (NerdLauncherActivity.kt)

private const val TAG = "NerdLauncherActivity"
class NerdLauncherActivity : AppCompatActivity() {
   private lateinit var recyclerView: RecyclerView
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_nerd_launcher)
      recyclerView = findViewById(R.id.app_recycler_view)
      recyclerView.layoutManager = LinearLayoutManager(this)
      setupAdapter()
   }
   private fun setupAdapter() {
      val startupIntent = Intent(Intent.ACTION_MAIN).apply {
         addCategory(Intent.CATEGORY_LAUNCHER)
      }
   val activities = packageManager.queryIntentActivities(startupIntent, 0)
   Log.i(TAG, "Found ${activities.size} activities")
   }
}

Здесь мы создаем неявный интент с заданным действием ACTION_MAIN. Переменная CATEGORY_LAUNCHER добавлена в категории интента.

Вызов PackageManager.requestIntentActivities(Intent, Int) возвращает список, содержащий ResolveInfo для всех activity, у которых есть фильтр, соответствующий данному интенту. Вы можете указать флаги для изменения результатов. Например, флаг PackageManager.GET_SHARED_LIBRARY_FILES заставляет запрос включать в результаты дополнительные данные (пути к библиотекам, которые связаны с каждым приложением, удовлетворяющим требованиям). Здесь вы передаете 0, что указывает на то, что вы не хотите изменять результаты.

Запустите приложение NerdLauncher и посмотрите в выводе LogCat, сколько приложений вернул экземпляр PackageManager (у нас при первом пробном запуске их было 30).

В CriminalIntent для отправки отчетов использовался неявный интент. Чтобы представить на экране список выбора приложений, мы создали неявный интент, упаковали его в интент выбора и отправили ОС вызовом startActivity(Intent):

val intent = Intent(Intent.ACTION_SEND)
... // Создание и размещение дополнений интентов
chooserIntent = Intent.createChooser(intent, getString(R.string.send_report)
startActivity(chooserIntent)

Почему мы не используем этот подход здесь? Вкратце: дело в том, что фильтр интентов 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)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private fun setupAdapter() {
      val startupIntent = Intent(Intent.ACTION_MAIN).apply {
         addCategory(Intent.CATEGORY_LAUNCHER)
      }
      val activities = packageManager.queryIntentActivities(startupIntent, 0)
      activities.sortWith(Comparator { a, b ->
          String.CASE_INSENSITIVE_ORDER.compare(
             a.loadLabel(packageManager).toString(),
             b.loadLabel(packageManager).toString()
          )
    })
    Log.i(TAG, "Found ${activities.size} activities")
  }
}

Теперь определите класс ViewHolder для отображения метки activity. Сохраните объект ResolveInfo activity в переменной класса (позднее мы еще не раз используем его).

Листинг 23.5. Реализация ViewHolder (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private fun setupAdapter() {
      ...
   }
   private class ActivityHolder(itemView: View) :
          RecyclerView.ViewHolder(itemView) {
      private val nameTextView = itemView as TextView
      private lateinit var resolveInfo: ResolveInfo
      fun bindActivity(resolveInfo: ResolveInfo) {
         this.resolveInfo = resolveInfo
         val packageManager = itemView.context.packageManager
         val appName = resolveInfo.loadLabel(packageManager).toString()
         nameTextView.text = appName
      }
   }
}

Затем добавьте реализацию RecyclerView.Adapter.

Листинг 23.6. Реализация RecyclerView.Adapter (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private class ActivityHolder(itemView: View) :
      RecyclerView.ViewHolder(itemView) {
      ...
    }
    private class ActivityAdapter(val activities: List<ResolveInfo>) :
             RecyclerView.Adapter<ActivityHolder>() {
        override fun onCreateViewHolder(container: ViewGroup, viewType: Int):
               ActivityHolder {
           val layoutInflater = LayoutInflater.from(container.context)
           val view = layoutInflater
                .inflate(android.R.layout.simple_list_item_1, container, false)
           return ActivityHolder(view)
        }
        override fun onBindViewHolder(holder: ActivityHolder, position: Int) {
          val resolveInfo = activities[position]
          holder.bindActivity(resolveInfo)
       }
       override fun getItemCount(): Int {
       return activities.size
       }
    }
}

Здесь мы заполняем файл 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)

class NerdLauncherActivity : AppCompatActivity() {
    ...
    private fun setupAdapter() {
       ...
       Log.i(TAG, "Found ${activities.size} activities")
       recyclerView.adapter = ActivityAdapter(activities)
    }
    ...
}

Запустите 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)

class NerdLauncherActivity : AppCompatActivity() {
   ...
    private class ActivityHolder(itemView: View) :
            RecyclerView.ViewHolder(itemView),
            View.OnClickListener {
        private val nameTextView = itemView as TextView
        private lateinit var resolveInfo: ResolveInfo
        init {
             nameTextView.setOnClickListener(this)
        }
       fun bindActivity(resolveInfo: ResolveInfo) {
           ...
       }
       override fun onClick(view: View) {
          val activityInfo = resolveInfo.activityInfo
          val intent = Intent(Intent.ACTION_MAIN).apply {
              setClassName(activityInfo.applicationInfo.packageName,
                 activityInfo.name)
         }
         val context = view.context
         context.startActivity(intent)
      }
   }
   ...
}

Обратите внимание: в этом интенте мы отправляем действие как часть явного интента. Большинство приложений ведет себя одинаково независимо от того, включено действие или нет, однако некоторые приложения могут изменять свое поведение. Одна и та же activity может отображать разные интерфейсы в зависимости от того, как она была запущена. Вам как программисту лучше всего четко объявить свои намерения и позволить activity запуститься так, как они считают нужным.

В листинге 23.8 мы получаем имя пакета и имя класса из метаданных и используем их для создания явной activity функцией Intent:

fun setClassName(packageName: String, className: String): Intent

Этот способ отличается от того, который использовался нами для создания явных интентов в прошлом. Ранее мы использовали конструктор Intent, получающий объекты Context и Class:

Intent(packageContext: Context, cls: Class<?>)

Этот конструктор использует свои параметры для получения того, в чем Intent реально нуждается — ComponentName, имени пакета, объединенного с именем класса. Когда вы передаете Activity и Class для создания Intent, конструктор определяет полное имя пакета по Activity.

fun setComponent(component: ComponentName): Intent

Однако решение с функцией setClassName(…), автоматически создающей имя компонента, получается более компактным.

Запустите NerdLauncher и посмотрите, как работает запуск приложений.

» Более подробно с книгой можно ознакомиться на сайте издательства

» Оглавление

» Отрывок

Для Хаброжителей скидка 25% по купону — Android

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

Книга «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, широко используемых на момент написания книги. Для данного издания это версии 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)

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/app_recycler_view"
   android:layout_width="match_parent"
   android:layout_height="match_parent"/>

Откройте файл NerdLauncherActivity.kt и спрячьте ссылку на объект RecyclerView в свойстве (уже скоро мы подключим данные к RecyclerView).

Листинг 23.2. Базовая реализация NerdLauncherActivity (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   private lateinit var recyclerView: RecyclerView
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_nerd_launcher)
      recyclerView = findViewById(R.id.app_recycler_view)
      recyclerView.layoutManager = LinearLayoutManager(this)
      }
   }

Запустите приложение и убедитесь в том, что пока все компоненты взаимодействуют правильно. Если все сделано без ошибок, вы становитесь владельцем приложения NerdLauncher, в котором отображается пустой виджет RecyclerView (рис. 23.2).

Обработка неявного интента

NerdLauncher отображает список запускаемых (launchable) приложений на устройстве. («Запускаемым» называется приложение, которое может быть запущено пользователем, если он щелкнет на значке на «Главном экране» или на экране лаунчера.) Для этого NerdLauncher запрашивает у системы список запускаемых главных activity.

Package Manager, о котором мы говорили в главе 15, используется для разрешения activity. У запускаемых главных activity фильтры интентов включают действие MAIN и категорию LAUNCHER. Вы уже видели в своих проектах фильтр интентов в файле manifests/AndroidManifest.xml:

<intent-filter>
   <action android:name="android.intent.action.MAIN" />
   <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Когда NerdLauncherActivity стал запускающей activity, фильтры интентов добавляются автоматически. (Проверьте манифест, если хотите.)

В файле NerdLauncherActivity.kt добавьте функцию setupAdapter() и вызовите его из onCreateView(…). (Позднее эта функция создаст экземпляр RecyclerView.Adapter и назначит его объекту RecyclerView, но пока она просто генерирует список данных приложения.)

Также создайте неявный интент и получите список activity, соответствующих интенту, от PackageManager. Пока мы ограничимся простой регистрацией количества activity, возвращенных PackageManager.

Листинг 23.3. Получение информации у PackageManager (NerdLauncherActivity.kt)

private const val TAG = "NerdLauncherActivity"
class NerdLauncherActivity : AppCompatActivity() {
   private lateinit var recyclerView: RecyclerView
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_nerd_launcher)
      recyclerView = findViewById(R.id.app_recycler_view)
      recyclerView.layoutManager = LinearLayoutManager(this)
      setupAdapter()
   }
   private fun setupAdapter() {
      val startupIntent = Intent(Intent.ACTION_MAIN).apply {
         addCategory(Intent.CATEGORY_LAUNCHER)
      }
   val activities = packageManager.queryIntentActivities(startupIntent, 0)
   Log.i(TAG, "Found ${activities.size} activities")
   }
}

Здесь мы создаем неявный интент с заданным действием ACTION_MAIN. Переменная CATEGORY_LAUNCHER добавлена в категории интента.

Вызов PackageManager.requestIntentActivities(Intent, Int) возвращает список, содержащий ResolveInfo для всех activity, у которых есть фильтр, соответствующий данному интенту. Вы можете указать флаги для изменения результатов. Например, флаг PackageManager.GET_SHARED_LIBRARY_FILES заставляет запрос включать в результаты дополнительные данные (пути к библиотекам, которые связаны с каждым приложением, удовлетворяющим требованиям). Здесь вы передаете 0, что указывает на то, что вы не хотите изменять результаты.

Запустите приложение NerdLauncher и посмотрите в выводе LogCat, сколько приложений вернул экземпляр PackageManager (у нас при первом пробном запуске их было 30).

В CriminalIntent для отправки отчетов использовался неявный интент. Чтобы представить на экране список выбора приложений, мы создали неявный интент, упаковали его в интент выбора и отправили ОС вызовом startActivity(Intent):

val intent = Intent(Intent.ACTION_SEND)
... // Создание и размещение дополнений интентов
chooserIntent = Intent.createChooser(intent, getString(R.string.send_report)
startActivity(chooserIntent)

Почему мы не используем этот подход здесь? Вкратце: дело в том, что фильтр интентов 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)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private fun setupAdapter() {
      val startupIntent = Intent(Intent.ACTION_MAIN).apply {
         addCategory(Intent.CATEGORY_LAUNCHER)
      }
      val activities = packageManager.queryIntentActivities(startupIntent, 0)
      activities.sortWith(Comparator { a, b ->
          String.CASE_INSENSITIVE_ORDER.compare(
             a.loadLabel(packageManager).toString(),
             b.loadLabel(packageManager).toString()
          )
    })
    Log.i(TAG, "Found ${activities.size} activities")
  }
}

Теперь определите класс ViewHolder для отображения метки activity. Сохраните объект ResolveInfo activity в переменной класса (позднее мы еще не раз используем его).

Листинг 23.5. Реализация ViewHolder (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private fun setupAdapter() {
      ...
   }
   private class ActivityHolder(itemView: View) :
          RecyclerView.ViewHolder(itemView) {
      private val nameTextView = itemView as TextView
      private lateinit var resolveInfo: ResolveInfo
      fun bindActivity(resolveInfo: ResolveInfo) {
         this.resolveInfo = resolveInfo
         val packageManager = itemView.context.packageManager
         val appName = resolveInfo.loadLabel(packageManager).toString()
         nameTextView.text = appName
      }
   }
}

Затем добавьте реализацию RecyclerView.Adapter.

Листинг 23.6. Реализация RecyclerView.Adapter (NerdLauncherActivity.kt)

class NerdLauncherActivity : AppCompatActivity() {
   ...
   private class ActivityHolder(itemView: View) :
      RecyclerView.ViewHolder(itemView) {
      ...
    }
    private class ActivityAdapter(val activities: List<ResolveInfo>) :
             RecyclerView.Adapter<ActivityHolder>() {
        override fun onCreateViewHolder(container: ViewGroup, viewType: Int):
               ActivityHolder {
           val layoutInflater = LayoutInflater.from(container.context)
           val view = layoutInflater
                .inflate(android.R.layout.simple_list_item_1, container, false)
           return ActivityHolder(view)
        }
        override fun onBindViewHolder(holder: ActivityHolder, position: Int) {
          val resolveInfo = activities[position]
          holder.bindActivity(resolveInfo)
       }
       override fun getItemCount(): Int {
       return activities.size
       }
    }
}

Здесь мы заполняем файл 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)

class NerdLauncherActivity : AppCompatActivity() {
    ...
    private fun setupAdapter() {
       ...
       Log.i(TAG, "Found ${activities.size} activities")
       recyclerView.adapter = ActivityAdapter(activities)
    }
    ...
}

Запустите 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)

class NerdLauncherActivity : AppCompatActivity() {
   ...
    private class ActivityHolder(itemView: View) :
            RecyclerView.ViewHolder(itemView),
            View.OnClickListener {
        private val nameTextView = itemView as TextView
        private lateinit var resolveInfo: ResolveInfo
        init {
             nameTextView.setOnClickListener(this)
        }
       fun bindActivity(resolveInfo: ResolveInfo) {
           ...
       }
       override fun onClick(view: View) {
          val activityInfo = resolveInfo.activityInfo
          val intent = Intent(Intent.ACTION_MAIN).apply {
              setClassName(activityInfo.applicationInfo.packageName,
                 activityInfo.name)
         }
         val context = view.context
         context.startActivity(intent)
      }
   }
   ...
}

Обратите внимание: в этом интенте мы отправляем действие как часть явного интента. Большинство приложений ведет себя одинаково независимо от того, включено действие или нет, однако некоторые приложения могут изменять свое поведение. Одна и та же activity может отображать разные интерфейсы в зависимости от того, как она была запущена. Вам как программисту лучше всего четко объявить свои намерения и позволить activity запуститься так, как они считают нужным.
В листинге 23.8 мы получаем имя пакета и имя класса из метаданных и используем их для создания явной activity функцией Intent:

fun setClassName(packageName: String, className: String): Intent

Этот способ отличается от того, который использовался нами для создания явных интентов в прошлом. Ранее мы использовали конструктор Intent, получающий объекты Context и Class:

Intent(packageContext: Context, cls: Class<?>)

Этот конструктор использует свои параметры для получения того, в чем Intent реально нуждается — ComponentName, имени пакета, объединенного с именем класса. Когда вы передаете Activity и Class для создания Intent, конструктор определяет полное имя пакета по Activity.

fun setComponent(component: ComponentName): Intent

Однако решение с функцией setClassName(…), автоматически создающей имя компонента, получается более компактным.

Запустите NerdLauncher и посмотрите, как работает запуск приложений.

» Более подробно с книгой можно ознакомиться на сайте издательства

» Оглавление

» Отрывок

Для Хаброжителей скидка 25% по купону — Android

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.

Книга «Android. Программирование для профессионалов. 4-е издание»

Эта книга посвящена прикладным методам разработки приложений на Kotlin, и подойдет для всех версий Android от 5.0 (Lollipop) до 8.1 (Oreo) и выше. Используйте Android Studio для создания приложений, чтобы проверять код на каждом этапе, интегрировать его с другими приложениями, работать с изображениями, воспроизводить аудио и делать многое другое. Каждая глава продумана (и протестирована) так, чтобы вы смогли получить максимум опыта и знания, необходимые для разработки под Android.

Что нового в четвертом издании?

В этом издании мы провели капитальный ремонт и изменили буквально каждую главу. Самое большое изменение заключается в том, что программы теперь написаны на Kotlin, а не на Java. Поэтому неофициальным рабочим названием этого издания было «Android 4K».

Еще одно радикальное изменение — включение библиотек компонентов Android Jetpack. Теперь мы используем Jetpack-библиотеки (их еще называют AndroidX) вместо Support Library. Кроме того, мы включили новые API Jetpack, где это было уместно. Например, мы используем ViewModel для сохранения состояния пользовательского интерфейса при вращении. Мы используем Room и LiveData для реализации базы данных и запросов данных из нее. А для планирования фоновой работы мы используем WorkManager. И это лишь часть нововведений. В этой книге компоненты Jetpack в той или иной мере вплетены во все проекты.

Чтобы сфокусироваться на том, как разрабатываются современные приложения для Android, в этой книге используются библиотеки сторонних разработчиков, а не только API в пределах данного фреймворка или Jetpack. Один из примеров — отказ от HttpURLConnection и других сетевых API нижнего уровня в пользу использования Retrofit и его зависимых библиотек. Мы тем самым сильно отходим от наших предыдущих книг, но считаем, что такой подход подготовит вас к погружению в профессиональную разработку приложений после прочтения нашей книги. Выбранные библиотеки мы используем в повседневной жизни, разрабатывая приложения на Android для наших клиентов.

Версии Android
Мы будем говорить о версиях 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).

С полным содержанием статьи можно ознакомиться на сайте «Хабрахабр»: https://habr.com/ru/company/piter/blog/526280/

Источник

Технические книги, инструкции, руководства – ROZETKA

Инструкции: предназначение и виды

На современном рынке нашей страны представлено широкое разнообразие технических направлений. Разобраться в особенностях функционирования некоторых из них без квалифицированной подготовки просто нереально. В таких ситуациях на помощь приходит специализированная техническая литература, составители которой рассказывают о правилах работы выбранного направления. Такие пособия и стали основными видами инструкций, которые используют современные пользователи.

Инструкции производятся в виде полноценных книг технического направления. Дипломированные специалисты, которые достигли определенных успехов в выбранной сфере деятельности готовы рассказать о ее аспектах. В целом же, есть структуризация данных материалов которая основана на их индивидуальных особенностях и предназначениях. Классификация такой литературы представлена следующим образом:

  • Энергетика и электротехника. Это учебная литература, которая позволяет сориентироваться в этой деятельности. В ней рассказаны базовые понятие энергетической и электротехнической сферы, описаны научные понятия, относящиеся к данной категории. Составляются они квалифицированными специалистами. Используются для обучения в профильных образовательных учреждениях.
  • Компьютерные технологии. Эти руководства – одни из самых востребованных инструкций среди потребителей. В них описываются базовые принципы работы с персональным компьютером. Читатель сможет узнать множество интересных фактов о нововведенных технологиях, просмотреть прогнозы их дальнейшего развития.
  • Операционные системы и пользовательские программы. Также получили широкое распространение на отечественном рынке. Представляют собой рекомендации по применению определенных программ для ПК, а также предоставляют базовые и углубленные навыки в работе с операционными системами.
  • Радиоэлектроника, радиотехника, связь. Научные пособия, которые помогают новичкам подробнее вникнуть в соответствующую сферу. Описывает технические, теоретические и практические стороны данного направления.
  • Программирование и базы данных. Вводит читателя в базовый курс программирования. Такие книги и пособия рассказывают о ключевых аспектах рассматриваемого вопроса. Описывается общее предназначение основных языков программирования. Такие материалы станут полезными для начинающих программистов.
  • Промышленность, строительство, транспорт. Такие руководства содержат в себе подробную информацию по охране труда на производственных предприятиях. Также в них можно отыскать информацию, которая предоставляет руководство и советы по ремонту транспортных средств. Авторами данных учебников, являются опытные мастера, которые ориентируются в этом вопросе. Из этих руководств можно почерпнуть множество полезных данных по эксплуатации всевозможного строительного оборудования. Такие инструкции оптимально подойдут для начинающих и даже опытных специалистов, разнообразных сфер деятельности.

Как выбрать качественную техническую литературу

Выбор технической литературы – это сложная задача. Перед покупкой, прежде всего, стоит обратить внимание на автора. Для того, чтобы понять его осознанность касательно выбранного вопроса, можно изучить информацию о степени его познаний в данной сфере при помощи Интернета.

Также нужно определиться с конкретной интересующей темой и выбрать нужное руководство. Для этого стоит обратить внимание на аннотацию. Здесь размещается краткое содержание, касающееся общей темы и некоторых нюансов.

Если вопрос касается компьютерных технологий, программирования и схожих тематик, стоит обращать внимание на дату их выхода (публикацию). Данные тематики подразумевают полноценный анализ основных компьютерных вопросов. Поэтому литература, выпущенная всего несколько лет назад, уже может быть устаревшей. Рассмотренные вопросы могут быть актуальными для прошлых лет, но не для современности. Оптимальный вариант – руководства, выпущенные в течении трех прошедших лет. В них содержатся острые вопросы, которые интересуют современных научных исследователей и программистов.

Android. Программирование для профессионалов. 3-е издание, Филлипс Б.

Описание

Android. Программирование для профессионалов. 3-е издание, Филлипс Б. купить Украина книга

Издательство — Питер

Язык — русский

Обложка — Мягкая обложка

Год издания — 2019

Количество страниц — 688

ISBN — 978-5-4461-0413-0

Бумага — белая, офсетная

О книге Android. Программирование для профессионалов. 3-е издание, Филлипс Б.

Когда вы приступаете к разработке приложений для Android — вы как будто оказываетесь в чужой стране: даже зная местный язык, на первых порах всё равно чувствуете себя некомфортно. Такое впечатление, что все окружающие знают что-то такое, чего вы никак не понимаете. И даже то, что вам уже известно, в новом контексте оказывается попросту неправильным.Третье издание познакомит вас с интегрированной средой Android Studio, которая сильно облегчает разработку приложений. Вы не только изучите основы программирования, но и узнаете о возможностях самых распространенных версий Android; новых инструментах, таких как макеты с ограничениями и связывание данных; модульном тестировании; средствах доступности; архитектурном стиле MVVM; локализации; новой системе разрешений времени выполнения. Все учебные приложения были спроектированы таким образом, чтобы продемонстрировать важные концепции и приемы программирования под Android и дать опыт их практического применения.

Android. Программирование для профессионалов. 3-е издание, Филлипс Б. оглавление

Благодарности

Изучение Android

Предварительные условия

Что нового в третьем издании?

Как работать с книгой

Структура книги

Упражнения

А вы любознательны?

Стиль программирования

Типографские соглашения

Версии Android

Необходимые инструменты

Загрузка и установка Android Studio

Загрузка старых версий SDK

Физическое устройство

От издательства

Глава 1. Первое приложение Android

Основы построения приложения

Создание проекта Android

Навигация в Android Studio

Построение макета пользовательского интерфейса

Иерархия представлений

Атрибуты виджетов

Создание строковых ресурсов

Предварительный просмотр макета

От разметки XML к объектам View

Ресурсы и идентификаторы ресурсов

Подключение виджетов к программе

Получение ссылок на виджеты

Назначение слушателей

Уведомления

Автозавершение

Выполнение в эмуляторе

Для любознательных: процесс построения приложений Android

Средства построения программ Android

Упражнения

Упражнение: настройка уведомления

8

Глава 2. Android и модель MVC

Создание нового класса

Генерирование get- и set-методов

Архитектура «Модель-Представление-Контроллер» и Android

Преимущества MVC

Обновление уровня представления

Обновление уровня контроллера

Запуск на устройстве

Подключение устройства

Настройка устройства для разработки

Добавление значка

Добавление ресурсов в проект

Ссылки на ресурсы в XML

Упражнение. Добавление слушателя для TextView

Упражнение. Добавление кнопки возврата

Упражнение. От Button к ImageButton

Глава 3. Жизненный цикл активности

Регистрация событий жизненного цикла Activity

Создание сообщений в журнале

Использование LogCat

Анализ жизненного цикла активности на примере

Повороты и жизненный цикл активности

Конфигурации устройств и альтернативные ресурсы

Сохранение данных между поворотами

Переопределение onSaveInstanceState(Bundle)

Снова о жизненном цикле Activity

Для любознательных: тестирование onSaveInstanceState(Bundle)

Для любознательных: методы и уровни регистрации

Упражнение. Предотвращение ввода нескольких ответов

Упражнение. Вывод оценки

Глава 4. Отладка приложений Android

Исключения и трассировка стека

Диагностика ошибок поведения

Сохранение трассировки стека

Установка точек прерывания

Прерывания по исключениям

Особенности отладки Android

Android Lint

Проблемы с классом R

Упражнение. Layout Inspector

Упражнение. Allocation Tracker

Глава 5. Вторая активность

Подготовка к включению второй активности

Создание второй активности

9Создание нового субкласса активности

Объявление активностей в манифесте

Добавление кнопки Cheat в QuizActivity

Запуск активности

Передача информации через интенты

Передача данных между активностями

Дополнения интентов

Получение результата от дочерней активности

Ваши активности с точки зрения Android

Упражнение. Лазейка для мошенников

Глава 6. Версии Android SDK и совместимость

Версии Android SDK

Совместимость и программирование Android

Разумный минимум

Минимальная версия SDK

Целевая версия SDK

Версия SDK для компиляции

Безопасное добавление кода для более поздних версий API

Документация разработчика Android

Упражнение. Вывод версии построения

Упражнение. Ограничение подсказок

Глава 7. UI-фрагменты и FragmentManager

Гибкость пользовательского интерфейса

Знакомство с фрагментами

Начало работы над CriminalIntent

Создание нового проекта

Два типа фрагментов

Добавление зависимостей в Android Studio

Создание класса Crime

Хостинг UI-фрагментов

Жизненный цикл фрагмента

Два способа организации хостинга

Определение контейнерного представления

Создание UI-фрагмента

Определение макета CrimeFragment

Создание класса CrimeFragment

Реализация методов жизненного цикла фрагмента

Добавление UI-фрагмента в FragmentManager

Транзакции фрагментов

FragmentManager и жизненный цикл фрагмента

Архитектура приложений с фрагментами

Почему все наши активности используют фрагменты

Для любознательных: фрагменты и библиотека поддержки

Для любознательных: почему фрагменты из библиотеки поддержки лучше

10

Глава 8. Вывод списков и RecyclerView

Обновление уровня модели CriminalIntent

Синглеты и централизованное хранение данных

Абстрактная активность для хостинга фрагмента

Обобщенный макет для хостинга фрагмента

Абстрактный класс активности

Использование абстрактного класса

RecyclerView, Adapter и ViewHolder

ViewHolder и Adapter

Использование RecyclerView

Отображаемое представление

Реализация адаптера и ViewHolder

Связывание с элементами списка

Щелчки на элементах списка

Для любознательных: ListView и GridView

Для любознательных: синглеты

Упражнение. ViewType и RecyclerView

Глава 9. Создание пользовательских интерфейсов с использованием

макетов и виджетов

Использование графического конструктора

Знакомство с ConstraintLayout

Использование ConstraintLayout

Графический редактор

Освобождение пространства

Добавление виджетов

Внутренние механизмы ConstraintLayout

Редактирование свойств

Динамическое поведение элемента списка

Подробнее об атрибутах макетов

Плотности пикселов, dp и sp

Поля и отступы

Стили, темы и атрибуты тем

Рекомендации по проектированию интерфейсов Android

Графический конструктор макетов

Упражнение. Форматирование даты

Глава 10. Аргументы фрагментов

Запуск активности из фрагмента

Включение дополнения

Чтение дополнения

Обновление представления CrimeFragment данными Crime

Недостаток прямой выборки

Аргументы фрагментов

Присоединение аргументов к фрагменту

Получение аргументов

11Перезагрузка списка

Получение результатов с использованием фрагментов

Для любознательных: зачем использовать аргументы фрагментов?

Упражнение. Эффективная перезагрузка RecyclerView

Упражнение. Улучшение быстродействия CrimeLab

Глава 11. ViewPager

Создание CrimePagerActivity

ViewPager и PagerAdapter

Интеграция CrimePagerActivity

FragmentStatePagerAdapter и FragmentPagerAdapter

Для любознательных: как работает ViewPager

Для любознательных: формирование макетов представлений в коде

Упражнение. Восстановление полей CrimeFragment

Упражнение. Добавление кнопок для перехода в начало и конец списка

Глава 12. Диалоговые окна

Создание DialogFragment

Отображение DialogFragment

Назначение содержимого диалогового окна

Передача данных между фрагментами

Передача данных DatePickerFragment

Возвращение данных CrimeFragment

Назначение целевого фрагмента

Упражнение. Новые диалоговые окна

Упражнение. DialogFragment

Глава 13. Панель инструментов

AppCompat

Использование библиотеки AppCompat

Использование AppCompatActivity

Меню

Определение меню в XML

Создание меню

Реакция на выбор команд

Включение иерархической навигации

Как работает иерархическая навигация

Альтернативная команда меню

Переключение текста команды

«Да, и еще кое-что…»

Для любознательных: панели инструментов и панели действий

Упражнение. Удаление преступлений

Упражнение. Множественное число в строках

Упражнение. Пустое представление для списка

Глава 14. Базы данных SQLite

Определение схемы

Построение исходной базы данных

12

Работа с файлами в Android Device Monitor

Решение проблем при работе с базами данных

Изменение кода CrimeLab

Запись в базу данных

Использование ContentValues

Вставка и обновление записей

Чтение из базы данных

Использование CursorWrapper

Преобразование в объекты модели

Для любознательных: другие базы данных

Для любознательных: контекст приложения

Упражнение. Удаление преступлений

Глава 15. Неявные интенты

Добавление кнопок

Добавление подозреваемого в уровень модели

Форматные строки

Использование неявных интентов

Строение неявного интента

Отправка отчета

Запрос контакта у Android

Получение данных из списка контактов

Проверка реагирующих активностей

Упражнение. ShareCompat

Упражнение. Другой неявный интент

Глава 16. Интенты при работе с камерой

Место для хранения фотографий

Внешнее хранилище

Использование FileProvider

Выбор места для хранения фотографии

Использование интента камеры

Отправка интента

Масштабирование и отображение растровых изображений

Объявление функциональности

Упражнение. Вывод увеличенного изображения

Упражнение. Эффективная загрузка миниатюры

Глава 17. Двухпанельные интерфейсы

Гибкость макета

Модификация SingleFragmentActivity

Создание макета с двумя контейнерами фрагментов

Использование ресурса-псевдонима

Создание альтернативы для планшета

Активность: управление фрагментами

Интерфейсы обратного вызова фрагментов

Реализация CrimeListFragment.Callbacks

13Для любознательных: подробнее об определении размера экрана

Упражнение. Удаление смахиванием

Глава 18. Локализация

Локализация ресурсов

Ресурсы по умолчанию

Отличия в плотности пикселов

Проверка покрытия локализации в Translations Editor

Региональная локализация

Тестирование нестандартных локальных контекстов

Конфигурационные квалификаторы

Приоритеты альтернативных ресурсов

Множественные квалификаторы

Поиск наиболее подходящих ресурсов

Исключение несовместимых каталогов

Перебор по таблице приоритетов

Тестирование альтернативных ресурсов

Упражнение. Локализация дат

Глава 19. Доступность

TalkBack

Explore by Touch

Линейная навигация смахиванием

Чтение не-текстовых элементов

Добавление описаний контента

Включение фокусировки виджета

Создание сопоставимого опыта взаимодействия

Использование надписей для передачи контекста

Для любознательных: Accessibility Scanner

Упражнение. Улучшение списка

Упражнение. Предоставление контекста для ввода данных

Упражнение. Оповещения о событиях

Глава 20. Привязка данных и MVVM

Другие архитектуры: для чего?

Создание приложения BeatBox

Простая привязка данных

Импортирование активов

Получение информации об активах

Подключение активов для использования

Установление связи с данными

Создание ViewModel

Связывание с ViewModel

Отслеживаемые данные

Обращение к активам

Для любознательных: подробнее о привязке данных

Лямбда-выражения

14

Другие синтаксические удобства

BindingAdapter

Для любознательных: почему активы, а не ресурсы?

Для любознательных: «не-активы»?

Глава 21. Модульное тестирование и воспроизведение звуков

Создание объекта SoundPool

Загрузка звуков

Воспроизведение звуков

Зависимости при тестировании

Создание класса теста

Подготовка теста

Фиктивные зависимости

Написание тестов

Взаимодействия тестовых объектов

Обратные вызовы привязки данных

Выгрузка звуков

Повороты и преемственность объектов

Удержание фрагмента

Повороты и удержание фрагментов

Для любознательных: когда удерживать фрагменты

Для любознательных: Espresso и интеграционное тестирование

Для любознательных: фиктивные объекты и тестирование

Упражнение. Управление скоростью воспроизведения

Глава 22. Стили и темы

Цветовые ресурсы

Стили

Наследование стилей

Темы

Изменение темы

Добавление цветов в тему

Переопределение атрибутов темы

Исследование тем

Изменение атрибутов кнопки

Для любознательных: подробнее о наследовании стилей

Для любознательных: обращение к атрибутам тем

Глава 23. Графические объекты

Унификация кнопок

Геометрические фигуры

Списки состояний

Списки слоев

Для любознательных: для чего нужны графические объекты XML?

Для любознательных: Mipmap

Для любознательных: 9-зонные изображения

Упражнение. Темы кнопок

15Глава 24. Подробнее об интентах и задачах

Создание приложения NerdLauncher

Обработка неявного интента

Создание явных интентов на стадии выполнения

Задачи и стек возврата

Переключение между задачами

Запуск новой задачи

Использование NerdLauncher в качестве домашнего экрана

Упражнение. Значки

Для любознательных: процессы и задачи

Для любознательных: параллельные документы

Глава 25. HTTP и фоновые задачи

Создание приложения PhotoGallery

Основы сетевой поддержки

Разрешение на работу с сетью

Использование AsyncTask для выполнения в фоновом потоке

Главный программный поток

Кроме главного потока

Загрузка XML из Flickr

Разбор текста в формате JSON

От AsyncTask к главному потоку

Уничтожение AsyncTask

Для любознательных: подробнее об AsyncTask

Для любознательных: альтернативы для AsyncTask

Упражнение. Gson

Упражнение. Страничная навигация

Упражнение. Динамическая настройка количества столбцов

Глава 26. Looper, Handler и HandlerThread

Подготовка RecyclerView к выводу изображений

Множественные загрузки

Взаимодействие с главным потоком

Создание фонового потока

Сообщения и обработчики сообщений

Строение сообщения

Строение обработчика

Использование обработчиков

Передача Handler

Для любознательных: AsyncTask и потоки

Для любознательных: решение задачи загрузки изображений

Для любознательных: StrictMode

Упражнение. Предварительная загрузка и кэширование

Глава 27. Поиск

Поиск в Flickr

Использование SearchView

16

Реакция SearchView на взаимодействия с пользователем

Простое сохранение с использованием механизма общих настроек

Последний штрих

Упражнение. Еще одно усовершенствование

Глава 28. Фоновые службы

Создание IntentService

Зачем нужны службы

Безопасные сетевые операции в фоновом режиме

Поиск новых результатов

Отложенное выполнение и AlarmManager

Правильное использование сигналов

Неточное и точное повторение

Временная база

PendingIntent

Управление сигналами с использованием PendingIntent

Управление сигналом

Оповещения

Упражнение. Уведомления в Android Wear

Для любознательных: подробнее о службах

Что делают (и чего не делают) службы

Жизненный цикл службы

Незакрепляемые службы

Закрепляемые службы

Привязка к службам

Локальная привязка к службам

Для любознательных: JobScheduler и JobServices

JobScheduler и будущее фоновых операций

Упражнение. Использование JobService в Lollipop

Для любознательных: синхронизирующие адаптеры

Глава 29. Широковещательные интенты

Обычные и широковещательные интенты

Пробуждение при загрузке

Создание и регистрация автономного широковещательного приемника

Использование приемников

Фильтрация оповещений переднего плана

Отправка широковещательных интентов

Создание и регистрация динамического приемника

Ограничение широковещательной рассылки

Передача и получение данных с упорядоченной широковещательной рассылкой

Приемники и продолжительные задачи

Для любознательных: локальные события

Использование EventBus

Использование RxJava

Для любознательных: проверка видимости фрагмента

17Глава 30. Просмотр веб-страниц и WebView

И еще один блок данных Flickr

Простой способ: неявные интенты

Более сложный способ: WebView

Класс WebChromeClient

Повороты в WebView

Опасности при обработке изменений конфигурации

Для любознательных: внедрение объектов JavaScript

Для любознательных: переработка WebView в KitKat

Упражнение. Использование кнопки Back для работы с историей просмотра

Упражнение. Поддержка других ссылок

Глава 31. Пользовательские представления и события касания

Создание проекта DragAndDraw

Создание нестандартного представления

Создание класса BoxDrawingView

Обработка событий касания

Отслеживание перемещений между событиями

Рисование внутри onDraw(Canvas)

Упражнение. Сохранение состояния

Упражнение. Повороты

Глава 32. Анимация свойств

Построение сцены

Простая анимация свойств

Свойства преобразований

Выбор интерполятора

Изменение цвета

Одновременное воспроизведение анимаций

Для любознательных: другие API для анимации

Старые средства анимации

Переходы

Упражнения

Глава 33. Отслеживание местоположения устройства

Местоположение и библиотеки

Google Play Services

Создание Locatr

Play Services и тестирование в эмуляторах

Фиктивные позиционные данные

Построение интерфейса Locatr

Настройка Google Play Services

Разрешения

Использование Google Play Services

Геопоиск Flickr

Получение позиционных данных

18

Запрос разрешения во время выполнения

Проверка разрешений

Поиск и вывод изображений

Упражнение: обоснование разрешений

Упражнение. Индикатор прогресса

Глава 34. Карты

Импортирование Play Services Maps

Работа с картами в Android

Получение ключа Maps API

Создание карты

Получение расширенных позиционных данных

Работа с картой

Рисование на карте

Для любознательных: группы и ключи API

Глава 35. Материальный дизайн

Материальные поверхности

Возвышение и координата Z

Аниматоры списков состояний

Средства анимации

Круговое раскрытие

Переходы между общими элементами

Компоненты View

Карточки

Плавающие кнопки действий

Всплывающие уведомления

Подробнее о материальном дизайне

Послесловие

Последнее упражнение

Бессовестная самореклама

Спасибо

Также вы можете оставить вопрос или отзыв о книге: Android. Программирование для профессионалов. 3-е издание, Филлипс Б.

Про книгу «Android. Программирование для профессионалов»

Обычно я пишу обзоры книг, которые мне понравились. К книге, о которой пойдет речь в этом посте, у меня больше претензий, чем восторга, однако все-равно хочется о ней написать (и не только для того, чтобы поворчать).

Я уже давно поглядываю на программирование под Android, когда-то уже читал книги про это дело, но до реального применения все не добирался. И вот тут понадобилось написать для себя одно приложение под Android, поэтому параллельно с написанием кода решил освежить знания, почитав книжку. Надо сказать, что мне как-то не везет с литературой на эту тему, мне еще не попалось ни одной книги, которой бы я мог поставить твердую пятерку и написать восторженный отзыв. Везде описание идет какое-то обрывочное, которое не дает красивого описания архитектуры Android. Возможно, в этом виновата сама система.

К сожалению, книга Б. Харди, Б. Филлипса, К. Стюарта и К. Марсикано «Android. Программирование для профессионалов» не исключение. Но сначала хочется выразить свое «фи» переводчикам и издателю (несмотря на все мое уважение к издательству Питер). Во-первых, второе название книги перевели настолько вольно, что оно стало полностью противоречить содержанию книги. В оригинале книга называется «Android Programming. The Big Nerd Ranch Guide». Никаких профессионалов в оригинале нет, «The Big Nerd Ranch» — это компания, которая занимается разработкой и обучением программированию. И даже предисловие книги начинается словами «Начинающему программисту Android предстоит основательно потрудиться…» Таким образом, эта книга предназначена именно для новичков. Вот именно с этой позиции и стоит рассматривать эту книгу.

Во-вторых, что мне не понравилось в переводе книги. Ну почему наследование классов (subclassing) везде переведено как «субклассирование», а шаблон проектирования Singleton как «синглет»? Еще есть некоторые косяки у редактора в том, что где-то перепутаны рисунки, где-то неправильно названы имена файлов, используемых в листинге программы, но таких ошибок не так много.

Теперь, что касается содержания книги. У меня больше всего претензий к подаче материала. Для совсем начинающих она может быть даже неплохой книгой при условии, что читатель будет последовательно выполнять все упражнения, которые описаны в книге. На самом деле я очень не люблю, когда описание возможностей языка или платформы демонстрируется не на коротких примерах, которые можно легко удержать в голове, а на примере сравнительно больших программ, которые пишутся на протяжении нескольких глав, а именно так и построена данная книга. Из-за этого при переходе от одной главы к другой подробно описывается рефакторинг, которые нужно сделать, прежде чем удастся пощупать описываемую особенность Android. При этом в самом описании уже начинаешь путаться (если не писать программу, следуя за авторами), где код относится непосредственно к Android, а где к обвязке вокруг него, которую предлагается написать.

Кроме того, при использовании такого подхода в описании ощущаешь, что тебя ведут за руку по проторенной дорожке, но не дают обзора того, что еще можешь сделать с помощью описанных возможностей, и что для этого может понадобиться. Нет, в книге есть некоторые теоретические отступления, но их немного и они достаточно условно написаны (не хватает конкретики). А большую часть книги предлагается добавить такие-то строки в этот класс, такие-то строки в тот и посмотреть на результат. Наверное, такой подход оправдан для курсов по программированию, но в книге это читать ужасно нудно.

Какие же темы затронуты в книге? Разумеется, создание активностей и их жизненный цикл. Довольно неплохо написано про работу с фрагментами (они используются на протяжении всей книги), а также про взаимодействие активностей и фрагментов между собой.

Про стандартные виджеты сказано очень мало, используется их небольшое количество, и какие еще есть в поставке не сказано. Особенно обидно, что практически ничего не сказано про способы размещения виджетов в активности, рассказано только про те классы для размещения элементов, которые используются в примерах.

Неплохо написано про диалоговые окна, двухпанельный интерфейс и панели инструментов. Рассказано про работу с БД SQLite и работу с интентами (в том числе широковещательными). Что-то говорится о активах (assets) и использование класса SoundPool для проигрывания звуков. Отдельная глава посвящена стилям и темам. Кое-что сказано про рисование и анимации. Достаточно подробно разбираются примеры, где используется многопоточность и фоновые задачи. Про сервисы (фоновые службы) рассказывается тоже достаточно подробно.

Две главы посвящены отслеживанию положения пользователя с помощью GPS и работе с виджетом карты Google. И последняя глава посвящена Material Design.

В книге понравилось, что авторы показывают использование не только компонентов, встроенных в систему Android, но и использование библиотеки поддержки (support library), например, для работы с фрагментами, чтобы обеспечить работоспособность фрагментов в той версии Android, которая нативно их не поддерживает.

В книге для новичков не хватает «завершающего аккорда» — подпись файла APK и выпуск его в свет с помощью Google Play. Что-то про подпись файла APK сказано, но очень поверхностно и применительно к другой задаче — как получить доступ к Google Services.

В целом книга на троечку, но если вы только хотите «пощупать», что такое программирование под Android, то почитать ее можно.

Я буду благодарен, если вы посоветуете действительно качественную книгу про Android, может быть на английском языке, желательно, чтобы она была достаточно свежей. После прочтения этой книги у меня не сложилась полная мозаика из классов системы Android.

Программирование Android для начинающих — Третье издание

Здесь мы добавим на экран пару виджетов-кнопок, и тогда мы увидим быстрый способ заставить их что-то делать. Мы добавим кнопку двумя способами: во-первых, с помощью визуального конструктора, а во-вторых, добавив и отредактировав XML-код напрямую.

Добавление кнопки через визуальный конструктор

Чтобы начать работу с добавлением нашей первой кнопки, fragment_first.xml , откройте ее в редакторе и переключитесь обратно в представление дизайна, щелкнув вкладку Design (показано ниже):

Рисунок 2.7 — Вкладка «Дизайн»

Обратите внимание, что в левой части макета у нас есть окно, которое называется Palette и показано следующим образом:

Рисунок 2.8 — Окно палитры

Палитра разделена на две части. В левом списке есть категории элементов пользовательского интерфейса и вы можете выбрать категорию, а затем в правой части отображаются все доступные элементы пользовательского интерфейса из текущей выбранной категории.

Убедитесь, что выбрана категория Common , как показано на предыдущем рисунке.Теперь щелкните левой кнопкой мыши и удерживайте виджет Button , а затем перетащите его на макет где-нибудь ближе к центру вверху.

Неважно, нет ли это. Тем не менее, полезно практиковаться, чтобы понять это правильно. Итак, если вас не устраивает положение вашей кнопки, вы можете щелкнуть левой кнопкой мыши, чтобы выбрать ее в макете, а затем нажать клавишу Удалить на клавиатуре, чтобы избавиться от нее. Теперь вы можете повторять предыдущий шаг, пока не получите новую аккуратно расположенную кнопку, которая вас устраивает, как здесь:

Рисунок 2.9 — Обновление макета

На этом этапе мы могли бы запустить приложение на эмуляторе или на реальном устройстве, и кнопка была бы там — вроде того. Если бы мы щелкнули по ней, была бы даже простая анимация, представляющая нажатую и отпускаемую кнопку. Не стесняйтесь попробовать это сейчас, если хотите. Если вы это сделаете, вы заметите, что кнопка расположена не так, как вы ожидали:

Рисунок 2.10 — Кнопка расположена неправильно

Пока не беспокойтесь об этой явной аномалии; мы рассмотрим это в следующих нескольких разделах.

Далее мы собираемся отредактировать атрибуты нашей кнопки в окне Attributes .

Редактирование атрибутов кнопки

Убедитесь, что кнопка выбрана, щелкнув ее левой кнопкой мыши. Теперь найдите окно Attributes справа от окна редактирования, как показано ниже:

Рисунок 2.11 — Окно атрибутов

На предыдущем рисунке вы можете видеть, что у нас есть доступ к широкому выбору атрибутов из текущего выбранного элемента пользовательского интерфейса.Чтобы раскрыть больше атрибутов, мы щелкаем по различным категориям атрибутов и прокручиваем их, используя полосу прокрутки справа. Если они еще не открыты по умолчанию, щелкните левой кнопкой мыши на стрелках разделов Common Attributes и All Attributes , чтобы открыть их параметры.

Теперь вы можете увидеть полную информацию о кнопке, и мы можем приступить к ее редактированию. Может показаться удивительным то значительное количество атрибутов, которое имеет такая простая вещь, как кнопка.Это признак универсальности и мощности, которые API Android предоставляет для управления пользовательским интерфейсом.

Как видите, существует большой массив различных атрибутов, которые мы можем редактировать прямо здесь, в дизайнере пользовательского интерфейса. В разделе Глава 13, , Анонимные классы — Реализация виджетов Android, , мы также будем редактировать эти атрибуты и управлять ими с помощью нашего Java-кода.

Пока мы редактируем только один атрибут. Прокрутите окно Attributes , пока не увидите атрибут onClick в разделе Common Attributes , а затем щелкните его левой кнопкой мыши, чтобы выбрать его для редактирования, как показано здесь:

Рисунок 2.12 — Раздел общих атрибутов

Примечание

Если у вас возникнут проблемы с поиском атрибута, вы всегда можете найти его в разделе Все атрибуты , где атрибуты расположены в алфавитном порядке. Следовательно, атрибут onClick также можно найти примерно на две трети от длинного списка раздела All Attributes .

Введите topClick в поле редактирования атрибута onClick и нажмите Введите на клавиатуре.Обязательно используйте один и тот же регистр, включая несколько нелогичные строчные t и прописные C .

Когда вы закончите, окно Атрибуты будет выглядеть следующим образом:

Рисунок 2.13 — опция onClick

То, что мы здесь сделали, называется методом Java в нашем коде, который мы хотим вызывать, когда пользователь нажимает эту кнопку. Имя произвольно, но поскольку эта кнопка находится в верхней части экрана, имя кажется значимым и легко запоминающимся.Странный регистр, который мы использовали, — это соглашение, которое поможет нам сделать наш код ясным и легким для чтения. Мы увидим преимущества этого, когда наш код станет длиннее и сложнее.

Конечно, метод topClick еще не существует. Android Studio очень полезна, но есть кое-что, что нам нужно сделать самостоятельно. Мы напишем этот метод с использованием кода Java после того, как добавим еще одну кнопку в наш пользовательский интерфейс. Вы можете запустить приложение на этом этапе, и оно все равно будет работать. Но если вы нажмете кнопку, произойдет сбой, и вы получите сообщение об ошибке, потому что метод не существует.Android Studio предупреждает нас об этом надвигающемся сбое, выделяя атрибут onClick красным, как показано на предыдущем рисунке. Если вы наведете курсор мыши на этот красный контур, вы увидите подробную информацию о проблеме: Соответствующий обработчик метода… Не найден .

Изучение XML-кода новой кнопки

Прежде чем мы добавим последнюю кнопку для этого проекта. Щелкните вкладку Code , чтобы вернуться к просмотру кода XML, который создает наш пользовательский интерфейс.

Обратите внимание, что среди XML, который мы исследовали ранее, есть новый блок кода. Вот изображение нового блока кода:

Рисунок 2.14 — Новый блок кода среди XML

Также обратите внимание на следующие детали, которые должны соответствовать тому, что мы знаем об элементах пользовательского интерфейса XML и Android:

  • Новый код начинается с текста
  • Код имеет ряд атрибутов, определяющих кнопку, включая layoutWidth и layoutHeight .
  • Код включает атрибут onClick , который мы только что добавили со значением «topClick» .
  • Значение topClick атрибута onClick подчеркнуто красным, что указывает на ошибку отсутствующего метода.
  • Начало и конец кода, представляющего кнопку, заключены в элемент ConstraintLayout .

Как и в представлении «Дизайн», вы можете навести курсор мыши на подчеркнутый красным код topClick , чтобы раскрыть подробности проблемы: Соответствующий обработчик метода… Не найден .

Примечание

Во время написания этой книги Android Studio обновила способ отображения ошибок в XML. В настоящее время он выделяет ошибку красным цветом, а не подчеркивает красным, как показано на рисунках и в описаниях. Подчеркивание более четкое в черно-белой печати, поэтому они оставлены как есть.

Мы видим, что проблема в том, что Android Studio ожидает, что метод с именем topClick будет реализован в нашем Java-коде. Мы сделаем это, как только добавим вторую кнопку.

Добавление кнопки путем редактирования кода XML

Просто для разнообразия и чтобы доказать, что мы можем, теперь мы добавим еще одну кнопку, используя только XML-код, а не UI-дизайнер. В большинстве случаев мы будем использовать UI-дизайнер, но это быстрое упражнение должно укрепить в вашем сознании взаимосвязь между UI-дизайнером и лежащим в основе XML-кодом.

Мы добьемся этого, скопировав и вставив код для существующей кнопки. Затем мы внесем небольшие изменения в вставленный код.

Щелкните левой кнопкой мыши непосредственно перед кодом кнопки, который запускает

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *