Статьи

Что могут ожидать разработчики в Android N?

Эта статья была обновлена ​​в мае 2016 года, чтобы отразить изменения, объявленные в Google IO

Android N — это следующий выпуск платформы Android от Google, который должен выйти в этом году.

Android N

Что нужно знать об Android N?

Обычно Google объявляет о следующей версии Android во время конференции ввода-вывода в мае , но график для Android N отличается. Начиная с марта, Google будет выпускать последовательные превью, чтобы дать разработчикам время подготовить свои приложения для совместимого выпуска N. Финализация Android N (и его официальное название) не будет завершена до третьего квартала года.

Сроки разработки Android N

Как и все обновления Android, N поставляется с рядом новых функций и улучшений, о которых я расскажу сегодня.

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

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

Скачать Android Studio 2.1

Загрузите Android Studio 2.1 , которая в настоящее время находится в предварительном просмотре. Не загружайте 2.0, у него есть проблемы с Java 8. Если вы хотите сохранить текущую версию Android Studio (например, 1.5), но также протестировать Android N, вам следует отредактировать имя существующего приложения Android Studio, чтобы вы могли запустить оба.

После того как вы установили предварительный просмотр Android Studio, установите автоматические обновления с «Канарского канала», чтобы вы могли обновлять свой образ Android N (и он будет регулярно обновляться).

Загрузить изображение Android N

Откройте диспетчер SDK и найдите образ Android N , выбрав версию системного образа Intel x86 Atom . На протяжении всего моего тестирования я никогда не мог заставить работать системный образ Intel x86 Atom_64, но ваш опыт может отличаться.

Pick SDK

Получить Java 8 JDK / JRE

Для компиляции приложений для Android N вам понадобится Java 8 Development Kit и Java 8 Runtime Environment , как того требуют части Android Studio 2.1.

После того, как вы установили оба, откройте файловую структуру для любого проекта и укажите на среду выполнения Java 8.

Изменить Java Runtime

Обновите Gradle

Откройте любой новый проект в Android Studio 2.1 и откройте build.gradle, чтобы проверить, что вы нацеливаетесь на Android N. Для всех моих тестов я обнаружил, что самым простым способом было указать, что приложение будет работать только с Android N:

android { compileSdkVersion 'android-N' buildToolsVersion 24.0.0 rc1 ... defaultConfig { minSdkVersion 'N' targetSdkVersion 'N' ... } ... } 

С этим завершением вы сможете создать свое приложение и увидеть славу Android N!

Новые особенности

Улучшения безопасности

Google изо всех сил пытается улучшить плохую репутацию Android в плане безопасности, в том числе:

  • Прямая загрузка : новый режим, когда устройство включено, но заблокировано. Это позволяет доступ к определенным приложениям, но не к другим.
  • Шифрование файловой базы : для точного шифрования отдельных папок и файлов вместо полных блоков диска.
  • Усиление инфраструктуры мультимедиа: после страха перед сценой обработка мультимедиа разбивается на отдельные компоненты, а не на один большой компонент, предлагающий слишком много разрешений для устройства.

Многооконный режим и режим произвольной формы

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

Эти приложения могут отображаться рядом или один над другим, чтобы пользователи могли переключаться между несколькими задачами. Например, если веб-браузер открыт вместе с навигационным приложением.

С Android N Google делает эту функцию встроенной. Посмотрите на скриншот ниже, где Chrome работает бок о бок с Google Maps в режиме разделенного экрана.

Многооконный пример

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

Изменения в жизненном цикле для многооконных приложений

Все приложения проходят через события своего жизненного цикла в зависимости от того, в какое состояние оно переходит. Например, когда пользователь нажимает кнопку «Домой», активное приложение переходит в неактивное состояние. Разработчики могут воспользоваться этими изменениями для запуска функциональности приложения.

Поскольку теперь может отображаться более одного приложения одновременно, вам нужно подумать о том, как приложение будет реагировать на изменение событий. Несмотря на то, что в каждый момент времени активно только одно приложение, несколько приложений могут быть видны. Когда приложение переходит в «приостановленное состояние», оно не должно убивать пользовательский интерфейс или изменять визуальное отображение. Приложение должно делать это только в состоянии остановки .

Добавление многооконной поддержки в ваше приложение

Чтобы включить многооконный режим в своих приложениях, вам нужно установить новый атрибут android:resizeableActivity в true в файле манифеста для всего <application> или для каждого поддерживаемого <activity> .

По умолчанию это значение false если targetSdkVersion вашего приложения меньше, чем android-N , или true противном случае.

Атрибуты макета для многооконных приложений

Как только ваше приложение настроено на использование Multi-Windows, вы можете использовать новые атрибуты макета, которые определяют, как приложение будет изменяться в размере.

  • android:defaultWidth : указывает ширину приложения по умолчанию при запуске в режиме android:defaultWidth формы (в DP или в виде дроби)
  • android:defaultHeight : указывает высоту приложения по умолчанию при запуске в режиме android:defaultHeight формы (в DP или в виде дроби)
  • android:gravity : начальная гравитация при запуске приложения в «режиме произвольной формы». Это сообщит системе, куда будет привязано это приложение по отношению к контейнеру экрана (например, привязка к левому нижнему углу с помощью top|start ). Узнайте больше о гравитации макета здесь.
  • android:minimumSize : устанавливает минимальный размер (высота и ширина только в DP) для приложения при запуске как в режиме произвольной формы, так и в стандартном режиме многозадачности «бок о бок».

Методы запросов для мультиокна

Как часть этой функции, класс activity был расширен, так что вы можете запросить действие, чтобы выяснить, находитесь ли вы в многооконном режиме или режиме «картинка в картинке». Это полезно в том случае, если вам нужно настроить макет или выполнить другие вычисления, основанные на состоянии Multi-Window.

  • Activity.inMultiWindow() : сообщает, находится ли текущая активность в многооконном режиме.
  • Activity.inPictureInPicture() : сообщает, находится ли текущая активность в режиме «картинка в картинке» (обычно при разработке для Android TV).
  • Activity.onMultiWindowChanged() : вызывается, когда приложение включается или выключается из многооконного режима. true если в данный момент находится в режиме, или значение false противном случае.
  • Activity.onPictureInPictureChanged() : вызывается при изменении состояния «картинка в картинке». true если в этом режиме или false противном случае.

Реагирование на многооконный режим

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

Когда приложение переключается в многооконный режим, его вертикальные / горизонтальные размеры будут где-то на 30-70% меньше (так как пользователь может переместить мультиокно, чтобы приложение стало меньше или больше). Если это так, вы можете увеличить размер текста, чтобы его было легче читать.

 //On Multi-Window, adjust text sizing public void onMultiWindowChanged(boolean inMultiWindow) { super.onMultiWindowChanged(inMultiWindow); //find our UI items TextView title = (TextView) findViewById(R.id.appTitle); TextView subtitle = (TextView) findViewById(R.id.appSubtitle); TextView content = (TextView) findViewById(R.id.appContent); //read default text sizes (In Sp's from dimension resources) and divide by density to find its size Float titleSize = getResources().getDimension(R.dimen.titleTextSize) / getResources().getDisplayMetrics().density; //22 SP Float subtitleSize = getResources().getDimension(R.dimen.SubtitleSize) / getResources().getDisplayMetrics().density; //18 SP Float contentSize = getResources().getDimension(R.dimen.contentSize) / getResources().getDisplayMetrics().density; //15 SP //Entering Multi-window, adjust sizing up if(inMultiWindow == true){ //adjust text size by 25% title.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (titleSize + (titleSize * 0.25))); subtitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (subtitleSize + (subtitleSize * 0.25))); content.setTextSize(TypedValue.COMPLEX_UNIT_SP, (float) (contentSize + (contentSize * 0.25))); } //Exiting multi-window, adjust size back to normal else{ title.setTextSize(TypedValue.COMPLEX_UNIT_SP, titleSize); subtitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, subtitleSize); content.setTextSize(TypedValue.COMPLEX_UNIT_SP, contentSize); } } 

Вот что делает приведенный выше код:

  1. Внутри действия находится новый слушатель события onMultiWindowChanged .
  2. Находит все элементы пользовательского интерфейса (в данном случае это серия TextView ).
  3. Получает размеры SP из файла ресурсов измерений, деленные на плотность экрана, чтобы получить правильный размер.
  4. Проверяет, чтобы увидеть значение флага inMultiWindow .
  5. Если true это означает, что приложение входит в многооконный режим, поэтому установите текст элементов интерфейса на 25% больше.
  6. Если false это означает, что приложение выходит из Multi-Window, поэтому вернитесь к значениям по умолчанию из файла измерений.

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

Сравнение режимов экрана

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

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

Уведомления постоянно улучшаются, так как Android 4.1 (Jellybean) и Android N добавляют прямые ответы на уведомления и связанные уведомления.

Связанные уведомления

Это одна из замечательных возможностей, которая прошла путь от Android Wear до телефонов и планшетов.

С помощью Wear, когда приложение отправляет несколько уведомлений (например, входящих сообщений электронной почты), приложение может выбрать «связать» их вместе. Вместо последовательных уведомлений друг над другом, у пользователя есть одно уведомление вверху и переключатель для просмотра связанных уведомлений. Это позволяет им минимизировать беспорядок.

С накоплением уведомлений

Android N позволяет разработчикам группировать уведомления в стопки. В этом примере создается сценарий с кнопкой, которая при нажатии отправляет несколько уведомлений.

 //stacked notification example public void startStackedNotifications(View view){ final String NotificationKey = "notification_key"; //used to group notifications together //create 3 notifications for(int i = 1; i <= 3; i++){ //build notification NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle("Message " + i + " title"); builder.setContentText("Content for message number " + i + ". This is some additional long content that will get trimmed off when it's too long"); builder.setSmallIcon(R.drawable.ic_announcement); builder.setGroup(NotificationKey); //If on the last notification, set the notification group if(i == 3){ Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_person); NotificationCompat.Builder summaryNotification = new NotificationCompat.Builder(this); summaryNotification.setContentTitle("You have messages"); summaryNotification.setSmallIcon(R.drawable.ic_announcement); summaryNotification.setLargeIcon(largeIcon); summaryNotification.setGroup(NotificationKey); summaryNotification.setGroupSummary(true); int summaryNotificationID = 400; NotificationManagerCompat summaryManager = NotificationManagerCompat.from(this); summaryManager.notify(summaryNotificationID, summaryNotification.build()); } //issue the notification int notificationID = (300 + i); NotificationManagerCompat manager = NotificationManagerCompat.from(this); manager.notify(notificationID, builder.build()); } } 

Этот код создает виджет Button внутри действия и устанавливает его обработчик startStackedNotifications функции startStackedNotifications . Целью этой функции является создание уведомлений и их отображение. Затем он использует цикл для создания 3 уведомлений. Внутри каждого из них происходит следующее:

  1. Создайте новый построитель уведомлений, используя класс NotificationCompat.Builder . Именно этот класс устанавливает заголовок и содержание сообщения.
  2. Вызовите метод setGroup и передайте ключ уведомления, чтобы сгруппировать уведомления вместе (это важно).
  3. Если это последний цикл, создайте сводку уведомлений, используемую в верхней части сгруппированных уведомлений. Это тот же процесс, что и выше, но он устанавливает для метода setGroupSummary значение true чтобы сообщить Android, что это сводная информация.
  4. Используйте класс NotificationManagerCompat и его метод notify для отправки уведомления.
  5. Выполните три основных уведомления, используя класс NotificationManagerCompat и его метод notify как и раньше.

Вот как выглядят уведомления, когда они сложены слева и разделены справа.

Сгруппированные сообщения

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

Прямые уведомления позволяют пользователю немедленно ответить на уведомление при его получении.

Документация для уведомлений Android N содержит хорошее пошаговое руководство по настройке и запуску этих уведомлений. Хорошая идея знать, как работают уведомления и как они обрабатываются на разных устройствах / платформах, должно помочь введение Android в уведомления .

Прямые уведомления

Хранитель данных

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

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

Разработчики могут использовать три новые константы для определения предпочтений сохранения данных.

  • RESRICT_BACKGROUND_STATUS_DISABLED : RESRICT_BACKGROUND_STATUS_DISABLED данных отключен.
  • RESRICT_BACKGROUND_STATUS_ENABLED : RESRICT_BACKGROUND_STATUS_ENABLED данных включена и фоновые данные. использование заблокировано. Разработчик должен также попытаться минимизировать данные переднего плана.
  • RESRICT_BACKGROUND_STATUS_WHITELISTED : RESRICT_BACKGROUND_STATUS_WHITELISTED данных включен, но ваше приложение RESRICT_BACKGROUND_STATUS_WHITELISTED белый список, и фоновые данные будут обрабатываться в обычном режиме. Вы должны попытаться минимизировать данные переднего плана.

Обнаружение изменений в настройках сохранения данных

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

Внутри вашего класса активности добавьте следующие закрытые поля. Это в основном для удобства доступа к элементам TextView и ConnectivityManager .

 private TextView tv_dataSaverStatus; private ConnectivityManager conManager; protected void onCreate(Bundle savedInstanceState) { //find the TextView and set up our connectivity manager tv_dataSaverStatus = (TextView) findViewById(R.id.dataSaverStatus); conManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); displayDataSaverStatus(conManager, tv_dataSaverStatus); //new intent filter to look for (dataSaver) IntentFilter filter = new IntentFilter(); filter.addAction(conManager.ACTION_RESTRICT_BACKGROUND_CHANGED); //new receiver, extending broadcast receiver DataSaverReceiver receiver = new DataSaverReceiver(); //register receiver for us to use registerReceiver(receiver, filter); } 

Внутри функции onCreate найдите TextView который будет отображать текущие настройки Data Saver, и создайте объект ConnectivityManager для функции отображения.

Создайте фильтр намерений и примените к нему ACTION_RESTRICT_BACKGROUND_CHANGE . Это говорит Android, что вы хотите наблюдать за этим событием, когда оно срабатывает. Создайте новый объект из класса DataSaverReceiver который будет выполняться при изменении этих настроек (объяснено далее на странице). Наконец, свяжите все это, зарегистрировав получателя.

Ниже метода onCreate создайте новый класс, расширяющий класс BroadcastReceiver . Это расширенная широковещательная рассылка, которая будет выполняться при открытии приложения и при каждом изменении настроек Data Saver. В этом примере вызывается функция для изменения отображения.

 //custom class for capturing the dataSaver broadcast public class DataSaverReceiver extends BroadcastReceiver{ //trigger as we receive the event public void onReceive(Context context, Intent intent) { //update the dataSaver display displayDataSaverStatus(conManager, tv_dataSaverStatus); } } 

Функция проверяет, подключен ли пользователь к мобильной сети (через isActiveNetworkMetered ), и, если да, проверяет, не связано ли это с функцией сохранения данных.

В зависимости от обнаруженного параметра измените текст и цвет фона TextView .

 //writes the current status of the dataSaver setting to the UI public void displayDataSaverStatus(ConnectivityManager conManager, TextView tv_dataSaverStatus){ //cellular network String message = ""; int color = R.color.dataDefault; if(conManager.isActiveNetworkMetered()){ int restrictBackgroundStatus = conManager.getRestrictBackgroundStatus(); if(restrictBackgroundStatus == conManager.RESTRICT_BACKGROUND_STATUS_ENABLED) { message = "Datasaver Status: Enabled \nNo background processing allowed while data saver enabled!"; color = R.color.dataSaverEnable; }else if(restrictBackgroundStatus == conManager.RESTRICT_BACKGROUND_STATUS_DISABLED) { message = "Datasaver Status: Disabled \nBackground processing allowed. Continue as normal"; color = R.color.dataSaverDisabled; }else if(restrictBackgroundStatus == conManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED) { message = "Datasaver Status: Enabled \nHowever, app is whitelisted so background data will work still."; color = R.color.dataSaverEnabledWhitelist; } } //normal network else{ message = "Datasaver Status: Irrelevant \n Currently connected to a non-meters network so all good"; color = R.color.dataDefault; } tv_dataSaverStatus.setText(message); tv_dataSaverStatus.setBackgroundColor(getResources().getColor(color)); } 

Это простой пример, но теперь, когда вы можете получить статус Хранителя данных и посмотреть изменения в его состоянии, вы можете настроить свое приложение в соответствии с новыми политиками сохранения данных.

Пример сохранения данных

Обновление Android ‘Doze’

Android Marshmallow представила Doze, чтобы улучшить использование батареи и долговечность, откладывая такие действия, как фоновая синхронизация и задачи, когда устройство отключено от сети, стационарно или с выключенным экраном. Doze теперь работает в два этапа в зависимости от состояния вашего устройства .

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

Детали доза

С N Google ввел более агрессивное состояние дремоты, которое будет срабатывать, когда устройство находится в стационарном состоянии и находится в первом состоянии дремоты в течение определенного периода времени. Когда это вторичное состояние применяется, оно отключает больше, например, сканирование GPS / WiFi и Wakelocks.

Doze Updates

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

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

Java 8 Особенности

В Android N появилась поддержка Java 8 и его языковых функций . Если ваше приложение предназначено для платформы Android N, вы можете использовать эти функции Java 8 в своих интересах. Но убедитесь, что вы предоставляете запасные версии для более старых версий Android.

Эти функции включают в себя:

Компиляция Just-in-Time (JIT)

Переход Android на Android Runtime (ART) с версией 5.0 полностью переключился на предварительную (AOT) компиляцию кода. Android N повторно представляет JIT-компиляцию, что означает, что запуск приложений после первоначальной установки или обновления ОС может быть намного быстрее. Есть моменты, когда один метод компиляции является более подходящим, чем другой, и система Android будет разумно выбирать наиболее полезный в каждом случае.

Android для улучшения работы

Android для работы — это ориентированная на бизнес / бизнес модель Google для использования Android на рабочем месте.

Android для работы доступен с Android 4.0 через приложение « Android для работы ». Начиная с Android 5.0 и « Рабочего профиля », ИТ-менеджеры получают более совершенные инструменты и средства управления, которые помогают им управлять корпоративными решениями с Android.

С Android N, улучшения включают в себя:

  • Переключение режима работы : позволяет пользователям отключить свой рабочий профиль. Это временно удаляет фоновую синхронизацию, уведомления и приложения рабочего профиля до повторного включения.
  • Always-On VPN : заставляет рабочих подключаться через VPN для доступа к приложениям и информации, повышая безопасность.
  • Отключить доступ к приложениям . ИТ-администраторы могут приостановить доступ к рабочим приложениям, обеспечив безопасность данных компании. Это может быть повторно включено позже.
  • Удаленная загрузка : авторизованные лица могут удаленно загрузить устройство, что отлично подходит для постоянно включенных устройств, таких как установленные POS-терминалы.

Если вы заинтересованы, вы можете увидеть полные заметки о функциях на сайте предварительного просмотра .

Масштабирование экрана

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

Вывод

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

  • Multi-Window : для многозадачной работы с двумя или более приложениями.
  • Экономия данных : помогает пользователям сократить объем мобильных данных и увеличить время автономной работы.
  • Сгруппированные и прямые уведомления : улучшение пользовательского интерфейса благодаря более интуитивным и гибким уведомлениям.

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

В течение следующих месяцев Google выпустит новые обновления для Android N, и мы надеемся, что в третьем квартале 2016 года мы увидим возможное наименование и развертывание платформы Android N.

Я с нетерпением жду улучшения своих приложений с помощью этих новых функций, а вы ?