Android разработка – Telegram
Android разработка
5.22K subscribers
442 photos
25 videos
1 file
547 links
все о Android разработке

@itchannels_telegram - 🔥 лучшие it каналы

@ai_machinelearning_big_data -ML

@ArtificialIntelligencedl -AI

@datascienceiot - ml 📚

@pythonlbooks -📚books
Download Telegram
Распространенные Паттерны Проектирования И Архитектуры Приложений На Android

https://swiftbook.ru/post/tutorials/common-design-patterns-and-app-architectures-for-android/

@android_its
2
Из каких базовых компонент состоит приложение?

Базовые компоненты андроид приложения: Activity, Service, BroadcastReceiver, ContentProvider. Каждый из базовых компонент объявляется в андроид манифесте и может являться точкой входа в приложение.

Activity представляет UI и функциональность, видимые пользователю.

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

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

ContentProvider используется для обмена данными с другими приложениями.

Каждый из компонентов подробнее рассмотрим в будущем.

#Components

@android_its
👍5
Может ли приложение быть запущено в нескольких процессах?

Короткий ответ – Да.

Но для начала давайте разберемся чем процесс отличается от потока.

Процесс – это сущность на уровне ОС. Каждая программа может быть запущена в одном или нескольких процессах.

Поток – это сущность на уровне Runtime Environment.

Программа может выполняться в нескольких процессах. В каждом из процессов может быть создано несколько потоков (Java Threads).

Вернемся к андроиду. В предыдущем посте мы рассмотрели базовые компоненты и узнали, что каждый из компонентов может быть точкой входа в приложение. По умолчанию компоненты приложения работают в дефолтном процессе, но каждый из компонентов <activity>, <service>, <receiver>, <provider> может иметь поле android:process=”<name>” в андроид манифесте. Кастомное значение этого поля явно говорит системе в каком процессе будет работать компонент.

Важно: При старте нового процесса создается инстанс приложения и снова вызывается Application.onCreate(). Если в этом методе вы инициализируете модули или библиотеки, которые используются только в главном процессе, то не забывайте проверять, в каком процессе вы находитесь в момент инициализации.

Подробнее про процессы и треды читайте в документации.

#System
👍7
Приоритеты процессов

Процессы делятся по приоритету на 4 вида, в порядке убывания:

1. Видимый активный процесс (Foreground process). В этом процессе работает приложение, с которым взаимодействует пользователь. Процесс находится в этом состоянии в следующих случаях:
- Activity, у которой вызван onResume(), но еще не вызван onPause()
- Во время выполнения BroadcastReceiver.onReceive()
- Запущен Service и выполняется один из колбэков: onCreate(), onStart(), onDestroy()

2. Видимый процесс. Пользователь знает о приложении, запущенном в этом процессе, но не взаимодействует с ним:
- Activity у которой вызван onPause(), но еще не вызван onStop().
- Service, который запущен через Service.startForeground(). В этом случае пользователь видит нотификацию, связанную с сервисом.
- Service, выполняющий функцию, о которой пользователь осведомлен. Например input method service.

3. Background Service. Процесс с сервисом, запущенным командой startService().

4. Закэшированный процесс. К ним относятся пустые процессы, используемые при старте приложений, и процессы, в которых все активити в onStop() состоянии.

Система убивает процессы в порядке возрастания их приоритета для восстановления ресурсов. Подробнее

#Lifecycle
#System

@android_its
👍5👎1
Activity: Что такое и как запустить?

Activity – основной компонент в андроиде. Активити – это экран, то что видит и с чем взаимодействует пользователь. Может содержать несколько View и фрагментов. Так же как и другие базовые компоненты, может быть точкой входа в приложение.

Активити с MAIN Intent Filter в манифесте запускается при старте приложения, когда пользователь кликает на иконку приложения.

#Activity
#Components

@android_its
👍6
Activity: Жизненный цикл

Жизненный цикл активити состоит из шести основных коллбэков, вызываемых системой. В порядке вызова: onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy().


onCreate() вызывается когда активити создается. В onCreate() вы должны вызвать метод setContentView().

onStart() вызывается когда активити отрисована и видима пользователю.

onResume() вызывается перед тем как активити станет доступна для взаимодействия с пользователем.

onPause() – метод симметричный onResume(). Пользователь больше не может взаимодействовать с активити, но активити частично видна пользователю. В этом состоянии UI активити может изменяться.

onStop() – метод симметричный onStart(). Вызывается, когда активити больше не видна пользователю.

onDestroy() – метод симметричный onCreate(). Вызывается перед тем, как активити будет уничтожена системой.


Несколько примеров:

1. Пользователь жмет Home. В этом случае активити больше не видна, поэтому вызываются onPause(), onStop(). Пользователь открывает приложение снова - onStart(), onResume().

2. Пользователь переходит на другую активити внутри приложения (реализуется вызовом startActivity()) – onPause(), onStop(). Пользователь возвращается на предыдущую активити – onStart(), onResume().

3. Вызов finish()onPause(), onStop(), onDestroy(). Когда пользователь перейдет на эту активити снова, она будет создана с нуля без сохранения состояния.

4. Пользователь поворачивает телефон и ориентация активити меняется. Активити пересоздается и вызываются коллбеки onPause(), onStop(), onDestroy(), onCreate(), onStart(), onResume() с сохранением состояния.

Это базовые методы активити. Более подробно они описаны в документации.

В полный жизненный цикл также входят onRestart(), onSaveInstanceState(), onRestoreInstanceState(), onNewIntent() и другие методы, которые разберем в будущем.


#Activity
#Lifecycle
👍10
Activity: Как пережить поворот экрана?

При повороте экрана активити уничтожается и создается заново. Вызываются коллбэки onPause(), onStop(), onSaveInstanceState(), onDestroy()onCreate(), onStart(), onRestoreInstanceState(), onResume().

Чтобы сохранить состояние активити, вы должны переопределить метод onSaveInstanceState() и положить данные в Bundle.

При реинициализации активити, Bundle с сохраненным состоянием передается в onCreate() и в onRestoreInstanceState().

Система вызывает onSaveInstanceState() и onRestoreInstanceState() только в том случае, когда необходимо сохранить состояние, например при повороте экрана или при убийстве активити для освобождения памяти. Данные коллбэки не вызываются, если пользователь выходит из активити нажав Back или если активити убивается вызовом finish().

onSaveInstanceState() вызывается после onStop() на версии API ≥ 28. На API < 28 этот коллбэк вызывается перед onStop() и нет гарантий до или после onPause().

onRestoreInstanceState() вызывается после onStart().

#Activity
#Lifecycle
#State

@android_its
👍8
Нужно ли думать о сохранении состояния, если приложение поддерживает только портретную ориентацию?

– Да.

Поворот экрана – это частный случай Configuration Changes. Другой пример – изменение языка системы.

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

#State

Fragment

Fragment используется для отображения части UI на экране. Фрагмент создается внутри активити или внутри другого фрагмента.

Для создания и управления фрагментами используется FragmentManager.

Класс-наследник класса Fragment должен иметь дефолтный конструктор без параметров. Система использует этот конструктор при пересоздании фрагмента.

Начиная с API v28 системный класс Fragment – deprecated. Рекомендуется использовать Fragment из Support Library.

#Fragment

@android_its - все о Android разработке
👍5🔥1
Termux - это эмулятор терминала Android и приложение среды Linux, написанный на Java.
Он работает напрямую без рутирования или настройки. Минимальная базовая система устанавливается автоматически - дополнительные пакеты доступны с помощью менеджера пакетов APT.

Termux-app - Пользовательский интерфейс и эмуляция терминала

Termux-api - Android API для использования командной строки и скриптов или программ

Termux-styling (Kotlin) - Дополнительное приложение для настройки шрифтов, терминала и цветовой схемы

Termux-tasker - Дополнительное приложение для интеграции с Tasker

Termux-packages (Shell) - Сборка системы и первичный набор пакетов для Termux

@android_its
🔥8
💣 Хочешь попробовать себя в Android-разработке?

📌 Приглашаем 14 июня в 20:00 на открытый урок в OTUS, где мы создадим приложение для трекинга воды. Занятие проведет Даниил Попов, разработчик в компании Bolt Technology OÜ (Эстония).

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

💻 Вебинар пройдет в рамках специализации «Android Developer». Это возможность оценить материалы курса и познакомиться с экспертом.

❇️ Для участия необходимо зарегистрироваться
5👍1
Fragment

Fragment используется для отображения части UI на экране. Фрагмент создается внутри активити или внутри другого фрагмента.

Для создания и управления фрагментами используется FragmentManager.

Класс-наследник класса Fragment должен иметь дефолтный конструктор без параметров. Система использует этот конструктор при пересоздании фрагмента.

Начиная с API v28 системный класс Fragment – deprecated. Рекомендуется использовать Fragment из Support Library.

#Fragment

@android_its
4👍1
Фоновое изображение в Layout

Android позволяет устанавливать фоновое (background) изображение в корневой элемент разметки интерфейса Layout. Реализовать это совсем просто; достаточно в описание разметки вставить соответствующий атрибут android:background="@drawable/earth". Предполагается, что изображение earth хранится в директории проекта res/drawable. На следующем скриншоте представлено изображение земли earth.png, которое будет использовано в описанном ниже примере в качестве фонового изображения разметки интерфейса Layout.

  Читать дальше

@android_its
👍3🥰1
Как собирается Android-приложение?

Сборка Android-приложения состоит из следующих шагов:

1. Компилирование Java/Kotin-исходников.

Компилятор создает .class-файлы, содержащие java-байткод.

.java source -> javac compiler -> .class files
.kt source -> kotlinc compiler -> .class files


2. Конвертация Java-байткода в Dalvik-байткод.

Для конвертации используется утилита dx. На вход подаются .class-файлы, скомпилированные на предыдущем шаге, и .jar/.aar-файлы скомпилированных библиотек. dx создает файлы формата .dex, которые содержат Dalvik-байткод.

.class, .jar, .aar -> dx -> classes.dex

3. Сборка ресурсов и .dex-файлов в APK.

Этот шаг выполняется утилитой aapt (Android Asset Packaging Tool).

classes.dex, resource files -> aapt -> .apk file

4. Оптимизация и подпись .apk-файла.

Для оптимизации APK используется утилита zipalign. APK является zip-архивом. zipalign выравнивает файлы в архиве определенным образом, что уменьшает использование RAM, при работе приложения.

Подпись приложения выполняется утилитой apksigner.

.apk file -> zipalign -> apksigner -> signed .apk file

До Build Tools v24.0.3 подпись APK выполнялась утилитой jarsigner, которая была создана для подписи .jar-файлов, и zipalign применялся к уже подписанному APK.

.apk file -> jarsigner -> zipalign -> signed .apk file

#Build

@android_its
👍8
Опишите структуру APK-файла

APK (Android Package) – это формат файла, который используется для распространения и установки мобильных приложений в операционной системе Android.

APK представляет собой архив, который содержит следующие файлы:

• Папка META-INF:
MANIFEST.MF – манифест-файл, который содержит SHA-хэши всех файлов в APK-пакете;
• Сертификат приложения;
• Файлы с дополнительной метаинформацией.

lib – папка, содержащая скомпилированный код платформенно-зависимых библиотек. lib содержит подкаталоги для соответствующих платформ: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips.

res – папка, в которой лежат андроид-ресурсы в Binary XML формате.

assets – папка, содержащая ассеты приложения.

AndroidManifest.xml – манифест Андроид-приложения. Этот файл хранится в скомпилированном Binary XML формате.

classes.dex – один или несколько файлов, которые представляют собой код приложения, скомпилированный в Dalvik-байткод.

resources.arsc – файл, в котором хранится таблица маппинга id ресурсов в соответствующие файлы.

#Build
👍8
Как собирается Android-приложение?

Сборка Android-приложения состоит из следующих шагов:

1. Компилирование Java/Kotin-исходников.

Компилятор создает .class-файлы, содержащие java-байткод.

.java source -> javac compiler -> .class files
.kt source -> kotlinc compiler -> .class files


2. Конвертация Java-байткода в Dalvik-байткод.

Для конвертации используется утилита dx. На вход подаются .class-файлы, скомпилированные на предыдущем шаге, и .jar/.aar-файлы скомпилированных библиотек. dx создает файлы формата .dex, которые содержат Dalvik-байткод.

.class, .jar, .aar -> dx -> classes.dex

3. Сборка ресурсов и .dex-файлов в APK.

Этот шаг выполняется утилитой aapt (Android Asset Packaging Tool).

classes.dex, resource files -> aapt -> .apk file

4. Оптимизация и подпись .apk-файла.

Для оптимизации APK используется утилита zipalign. APK является zip-архивом. zipalign выравнивает файлы в архиве определенным образом, что уменьшает использование RAM, при работе приложения.

Подпись приложения выполняется утилитой apksigner.

.apk file -> zipalign -> apksigner -> signed .apk file

До Build Tools v24.0.3 подпись APK выполнялась утилитой jarsigner, которая была создана для подписи .jar-файлов, и zipalign применялся к уже подписанному APK.

.apk file -> jarsigner -> zipalign -> signed .apk file

#Build

@android_its
👍5
В чем разница между jar и aar?

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

JARJava Archive. Содержит файлы классов, java-ресурсы, зависимые библиотеки, и другие необходимые для приложения файлы. JAR может использоваться как в Android-приложении, так и в приложении на чистой Java.

AAR – Android Archive. Так же как и JAR является zip-архивом, но может использоваться только в Android-приложении. AAR содержит скомпилированный исходный код в файле classes.jar, Android-ресурсы, AndroidManifest, и другие файлы, входящие в состав APK.

#Build
👍6
Что такое Proguard?

Proguard – это инструмент обфускации и оптимизации Java-кода. Proguard может использоваться как на чистом Java-, так и на Android-приложении, но в мире Андроида Proguard популярнее по двум причинам.

Во-первых, Proguard удаляет неиспользуемые классы и методы из уже скомпилированного приложения. Это позволяло решать проблему 64К методов до появления MultiDex.

Во-вторых, Java- и Dalvik-байткод легко декомпилировать. Для серверного Java-приложения это не проблема, а вот к байткоду приложения под Android доступ имеет любой пользователь.
Proguard обфусцирует код, что усложняет задачу декомпиляции.

#Build

@android_its
👍7
Как Proguard удаляет неиспользуемый код?

Одна из функций Proguard – это удаление неиспользуемого кода программы.

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

Proguard запускается после компиляции исходного кода и получения .class файлов, но до конвертации в dex.

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

Входные точки программы задаются в файлах конфигурации правилом -keep. Android Gradle Plugin генерирует дефолтный файл c правилами для сохранения базовых компонент и специфичных для андроида классов, таких как View.

Если класс, метод или поле используется только через Reflection, Proguard пометит этот компонент как неиспользуемый и удалит. Это является частой причиной крэшей ClassNotFoundException при использовании Proguard.
Для сохранения таких компонентов нужно добавить правила -keep в файл конфигурации.

После сборки приложения с Proguard, генерируется файл usage.txt, в котором хранится список всех удаленных компонентов.

#Build

@android_its
👍6