Android Dev 101: все, что должен знать каждый новичок

05.05.2020
Posted in blog-article
05.05.2020 admin

Android Dev 101: все, что должен знать каждый новичок

На заметку перед собеседованием джунов, если сами плохо разбираетесь в сфере)

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

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

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

В этом посте я приготовил для вас немного теории, которая необходима разработчикам уровня beginner или intermediate для лучшего взаимодействия с фреймворком Android. В будущем вас также ждут другие уроки, в ходе которых мы обсудим наиболее полезные практические приемы. Давайте начнем.

1. Разница между @ + id и @id

Чтобы получить доступ к виджету (или компоненту) на Java или сделать другие элементы зависимыми от него, необходимо уникальное значение для его представления. Его можно получить при помощи атрибута Android:id, который, по сути, добавляет идентификатор в качестве суффикса к @+ID/ в код файла ресурсов. Например, Id для панели инструментов (toolbar) можно определить следующим образом:

android: id = » @+id / toolbar

Теперь этот код можно найти с помощью команды findViewById(…).

Вариант @id ведет себя так же, как findViewById (…) — ищет компонент по идентификатору, но предназначается только для работы с макетами. Как правило, его используют для размещения компонента относительно другого компонента, который он возвращает.

android: layout_below = » @ID / toolbar

2. Использование @ string res для создания строк в XML

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

android:text=»My Awesome Application»

При использовании жестко закодированных строк вы часто будете видеть предупреждение об использовании таких строк в Android Studio с предложением преобразовать их в строковый ресурс. Попробуйте на них нажать, а затем, удерживая ALT + ENTER, вызвать выгрузку ресурсов. То же самое вы можете сделать с помощью strings.xml, который находится в папке res при помощи команды типа:

<string name= «app_name» >My Awesome Application< / string>

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

android: text= » @string / app_name

3. Использование @android и константы ? attr

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

@android:color/white

Android имеет несколько констант цвета, обозначенных для главных цветов, таких как белый, черный или розовый. Также подобным образом удобнее всего использовать прозрачный цвет:

@android:color/transparent

Но важно отметить, что оригинальные производители Android (такие как Samsung или LG), как правило, изменяют значения ресурсов Android в соответствии с собственными потребностями, и поэтому ресурс белого цвета по умолчанию не обязательно будет представлен как #FFF или true white. В таком случае стоит задать собственный цветовой ресурс (скажем, colorWhite) со значением #fff, а затем использовать его таким образом:

@color/colorWhite

Еще один хранитель константы это ? attr. Он используется для создания предопределенного атрибута значения для различных атрибутов. Используем для примера пользовательскую панель инструментов. У неё должны быть определенные параметры по ширине и высоте. Ширина обычно устанавливается в MATCH_PARENT, но как насчет высоты? Большинство из нас не знают о принципах работы и просто устанавливает желаемую высоту, которая кажется подходящей. Это неверно. Вместо сочинения собственной высоты, мы должны использовать

android:layout_height=»?attr/actionBarSize»

Также хранитель константы ? attr используется для отображения волн при нажатии на виды. SelectableItemBackground — это предустановленное рисование, которое можно установить в качестве фона для любого вида, которому требуется эффект пульсации.

android:background=»?attr/selectableItemBackground»

Также для запуска пульсации нам подойдет эта команда.

android:background=»?attr/selectableItemBackgroundBorderless»

4. Разница между SP и DP

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

SP, или Масштабируемые пиксели, рекомендуются применять совместно с TextViews, которые требуют, чтобы размер шрифта не изменялся одновременно с изображениями (плотностью). Вместо этого содержимое TextView должно масштабироваться в соответствии с потребностями или предустановленным размером шрифта на гаджете пользователя.

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

5. Использование чертежей drawable и Mip-карт

Начнем с определения разницы между drawable и mipmap.

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

Ваше приложение имеет несколько mipmap и папок рисунков, каждая из которых содержит различные разрешения экрана. При работе с Drawable, система совершает выбор элемента из папки, принадлежащей текущей плотности устройства. При работе с Mipmap системе разрешен выбор значка из любой папки, содержимое которой подходит для решения задачи. Это может пригодится в случае, если ПУ пользователя отображает значки большего или меньшего размера, чем предполагалось вами. В таком случае система сама примет решение о выборе соответствующего значка.

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

Например, Nexus 5 — это xxhdpi. Когда мы помещаем значки в папки mipmap, все папки mipmap сохраняются. Но из объектов типа drawable будут сохранены только drawable-xxhdpi, папки с иным названием будут бесполезными.

6. Использование векторных изображений

Добавление несколько версий (размеров) одного и того же актива (изображения) для поддержания различных плотностей экрана — практика распространенная. Этот подход является эффективным, но он подразумевает определенные временные и материальные затраты на создание этих активов. Чтобы сэкономить наши время и ресурсы, команда Android анонсировала введение векторных изображений.

Векторная графика — это SVGs (масштабированная векторная графика), но в XML она представляет собой изображение, нарисованное с помощью набора точек, линий и кривых с добавлением заливки. Сам факт того, что векторные изображения сотканы из линий и точек, позволяет им самомасштабироваться без потери разрешения, подстраиваясь под плотность. Ещё одно преимущество веркторных рисунков — легкость анимации. Добавлять векторные изображения в один файл AnimatedVectorDrawable намного удобнее, чем загружать и обрабатывать их по отдельности.

<vector xmlns:android=»http://schemas.android.com/apk/res/android»

android:width=»24dp»

android:height=»24dp»

android:viewportWidth=»24.0″

android:viewportHeight=»24.0″>

<path android:fillColor=»#69cdff» android:pathData=»M3,18h18v-

2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z»/>

</vector>

Приведенное выше определение вектора приведет к следующей возможности

рисования:

Для добавления векторных рисунков на вашем Android-проекте щелкните правой кнопкой мыши на модуль проекта, а затем выберите New >> Vector Assets. У вас откроется студия, с помощью которой вы можете обработать свои активы всего в два действия. Возьмите иконки из папки Material и выберите необходимый тип файла — локальный SVG или PSD.

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

7. Настройка End / Start Margin

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

Начало и конец являются надмножествами, левым и правым соответственно. Поэтому для приложения с minSdkVersion 17 или меньше необходимо использовать поля с менее современными параметрами. На платформах, где начальные и конечные пределы отсутствуют, параметры left / right можно безопасно проигнорировать. Пример выглядит следующим образом:

android: layout_marginEnd = » 20dp

android: paddingStart= » 20dp

8. Использование генератора Getter/Setter

Одна из самых неприятных вещей, которую приходится делать при создании класса holder (который просто содержит переменные данные), — это создание нескольких геттеров и сеттеров при помощи копипаста, а затем переименования их для каждой переменной.

К счастью, Android Studio облегчил нам жизнь. Выделите все переменные, которые вам нужны внутри класса, и перейдите к Toolbar >> Code. Используйте комбинацию ALT + Insert. После ее нажатия запустится генератор и вам будет предложено множество вариантов, среди которых будет Getter and Setter. Выберите его, и внутри вашего класса появятся все геттеры и сеттеры. Гениально, не так ли?

9. Использование генератора Override/Implement

Еще один полезный генератор. Создавать и расширять пользовательские классы легко. Если, конечно, не говорить о малознакомых, например, о PagerAdapter. Если вы хотите, чтобы ViewPager показывал несколько страниц, вам необходим пользовательский PagerAdapter, который будет работать по мере определения внутри переопределенных методов. Но где же эти взять методы? Android Studio может предложить к вашему пользовательскому классу добавить конструктор или даже ярлык (с помощью ALT + Enter). Но остальные (абстрактные) методы из родительского PagerAdapter придется добавлять вручную. Утомительный и скучный процесс, согласен.

Чтобы получить список всех доступных переопределенных методов, перейдите в Code >> Generate and Override method или Implement methods, в зависимости от того, что вам нужно. Здесь же вы сможете добавить несколько методов в свой класс. Для этого зажмите Ctrl, выделите методы и нажмите OK.

10. Правильное понимание Contexts

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

Проще говоря, Contexts — это тот, кто связывает все, что вы видите на экране. Все представления (или их расширения) привязаны к текущей среде с помощью Контекста. Он отвечает за разрешение доступа к таким ресурсам уровня как плотность или текущая активность. Для предоставления других связанных компонентов внутренних ресурсов все действия, службы и приложения реализуют контекстный интерфейс. Возьмем в качестве примера добавление TextView в MainActivity. Обратим внимание, что при создании объекта конструктору TextView необходим контекст. Он требуется для разрешения любых ресурсов, необходимых в определении TextView. Для внутренней загрузки TextView шрифта Roboto ему нужен контекст. Также, когда мы предоставляем контекст TextView, мы заставляем его объединиться с циклом текущего действия.

Другим использованием контекста является инициирование операций уровня приложения, например, инициирование библиотеки. Библиотека живет на протяжении всего жизненного цикла приложения, поэтому мы запускаем процесс с установки getApplicationContext() вместо метода getcontext или this или getActivity. Чтобы избежать утечки памяти, необходимо уметь правильно использовать различные типы контекста. Например, контекстом можно активировать запуск действия или службы. Помните startActivity (…)? Если необходимо изменить действие из класса, не связанного с активностью, то для доступа к методу startActivity потребуется объект context, так как он принадлежит к классу Context, а не к классу Activity.

getContext().startActivity(getContext(), SecondActivity.class);

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

Бонус #1: Форматирование Кода

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

С Android Studio или любым из IDE JetBrains вам не придется заботиться о таком ручном структурировании кода как добавление отступа или пробела перед =. Написать код так, как вы хотите, и когда пожелаете его отформатировать, просто нажмите ALT + CTRL + L на Windows или ALT + CTRL + SHIFT + L на Linux. *Code Auto-Formatted*

Бонус #2: Использование Библиотек

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

— Не используйте библиотеки, пишите каждый код самостоятельно.

— Используйте библиотеку для всего.

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

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

Старайтесь оставаться в золотой середине — не изобретать все подряд, но и не передавать все операции библиотеке. Сохраняйте нейтралитет и обязательно используйте собственные способности.

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

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

Contact

Давайте работать вместе!

Пишите нам и найдем точки соприкосновения, может станем партнерами, а может поможем вам зайти в нашу чудесную нишу

Вы разработчик?

Пишите! Нам постоянно нужны новые кадры, либо можем помочь в продвижении вашего приложения

Новичок?

Поможем быстро войти в нишу, не тратя годы на понимание

Давно в нише?

Рады будем пообщаться как на темы whitehat, так и blackhat тематики ^_^ + всегда есть что обсудить по поводу рекламных сетей

ПИШИ В TELEGRAM!

Contact