Обновление экрана студии Android
Обновлено: 08.06.2023
Операционная система Android с открытым исходным кодом находится в постоянном развитии, при этом Google вносит большую часть нового кода для платформы, большая часть которого остается закрытой до тех пор, пока Google не будет готов к выпуску новой версии ОС. Ранее в этом месяце Google загрузил исходный код Android 12 в AOSP, отметив официальный запуск новой версии после нескольких месяцев публичного бета-тестирования. Сегодня Google дополняет этот релиз незначительным обновлением для платформы Android. На Саммите разработчиков Android компания Google анонсировала предварительную версию Android 12L для разработчиков — обновление, которое добавляет новые функции многозадачности и улучшает пользовательский интерфейс для устройств с большим экраном.
Android 12L: первая промежуточная версия Android за многие годы
Android 12L – это первое промежуточное обновление для платформы Android за последние годы. Последним промежуточным обновлением, которое внесло изменение как в номер версии, видимый пользователю, так и в уровень API, стал Android 8.1 Oreo (уровень API 27) в конце 2017 года, примерно четыре года назад. Google воздерживался от выпуска промежуточных обновлений в течение последних четырех лет по причинам, которые не разглашаются, но компания решила сделать это в этом году, чтобы удовлетворить растущий спрос на планшеты, складные устройства и другие устройства с большим экраном. Фактически, Google заявляет, что только за последние 12 месяцев они увидели почти 100 миллионов новых активаций Android-планшетов; Точно так же высокий спрос на складные устройства и Chromebook привел к значительному годовому росту для обоих форм-факторов. Сегодня Google сообщает, что активно используется более 250 миллионов устройств Android с большим экраном, поэтому компания посвятила большую часть новых изменений в Android 12L улучшению работы на устройствах с большим экраном.
Хотя в Android 12L не так много новых функций и API, как в Android 12, Google решил выпустить новую версию вместе с новым уровнем API платформы — API уровня 32, — поскольку текущая версия уже достигла стабильности платформы еще в Август. Google заявляет, что он «старался не вносить никаких критических изменений» для разработчиков приложений, поэтому компания решила не обновлять требования к целевому уровню API Google Play. Изменяющиеся требования Google Play к целевому уровню API вынуждают разработчиков приложений быть в курсе новых функций, изменений в поведении и методов обеспечения безопасности, а Google предоставляет разработчикам достаточно времени для обновления своих приложений. Поскольку в Android 12L не внесены какие-либо критические изменения, требования Google Play к целевому уровню API не будут соответствовать уровню API 32 в 2023 году, а вместо этого в том же году будут повышены до уровня API 33.
Новая версия предназначена для устройств Android с большим экраном, поэтому большинство новых функций, которые она представляет, будут недоступны на устройствах с маленьким экраном, таких как телефоны. Однако обновление Android 12L по-прежнему будет доступно для телефонов, хотя, кроме нескольких новых API, в том числе одного для пространственного звука и другого для перетаскивания, неясно, какие будут новые функции, если таковые имеются. доступны для телефонов. Наше предстоящее глубокое погружение в предварительную сборку для разработчиков, выпущенную сегодня, даст дополнительное представление о новых функциях для телефонов, готовых к запуску с Android 12L, которые, по слухам, будут включать реализацию с открытым исходным кодом динамической системы окраски Google под названием «monet» и продолжительность ползунок для жеста длительного нажатия кнопки питания.
Однако в официальном пресс-релизе Google нам предоставили некоторую информацию о новых изменениях, которые улучшат внешний вид Android на больших экранах.
Android 12L: новые функции и изменения пользовательского интерфейса для устройств с большим экраном
Дизайн Android 12L в основном остался таким же, как и в Android 12, в котором были представлены значительные визуальные изменения в соответствии с новым языком дизайна Google Material You. Вместо этого 12L настраивает макеты, чтобы лучше использовать большую площадь экрана планшетов, складных устройств и Chromebook. На экранах с разрешением более 600 dp шторка уведомлений, экран блокировки и другие поверхности системы используют двухколоночный макет для отображения дополнительной информации. Главный экран, обзор последних событий и системные приложения также были оптимизированы.
Примечательно, что в Android 12L появилась панель задач — функция, часто встречающаяся в операционных системах для настольных ПК. Панель задач Android позволит пользователям быстро переключаться между приложениями, не возвращаясь на главный экран и не открывая обзор последних. Кроме того, панель задач помещает функцию многозадачности Android с разделенным экраном на передний план и в центр; с помощью простого перетаскивания пользователи могут запускать приложение в режиме разделенного экрана. Android 12, а теперь и 12L, делают разделенный экран стандартным поведением для всех приложений, независимо от их конфигурации, при условии, что приложение работает на экране с разрешением выше 600dp. Это означает, что пользователям не придется беспокоиться о том, что приложение не поддерживает режим разделения экрана, хотя следует отметить, что производители устройств могут переопределить это поведение платформы.
Наконец, Google сообщает, что Android 12L предлагает лучший почтовый ящик для пользователей, запускающих приложения, которые не были разработаны для определенного макета экрана их устройства. Теперь производители устройств легко настраивают формат почтового ящика: они могут задавать собственные цвета или режимы почтового ящика, настраивать положение вложенных окон, применять собственные закругленные углы и т. д.
Android 12L: исходный код, дата выпуска, загрузки
Исходный код для Android 12L, скорее всего, будет загружен в AOSP в ветках «sc-v2» после завершения выпуска. SC-V2 — это кодовое имя для Android 12L, где «SC» относится к названию десерта «Снежный конус», которое Google внутренне дал выпуску Android 12. Google не сообщил точную дату выпуска Android 12L, хотя компания заявляет, что планирует выпустить обновление в начале следующего года. Как обычно, OEM-партнеры Google получат предварительный доступ к новой кодовой базе Android, поэтому ведущие производители планшетов и складных устройств получат преимущество в внедрении новых функций в свои будущие и существующие устройства. По словам Google, в связи с предстоящим выпуском новых планшетов, складных устройств и устройств Chromebook сейчас самое подходящее время для разработчиков приложений оптимизировать свои приложения для устройств с большим экраном.
С сегодняшнего дня разработчики могут тестировать свои приложения на Android 12L, загрузив предварительную сборку для разработчиков. Разработчики приложений могут загрузить образ системы Android 12L в эмуляторе Android, а также загрузить новейшие инструменты из последней предварительной версии Android Studio. Google еще не открыл предварительную версию для разработчиков на устройствах Pixel, хотя в конечном итоге они планируют это сделать. Дополнительные сведения см. на странице программы предварительной версии Android 12L для разработчиков.
Новые инструменты для создания приложений для больших экранов
Помимо предварительной версии Android 12L для разработчиков, Google также выпускает новые инструменты, упрощающие разработку полностью адаптивных приложений для разработчиков.
Во-первых, компания Google наконец-то опубликовала документацию по Material Design 3, или Material You, в том виде, в каком она продается. Google обновил свои компоненты, библиотеки и руководства для материалов, чтобы помочь разработчикам реализовать динамические цвета (включая цветовую схему бренда), дизайн для складных устройств, создавать с помощью токенов дизайна, обновлять свои виджеты и многое другое. Некоторые из доступных инструментов включают веб-инструмент Material Theme Builder, плагин Figma Material Theme Builder и Figma Design Kit. Также есть лаборатория кода и дизайн-лаборатория по применению и визуализации динамического цвета, документация по материалам, которые вы выполняете в Jetpack Compose, и рекомендации по распространенным шаблонам компоновки.
Новая страница Google, посвященная Material Design 3, также содержит рекомендации по настройке пользовательского интерфейса навигации в соответствии с классом размера окна устройства пользователя. Классы размера окна — это набор контрольных точек окна просмотра, с которыми разработчики могут проектировать и тестировать макеты приложений с изменяемым размером. В настоящее время существует три категории — компактные, средние и расширенные, — которые представляют большую часть устройств в экосистеме. Google рекомендует использовать навигационную панель для компактных экранов и навигационную панель для устройств класса средней ширины и больше. Для устройств с расширенной шириной, таких как складные, Google рекомендует интерфейс List/Detail, реализованный с помощью SlidingPaneLayout. API-интерфейсы WindowSizeClass будут доступны в следующем выпуске Jetpack WindowManager 1.1.
В сочетании с новыми контрольными точками WindowSizeClass Google выпускает четыре эталонных устройства в различных инструментах Android Studio, которые помогают разрабатывать и тестировать пользовательский интерфейс и макеты. Эти эталонные устройства — телефон, складное устройство, планшет и настольный компьютер — представляют популярные (или скоро станут популярными) форм-факторы, для которых разработчикам рекомендуется создавать адаптивные макеты.
Если ваше приложение имеет несколько действий, обратите внимание на новый выпуск Jetpack WindowManager 1.0 beta 03, в котором добавлены новые API-интерфейсы для внедрения действий, упрощающие поддержку парадигм пользовательского интерфейса, таких как представление TwoPane. Встраивание действий, как следует из названия, позволяет отображать несколько действий одновременно, а новые API-интерфейсы Jetpack WindowManager без проблем работают на складных устройствах даже с минимальным рефакторингом вашего приложения. Разработчики могут отображать действия рядом друг с другом, стопкой или в виде полного окна задачи, создав файл конфигурации XML или выполнив вызов API WindowManager.
SlidingPaneLayout также будет обновлен в ближайшие месяцы для поддержки этих новых API-интерфейсов для встраивания действий.
Далее Google дает рекомендации о том, как сообщить вашему приложению об изменениях форм-фактора, например о складывании и раскладывании складного устройства. WindowManager предоставляет API-интерфейс для оконных функций, таких как сгибы и шарниры, которые приложения могут использовать для адаптации содержимого окна, чтобы избежать или использовать преимущества.
Если вы не знаете, какие шаги следует предпринять, чтобы адаптировать свой пользовательский интерфейс для устройств с большим экраном, новый инструмент визуального анализа в Android Studio будет активно отображать предупреждения и предложения пользовательского интерфейса при проверке макета.Это поможет выявить потенциальные проблемы, влияющие на устройства с большим экраном, включая затронутый форм-фактор. Этот инструмент в настоящее время доступен в сборках Android Studio «Chipmunk», которые в настоящее время находятся на канале Canary.
Наконец, Android Studio «Chipmunk» также включает конфигурацию эмулятора с изменяемым размером, которая позволит вам быстро переключаться между четырьмя ранее упомянутыми эталонными устройствами. Вы можете использовать это для проверки макета во время разработки и тестирования поведения во время выполнения. Чтобы создать эмулятор с изменяемым размером, создайте новое виртуальное устройство в диспетчере устройств Android Studio, а затем выберите конфигурацию «Изменяемый размер».
Что нового в Google Play: повышение доступности приложений, оптимизированных для больших экранов, повышение доверия пользователей
В Google Play внесены изменения, которые улучшат рекомендации приложений для пользователей устройств с большим экраном. Во-первых, Google Play добавляет новые проверки для оценки приложений в соответствии с рекомендациями Google по качеству приложений для больших экранов. Эти показатели будут учитываться при выдаче рекомендаций по приложениям на устройствах с большим экраном. Google Play скоро покажет уведомление на странице со списком приложений, если это приложение не оптимизировано для больших экранов. Кроме того, Google Play скоро покажет пользователям рейтинги приложений, зависящие от форм-фактора устройства, которое они используют, как было объявлено ранее в этом году. Наконец, Google выделяет недавние изменения своей политики, которые затрагивают все приложения с моделями подписки; начиная со следующего года плата за обслуживание для всех подписок в Google Play будет снижена вдвое.
В скором времени в Google Play появится новый раздел о безопасности данных, в котором будет представлена информация о том, как приложения собирают, обмениваются и защищают данные пользователей. Этот раздел безопасности данных отображается на странице со списком приложений до того, как пользователи установят приложение. Сам Google не предоставляет информацию, которая будет отображаться в разделе безопасности данных. Вместо этого разработчики должны отправить эту информацию в Google через Play Console. Дополнительную информацию можно найти в сообщении блога Google, опубликованном ранее в этом месяце, или в сегодняшнем сообщении блога, в котором сообщается о новинках в Google Play.
Что нового в Jetpack: материал, который вы сочиняете, сочиняете, который нужно носить
Jetpack Compose, современный набор инструментов пользовательского интерфейса с подходом пользовательского интерфейса на основе представления, а не пользовательским интерфейсом на основе XML, теперь поддерживает Material You с первым альфа-выпуском Compose Material 3, который предлагает компоненты и темы в стиле Material Design 3. Тем временем первая бета-версия Jetpack Compose 1.1 включает в себя такие функции, как поддержка прокрутки с прокруткой для Android 12, улучшенный размер сенсорного экрана, экспериментальная ленивая анимация макета и многое другое.
Что еще более важно, Jetpack Compose для Wear OS теперь доступен в предварительной версии для разработчиков, что упрощает разработку пользовательского интерфейса для носимых устройств Android. Watch Face Studio от Samsung упрощает разработку циферблата до такой степени, что для создания циферблата не требуется кодирование. Дополнительную информацию о том, что Google анонсировала для Wear OS на Android Dev Summit, можно найти в пресс-релизе Google.
Помимо Compose, недавно были обновлены и другие библиотеки Jetpack. Навигация добавляет поддержку нескольких обратных стеков, WorkManager добавляет поддержку ускоренных заданий, Room добавляет автоматическую миграцию и отношения между несколькими картами, а Macrobenchmark добавляет упрощенную и более точную синхронизацию кадров и обратную совместимость с Android M.
В Esper мы создаем Android в различных форм-факторах. Таким образом, объявления Google на саммите разработчиков Android представляют для нас особый интерес, даже если пройдут месяцы, прежде чем исходный код Android 12L будет опубликован для публики. Свяжитесь с одним из наших экспертов, если вам интересно, как последние объявления Google повлияют на ваш парк устройств.
Попробуйте выполнить следующие действия, если приложение, установленное на вашем телефоне, имеет одну из следующих проблем:
- Сбой.
- Не открывается.
- Не буду отвечать.
- Не работает должным образом. Если не работает приложение с мгновенным запуском, попробуйте выполнить следующие действия по устранению неполадок.
После каждого шага перезагружайте телефон, чтобы проверить, устранена ли проблема.
Шаг 1. Перезапустите и обновите
- На большинстве телефонов нажмите и удерживайте кнопку питания примерно 30 секунд или пока телефон не перезагрузится.
- Возможно, вам потребуется нажать "Перезагрузить" .
- Откройте приложение "Настройки" на телефоне.
- Внизу коснитесь SystemAdvancedОбновление системы.
- В зависимости от телефона вам может потребоваться нажать О телефоне или О планшетеОбновление ПО.
- Откройте приложение Google Play Маркет.
- В правом верхнем углу коснитесь значка профиля.
- Нажмите "Управление приложениями и устройствами".
- В разделе "Доступны обновления" выберите обновление всех приложений или определенного приложения.
Шаг 2. Проверьте наличие более крупной проблемы с приложением
Обычно приложение можно принудительно остановить в приложении "Настройки" на телефоне. Настройки могут различаться в зависимости от телефона.За дополнительной информацией обращайтесь к производителю устройства.
Совет. Если проблемы не исчезнут после того, как вы принудительно остановили приложение, вам может потребоваться связаться с его разработчиком. Узнайте, как связаться с разработчиком.
Обычно очистить кэш и данные приложения можно в приложении "Настройки" на телефоне. Настройки могут различаться в зависимости от телефона. За дополнительной информацией обращайтесь к производителю устройства.
Временно освобождать место при очистке кэшированных данных. Это краткосрочное решение. Со временем кешированные данные снова накапливаются.
Совет. Если проблемы не исчезнут после того, как вы очистили кэш и данные приложения, вам может потребоваться связаться с его разработчиком. Узнайте, как связаться с разработчиком.
Синхронизировать устройство с серверами Google
- Откройте приложение "Настройки" на телефоне.
- Нажмите "Системная дата и время".
- Отключите автоматический часовой пояс и автоматическую дату и время.
- Измените дату и время на неверные.
- Включите автоматический часовой пояс и автоматическую дату и время.
Внимание! Все данные, сохраненные в этом приложении, будут удалены.
Совет. Если вы хотите снова использовать приложение, попробуйте переустановить его. Узнайте, как переустанавливать приложения.
Важно! Если вы выполнили действия по устранению неполадок, но проблема не устранена, свяжитесь с нами или с разработчиком приложения.
Существуют тысячи различных устройств на базе Android с разными размерами экрана, архитектурой чипа, аппаратной конфигурацией и версией программного обеспечения. К сожалению, сегментация — это плата за открытость, и существуют тысячи способов, при которых ваше приложение может дать сбой на разных устройствах. Несмотря на такую огромную сегментацию, большинство ошибок на самом деле вносятся из-за логических ошибок. Эти ошибки легко предотвратить, если мы правильно разбираемся в основах! Вот краткий обзор 10 наиболее распространенных ошибок, которые допускают разработчики Android.
Иван — опытный разработчик Android и консультант с шестилетним опытом разработки удобных приложений.
Андроид. Что не нравится в этой платформе? Он бесплатный, его можно настраивать, он быстро развивается и доступен не только на вашем телефоне или планшете, но и на смарт-часах, телевизоре и автомобиле.
С последним обновлением Lollipop программирование для Android продолжает улучшаться. Платформа немного повзрослела с момента первоначального выпуска AOSP и установила довольно высокую планку ожиданий пользователей. Посмотрите, как хорошо выглядит новый шаблон дизайна материалов!
Существуют тысячи различных устройств с разными размерами экрана, архитектурой микросхем, конфигурациями оборудования и версиями программного обеспечения. К сожалению, сегментация — это плата за открытость, и существуют тысячи причин, по которым ваше приложение может дать сбой на разных устройствах, даже если вы опытный программист Android.
Несмотря на такую огромную сегментацию, большинство ошибок на самом деле появляются из-за логических ошибок. Эти ошибки легко предотвратить, если мы правильно понимаем основы!
Вот учебник по программированию для Android, посвященный 10 наиболее распространенным ошибкам, которые допускают разработчики Android.
К моему большому удовольствию, в настоящее время эта ошибка Android встречается гораздо реже (отчасти потому, что клиенты начинают понимать, что времена, когда Apple устанавливала все стандарты дизайна, давно прошли). Но тем не менее время от времени мы видим приложение, являющееся клоном iOS.
Не поймите меня неправильно, я не проповедник программирования для Android! Я уважаю каждую платформу, которая продвигает мобильный мир на шаг вперед. Но сейчас 2014 год, и пользователи уже давно используют Android и привыкли к платформе. Навязывать им стандарты дизайна iOS — ужасная стратегия!
Если нет веских причин для нарушения правил, не делайте этого. (Google делает это постоянно, но никогда не копирует и вставляет.)
Вот некоторые из наиболее распространенных примеров этой ошибки Android:
- Вы не должны делать статические вкладки, и им не место внизу (я указываю на ваш Instagram).
- Значки системных уведомлений не должны быть цветными.
- Значки приложений не должны размещаться внутри прямоугольника со скругленными углами (если только это не ваш настоящий логотип, например, facebook).
- Экраны-заставки не нужны, если не считать первоначальной настройки/введения. Не используйте их в других сценариях.
- В списках не должно быть знаков вставки.
Это лишь некоторые из многих других мелочей, которые могут испортить впечатление пользователя.
Если вы не создаете киоск/рекламное приложение для одного планшета, скорее всего, ваше Android-приложение не будет хорошо смотреться на всех устройствах. Вот несколько советов по программированию для Android, которые следует запомнить:
- Пиксели, не зависящие от плотности (dp), отличаются от обычных пикселей (px).
- Ресурсы включены несколько раз для учета различной плотности и ориентации.
- Рисуемые элементы с 9 патчами растягиваются по размеру экрана.
Существуют буквально тысячи возможных сценариев, но через некоторое время у вас появляется чувство, что нужно охватить их все несколькими случаями.
У вас нет тысяч устройств? Не проблема. Эмулятор Android очень хорошо воспроизводит физические устройства. Еще лучше — попробуйте Genymotion, это молниеносно и поставляется с множеством различных популярных предустановленных устройств.
Кроме того, пробовали ли вы поворачивать устройство? Весь ад может вырваться на свободу…
Намерения — один из ключевых компонентов Android. Это способ передачи данных между разными частями приложения или, что еще лучше, между разными приложениями в системе.
Допустим, у вас есть приложение-галерея, которое может отправлять ссылки для скачивания некоторых изображений по SMS. Какой из двух вариантов кажется более логичным?
Запросить разрешение SEND_SMS.
Запустите SMS-намерение и позвольте приложению, предназначенному для SMS, сделать всю работу
Если у вас есть сомнения, лучшим решением будет второй вариант!
Этот подход можно применить практически ко всему. Делитесь контентом, фотографируйте, записывайте видео, выбирайте контакты, добавляйте события, открывайте ссылки в родных приложениях и т. д.
Если нет веских причин для создания пользовательской реализации (например, камеры, которая применяет фильтры), всегда используйте намерения для этих сценариев. Это сэкономит вам много времени на программирование и лишит AndroidManifest.xml ненужных разрешений.
Некоторое время назад в Android Honeycomb появилась концепция фрагментов. Думайте о них как об отдельных строительных блоках со своими (довольно сложными) жизненными циклами, существующими внутри Activity. Они очень помогают с оптимизацией под разные экраны, легко управляются родительской активностью, могут многократно использоваться, комбинироваться и располагаться по желанию.
Запуск отдельной активности для каждого экрана приложения крайне неэффективен, так как система будет пытаться удерживать их в памяти как можно дольше. Убийство одного не освободит ресурсы, используемые другими.
Если вы не хотите углубляться в ядро Android и читать эту статью, выступающую против использования фрагментов, вам следует использовать фрагменты везде, где это возможно. По сути, это говорит о том, что у фрагментов и загрузчиков курсоров хорошее предназначение, но плохая реализация.
Основной поток имеет единственную цель: поддерживать отзывчивость пользовательского интерфейса.
Хотя наука об измерении частоты кадров, которую могут воспринимать наши глаза/мозг, сложна и зависит от множества факторов, общее правило заключается в том, что все, что ниже 24 кадров в секунду с задержкой более 100 мс, не будет восприниматься как плавное.
Это означает, что действия пользователя будут иметь отложенную обратную связь, а запрограммированное вами приложение для Android перестанет отвечать. Лишение пользователя контроля над приложением приводит к разочарованию, разочарованные пользователи, как правило, оставляют очень негативные отзывы.
Хуже того, если основной поток заблокирован на некоторое время (5 секунд для действий, 10 секунд для широковещательных приемников), произойдет ANR.
Это было настолько распространено в Android 2.x, что в более новых версиях система не позволяла совершать сетевые вызовы в основном потоке.
Чтобы избежать блокировки основного потока, всегда используйте рабочие/фоновые потоки для: 1. сетевых вызовов 2. загрузки растрового изображения 3. обработки изображений 4. запросов к базе данных 5. чтения/записи SD
«Хорошо, я не буду использовать основную ветку. Я напишу свой собственный код, который взаимодействует с моим сервером в фоновом потоке».
Нет! Пожалуйста, не делайте этого! Сетевые вызовы, загрузка изображений, доступ к базе данных, синтаксический анализ JSON и вход в социальные сети — это наиболее распространенные действия, которые вы выполняете в своем приложении. Не только ваше, каждое приложение там. Существует лучший способ. Помните, как развивалась и развивалась Android как платформа? Вот краткий список примеров:
- Используйте Gradle в качестве системы сборки.
- Используйте Retrofit/Volley для сетевых вызовов.
- Используйте Picasso для загрузки изображений.
- Используйте Gson/Jackson для синтаксического анализа JSON.
- Используйте общие реализации для входа через социальные сети.
Если вам нужно что-то реализовать, скорее всего, это уже написано, протестировано и широко используется. Прежде чем писать собственный код, проведите базовое исследование и прочтите несколько руководств по программированию для Android!
Отлично. Мы узнали, что есть лучший способ обработки длительных задач, и мы используем для этой цели хорошо документированные библиотеки. Но пользователю все равно придется подождать. Это неизбежно. Посылки не отправляются, обрабатываются и принимаются моментально. Есть задержки при передаче туда и обратно, сбои в сети, пакеты теряются, а мечты разрушаются.
Но все это измеримо. Успешные сетевые вызовы гораздо более вероятны, чем неудачные. Так зачем ждать ответа сервера, прежде чем обработать успешный запрос? Бесконечно лучше предполагать успех и справляться с неудачами. Таким образом, когда пользователю нравится сообщение, количество лайков немедленно увеличивается, и в маловероятном случае неудачного звонка пользователь получает уведомление.
В современном мире ожидается немедленная обратная связь. Люди не любят ждать. Дети не хотят сидеть в классе и получать знания, которые не принесут ожидаемой отдачи в будущем. Приложения должны подстраиваться под психологию пользователя.
Пользователи любят контент!Особенно, когда контент хорошо отформатирован и выглядит красиво. Изображения, например, являются чрезвычайно приятным контентом, в основном из-за их свойства передавать тысячу слов на изображение. Они также потребляют много памяти. Много памяти!
Прежде чем изображение появится на экране, оно должно быть загружено в память. Поскольку растровые изображения являются наиболее распространенным способом сделать это, мы собираемся предоставить руководство по программированию для Android для всего процесса:
Допустим, вы хотите отобразить на экране изображение, которое вы только что сняли камерой. Общий объем необходимой для этого памяти рассчитывается по следующей формуле: memory_needed_in_bytes = 4 * image_width * image_height;
Почему 4? Что ж, наиболее распространенная/рекомендуемая конфигурация растрового изображения — ARGB_8888. Это означает, что для каждого рисуемого пикселя нам нужно хранить в памяти 8 бит (1 байт) для альфа-, красного, жадного и синего каналов, чтобы правильно отобразить его. Существуют альтернативы, например конфигурация RGB_565, для которой требуется в два раза меньше памяти, чем для ARGB_8888 , но при этом теряется прозрачность и точность цветопередачи (возможно, добавляется зеленый оттенок).
Предположим, у вас есть совершенно новое устройство с экраном Full HD и камерой 12 Мп. Изображение, которое вы только что сделали, имеет размер 4000x3000 пикселей, а общая память, необходимая для его отображения, составляет: 4 байта * 4000 * 3000 = 48 МБ
48 мегабайт оперативной памяти только для одного изображения!? Это много!
Теперь давайте рассмотрим разрешение экрана. Вы пытаетесь отобразить изображение размером 4000 x 3000 на экране с разрешением 1920 x 1080 пикселей. В худшем случае (отображение изображения на весь экран) вам не следует выделять более 4 * 1920 * 1080 = 8,3 МБ памяти.
Всегда следуйте советам по программированию для Android, чтобы эффективно отображать растровые изображения:
- Измерьте представление, в котором вы показываете свои изображения.
- Измените масштаб или обрежьте большое изображение соответствующим образом.
- Показывать только то, что можно отобразить.
Макеты имеют представление XML в Android. Чтобы отрисовать контент, необходимо проанализировать XML, измерить экран и соответствующим образом разместить все элементы. Это ресурсоемкий и трудоемкий процесс, который необходимо оптимизировать.
Вот как работает ListView (а в последнее время и RecyclerView).
Если макет был раздут один раз, система использует его повторно. Но все равно в какой-то момент должно произойти раздувание макета.
Допустим, вы хотите создать сетку 3 x 3 с изображениями. Один из способов сделать это — вертикальный LinearLayout, содержащий 3 LinearLayout с одинаковым весом, каждый из которых содержит 3 ImageView с одинаковым весом.
Что мы получаем при таком подходе? Предупреждение о том, что «вложенные веса плохо влияют на производительность».
В мире программирования Android есть поговорка, которую я только что придумал: "Небольшими усилиями можно сгладить любую иерархию".
В этом случае RelativeLayout или GridLayout эффективно заменят вложенные LinearLayouts .
Ну, это не ошибка, а плохая практика.
Android 2.x стал важной вехой в разработке этой платформы, но некоторые вещи следует оставить позади. Поддержка старых устройств усложняет обслуживание кода и ограничивает процесс разработки.
Цифры ясны, пользователи ушли, разработчики не должны отставать.
Я знаю, что это не относится к некоторым крупным рынкам со старыми устройствами (например, в Индии), и установка minSdkVersion на 14 в приложении Facebook означает, что пара миллионов пользователей останутся без своей любимой социальной сети. Но если вы начинаете с чистого листа и пытаетесь создать приятный опыт для своих пользователей, рассмотрите возможность избавиться от прошлого. У пользователей, у которых нет ресурсов или которые чувствуют потребность в обновлении своего устройства/ОС, не будет стимула попробовать улучшенную версию вашего приложения для Android и в конечном итоге потратить на это деньги.
Подведение итогов
Android – мощная платформа, которая быстро развивается. Возможно, неразумно ожидать, что пользователи будут идти в ногу со временем, но это крайне важно для разработчиков Android.
Знать, что Android есть не только на наших телефонах и планшетах, еще важнее. Он на наших запястьях, в наших гостиных, на наших кухнях и в наших автомобилях. Перед тем, как мы начнем расширяться, очень важно разобраться в основах.
Как разработчики, мы всегда хотим, чтобы пользователи быстро обновляли свои приложения до последней версии. Мы хотим, чтобы все использовали новейшие функции, включенные в обновления. Google уведомляет пользователей Android всякий раз, когда доступны обновления для определенных приложений. Однако это в основном для пользователей, у которых включена функция автоматического обновления. Поэтому пользователям важно знать, когда для вашего приложения доступно новое обновление.
Введение
Предположим, пользователь установил ваше приложение на свой мобильный телефон. Тем не менее, вы добавили новые важные функции или исправили ошибку в приложении.Единственный способ, которым пользователь может получить доступ к этим функциям, — это обновить приложение. Некоторым пользователям не хватает интереса или времени, чтобы открыть магазин Google Play и обновить свои приложения. Это означает, что им потребуется время, прежде чем они перейдут на последнюю версию.
Чтобы решить эту проблему, Google I/O представил API обновления в приложении. Этот API оповещает пользователей о появлении новой версии в магазине Google Play. API представляет пользовательский интерфейс обновления в вашем приложении, чтобы уведомить пользователей о необходимости обновления до новой доступной версии приложения. Пользователям не нужно открывать магазин Google Play, чтобы начать обновление.
В этом руководстве мы узнаем об обновлениях Google в приложениях и реализуем их в наших приложениях. Мы обсудим два метода реализации обновлений в приложении: немедленный и гибкий.
Немедленно
Немедленное обновление представляет блокирующий полноэкранный пользовательский интерфейс. Когда пользователь запускает обновление, он не может использовать приложение, пока обновление не будет установлено. Приложение автоматически перезапустится после завершения обновления. Этот метод предпочтительнее, если в обновлении представлены важные функции.
Гибкий
Гибкое обновление позволяет пользователям взаимодействовать с приложением, пока обновление выполняется в фоновом режиме. После загрузки обновления приложение предложит пользователю перезапустить приложение. Затем приложение установит обновление и откроет приложение на переднем плане. Желательно, чтобы обновление содержало незначительные изменения, не влияющие на важные функции приложения.
Предпосылки
В этом руководстве предполагается, что вы уже знакомы с разработкой приложений для Android с использованием Android Studio и Java.
Для проведения тестирования вам потребуется:
- Учетная запись Google Play Console.
- Приложение уже опубликовано в магазине Google Play.
Требования
- Устройство под управлением Android 5.0 (уровень API 21) или выше.
- Основная библиотека Google Play версии 1.5.0 или выше.
Реализация
Добавьте следующую библиотеку в файл app.gradle.
Синхронизировать для загрузки библиотеки.
На момент написания этого руководства версия Google Play Core была 1.8.3 . Рекомендуется иметь последнюю версию. Проверьте наличие последней версии здесь.
Фон
Настроить обновление в приложении очень просто. Google Core API реализует все основные функции. Пользователю не нужно активировать автообновления в магазине Google Play. API будет обрабатывать поток обновлений в любом приложении, в котором реализована эта концепция обновления внутри приложения.
Прежде чем работать с типом обновления, гибким или немедленным, вы должны понять, как работает API. Давайте обсудим некоторые ключевые классы и функции, которые помогают нам запускать поток обновления.
Чтобы проверить, доступно ли обновление в магазине Google Play, нам нужно создать экземпляр appUpdateManager. Он взаимодействует с объектом AppUpdateInfo. Объект инициирует удаленную связь с магазином Google Play. Он содержит результаты свойств и статус любого доступного обновления. Результатом является сбор данных о доступности обновлений, таких как доступная версия приложения. Затем данные будут использоваться для определения того, должен ли API инициировать поток обновления.
AppUpdateInfo имеет следующие методы:
updateAvailability() обрабатывает следующее:
UPDATE_AVAILABLE : проверяет, доступна ли новая версия приложения в магазине Google Play.
DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS : обрабатывает случай, когда пользователь инициировал процесс обновления, но закрыл приложение во время выполнения обновления. updateAvailability() вернет состояние процесса обновления.
installStatus() возвращает значение этапа обновления. installStatus() — это экземпляр installStateUpdatedListener, подключенный к appUpdateManager. Он возвращает значения статуса обновления, такие как:
ЗАГРУЖЕНО: когда пользователь нажимает на обновление, приложение сначала загружает APK. installStatus() устанавливает действие, которое должно быть выполнено после загрузки APK.
INSTALLED — installStatus() задает действие при установке нового доступного обновления.
Чтобы запустить поток обновлений, мы сначала проверяем updateAvailability(), чтобы определить, доступно ли обновление. Возвращаемое значение должно быть UPDATE_AVAILABLE, если разработчик добавил новые функции.
Далее мы проверим, разрешен ли тип обновления, с помощью функции isUpdateTypeAllowed() и передаем AppUpdateType , который может быть IMMEDIATE или FLEXIBLE .
Мы определили, доступно обновление или нет (состояние доступного обновления). Если тип обновления разрешен, appUpdateManager вернет статус обновления из значений AppUpdateInfo и запустит поток обновления с помощью startUpdateFlowForResult .
Мы передаем следующие параметры в startUpdateFlowForResult, чтобы запустить пользовательский интерфейс потока обновления:
- Информация appUpdateInfo, которую мы ранее получили из магазина Google Play.
- Обновленный поток, который мы хотим активировать. Ранее передавался в isUpdateTypeAllowed как AppUpdateType, который может иметь значение IMMEDIATE или FLEXIBLE .
- Контекст выполнения в текущем действии.
- Код запроса для получения таких результатов OnActivity, как: – Если пользователь отменил обновление. - Если обновление в порядке. – Если не удалось выполнить обновление.
После этого мы готовы завершить обновление с помощью completeUpdate() .
Реализация гибкого процесса обновления
Этот поток не блокирует взаимодействие пользователя с приложением. Когда обновление доступно, пользователь загружает APK обновления, которое происходит в фоновом режиме. Когда загрузка будет завершена, пользователю будет предложено установить только что загруженное приложение, чтобы установить новые обновления.
Давайте разберемся с потоком.
Прежде чем мы это проверим, убедитесь, что вы реализовали поток обновления на главной странице запуска приложения, например, действие входа в систему. Это гарантирует, что пользователь будет предупрежден, как только откроет приложение.
Экземпляр AppUpdateManager
Создайте экземпляр AppUpdateManager . Идите вперед и объявите AppUpdateManager прямо над onCreate .
Под onCreate создайте экземпляр.
Проверить наличие обновлений
Чтобы реализовать поток обновлений, необходимо проверить, есть ли обновленная версия приложения в магазине Google Play.
Создайте функцию checkUpdate() и вызовите ее в onCreate .
Вот что делает функция:
Он связывается с Play Маркетом, чтобы проверить, доступно ли обновление.
- Доступность обновлений для текущего приложения,
- Намерение запустить поток обновления,
- И, если применимо, состояние текущих обновлений.
Зарегистрируйте прослушиватель для связи с appUpdateInfoTask . Если условия проверяют, что UPDATE_AVAILABLE имеет значение true, проверьте, разрешено ли обновление, и установите режим обновления FLEXIBLE. Если эти условия соблюдены, мы запустим поток обновления с помощью startUpdateFlow(appUpdateInfo) (мы рассмотрим это позже).
В этом случае наш режим обновления установлен на Гибкий. Обновление скачивается в фоновом режиме. Затем нам нужно проверить статус установки. Если статус показывает, что приложение ЗАГРУЖЕНО, нам нужно уведомить пользователя о том, что загрузка завершена. Вы можете использовать Snackbar или AlertDialog . В этом уроке мы будем использовать Snackbar .
Создайте функцию с именем popupSnackBarForCompleteUpdate(). Этот метод будет вызываться, когда installStatus() будет равен DOWNLOADED. Пользовательский интерфейс будет реагировать, подталкивая пользователя к установке скачанного APK.
Не забудьте нажать клавиши ALT + ВВОД на ПК и OPTION + ВВОД на Mac, чтобы импортировать классы после копирования и вставки блоков кода в IDE.
Обработка потока обновления
Теперь создайте функцию startUpdateFlow(appUpdateInfo), которую мы передали выше.
Мы проверили, доступно ли обновление. Мы также подтвердили, что обновленная платформа поддерживается, и поэтому мы готовы запросить обновление.
startUpdateFlowForResult() запросит обновление у AppUpdateInfo, в котором содержится информация об обновлении. Чтобы обеспечить ожидаемый запуск потока обновления, мы передаем некоторые параметры в startUpdateFlowForResult . К ним относятся:
AppUpdateType — режим потока обновления, который мы хотим выполнить. В данном случае мы установили ГИБКИЙ .
this — контекст выполнения текущего действия, запрашивающего обновление.
FLEXIBLE_APP_UPDATE_REQ_CODE — код запроса, который обрабатывает действия пользователя наActivityResult . Убедитесь, что вы объявили FLEXIBLE_APP_UPDATE_REQ_CODE прямо над onCreate , как показано ниже.
Обработка действий пользователя
Нам нужно обработать onActivityResult, чтобы проверить действия пользователя, например случаи отмены или сбоя обновления. FLEXIBLE_APP_UPDATE_REQ_CODE отслеживает запрос на обновление, как это реализовано в приведенном ниже коде.
Из приведенного выше кода есть несколько результатов:
- Если пользователь отменил установку, вы можете вызвать функцию checkUpdate(), чтобы перезапустить процесс обновления.
Здесь можно выполнять множество действий, например:
- Всплывающее диалоговое окно, информирующее пользователя о необходимости обновить приложение.
- Сообщите им о новых функциях или ошибках, которые исправит обновление.
Если пользователь согласен, вы можете вызвать функцию checkUpdate(), чтобы повторно инициировать процесс обновления. Вы также можете решить закрыть приложение с помощью finish() . В противном случае ничего не делайте и продолжайте работу в обычном режиме.
RESULT_OK — показывает, что обновление прошло успешно. Мы не можем назначить ему какое-либо действие, так как наша цель достигнута.Но вы можете показать пользователю сообщение с благодарностью за то, что он нашел время, чтобы обновить приложение до последней версии.
Если обновление не удалось, это может быть связано с ошибкой, например, с плохим подключением к Интернету. Запросите обновление еще раз, вызвав checkUpdate(), чтобы перезапустить процесс обновления.
Наблюдение за потоком обновлений
Как упоминалось ранее, гибкий процесс обновления выполняется в фоновом режиме. Нам нужно отслеживать поток обновлений, чтобы знать, когда загрузка приложения завершена, и инициировать процесс установки.
Для этого нам нужно зарегистрировать прослушиватель, чтобы получить статус обновления. Слушатель информирует приложение о каждом шаге процесса обновления.
Объявите слушателя.
Добавьте следующий код сразу после экземпляра appUpdateManager, созданного внутри метода onCreate.
Приведенный выше код отслеживает статус обновления.
- Если статус равен DOWNLOADED , запустите панель закусок, чтобы дать пользователю указание установить загруженное обновление.
- Если состояние равно INSTALLED , отмените регистрацию прослушивателя. После установки обновления регистрировать прослушиватель больше не нужно.
Завершить процесс обновления
Поскольку у нас есть готовая загрузка, пришло время настроить действие снэк-бара. Создайте функцию popupSnackBarForCompleteUpdate() .
Это уведомляет пользователя о том, что обновление APK загружено и готово к установке. Когда пользователь нажимает «Установить», appUpdateManager автоматически устанавливает загруженный APK. Это позволит использовать новые обновленные функции.
Отменить регистрацию слушателя
Теперь мы достигли установки обновления. Нам больше не нужен installStateUpdatedListener.
Чтобы отменить его регистрацию, создайте функцию removeInstallStateUpdateListener() и вызовите ее, когда installStatus() будет равен INSTALLED .
Это предотвращает запуск обратных вызовов, когда они больше не нужны. Отмена регистрации прослушивателя также помогает избежать утечек памяти.
Реализация немедленных обновлений
Если для AppUpdateType установлено значение IMMEDIATE , appUpdateManager инициирует блокирующий пользовательский интерфейс . Он блокирует взаимодействие пользователя с приложением до завершения обновления.
Немедленные обновления аналогичны потоку событий, обсуждаемому при реализации гибкого режима. Чтобы не повторять подробное объяснение, которое мы сделали выше, мы укажем поток обновления, который реализует немедленное обновление.
Создать экземпляр appUpdateManager
Проверить наличие обновлений
Создайте функцию checkUpdate() и назовите ее onCreate .
Приложение свяжется с Play Маркетом и проверит, доступно ли обновление.
Если обновление доступно, проверьте, разрешен ли тип обновления. В этом случае мы проверяем, разрешен ли режим IMMEDIATE для запуска потока обновления. Если да, мы вызываем startUpdateFlow(appUpdateInfo) .
Если пользователь инициировал обновление и закрыл приложение до завершения процесса, задайте для параметра UpdateAvailability значение DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS . Пользователь может возобновить процесс обновления, инициировав startUpateFlow(appUpdateInfo) .
Обработка потока обновления
Инициируйте поток обновления и установите для AppUpdateType значение НЕМЕДЛЕННО в контексте текущего действия. Опять же, не забудьте передать код результата, который будет отслеживать действия пользователя, например отмену обновления.
Обработка действий пользователя
OnActivityResult обрабатывает действия, предпринимаемые пользователем при появлении запроса на установку обновления. Он состоит из трех основных действий, в том числе:
- RESULT_CANCELED — когда пользователь отменяет обновление, вы можете выбрать действие, которое последует за этим решением. checkUpdate(), чтобы приложение перезапустило обновление. Или вызовите finish(), чтобы закрыть приложение всякий раз, когда пользователь отменяет обновление.
- RESULT_OK: показывает, что пользователь принял обновление для установки.
- RESULT_IN_APP_UPDATE_FAILED — если обновление завершается с ошибкой, вы хотите, чтобы приложение снова инициировало процесс обновления. По этой причине вызовите checkUpdate() , и процесс обновления начнется снова.
Тестирование
Проверить обновление в приложении непросто. Выполнить тест может быть немного сложно.
Как тестировать
Создайте подписанный пакет приложений/APK. Обратите внимание, что ключ подписи APK и идентификатор приложения должны совпадать с уже опубликованным приложением.
Поделитесь сгенерированным APK с тестировщиком. Для этого выберите опубликованное приложение в консоли Google, перейдите к внутреннему общему доступу к приложениям и загрузите туда сгенерированный APK. Узнайте, как использовать Google Internal App Sharing.
Скопируйте общую ссылку загрузки и поделитесь ею с тестировщиком. В этом случае у тестировщика должен быть мобильный телефон Android.
Откройте общую ссылку в браузере телефона. Вы будете перенаправлены в Play Маркет.
Загрузите приложение и дождитесь завершения установки.
Измените эти значения на более высокую версию. Например:
Чтобы убедиться, что обновление произойдет, в файле activity.xml замените android:text="Hello World!" with android:text="Поздравляем, теперь у вас установлена новейшая версия этого приложения." .
После того, как вы сгенерируете пакет приложения/APK, перейдите к внутреннему общему доступу к приложению и загрузите его.
Снова скопируйте общую ссылку, сгенерированную этой загрузкой, и откройте ее в тестере. Когда ссылка появится в магазине Google Play, вы получите кнопку обновления, не нажимайте кнопку «Обновить».
Закройте магазин Google Play и откройте приложение, которое мы установили ранее. Это запустит пользовательский интерфейс обновления, который предложит вам обновить приложение. Пользовательский интерфейс может отличаться в зависимости от типа обновления (гибкое или немедленное).
Настройка и вывод кода
Гибкий
Немедленно
Заключение
Я надеюсь, что это руководство поможет вам реализовать обновления в приложении, как немедленные, так и гибкие, в контексте вашего приложения.
Читайте также: