Оглавление
Глава 2. Android Приложение
Глава 2. Android Приложение
Типичное Android приложение содержит в себе следующие компоненты: активности, сервисы, широковещательные приемники и поставщики контента. Посмотрите на рисунок 2-1. Активности предназначены для взаимодействия с пользователем, сервисы – это часть программы, которая должна работать вне зависимости от того, отображается или нет приложение на экране, широковещательные приемники слушают стандартные сообщения от других приложений или компонентов Вашего же приложения и поставщики контента предназначены для сохранения массивов структурированной информации для возможности доступа к ней из других приложений или из Вашего же приложения.
Компоненты приложения, запускаемые исполняемой средой Android(Android Runtime) – запускаются либо через наступающие события, на которые запрограммированно Ваше приложение, либо программно через код в приложении. Триггер, при выполнении условий которого запускается компонент программы зависит от указанных Вами метаданных в описании компонента. Удалением или остановкой работы компонентов занимаетесь как Вы сами, так и ОС Android, которая может решить что Ваша свернутая программа или работающий сервис занимают слишком много ресурсов.
Чтобы разрабатываемое Вами приложение работало максимально стабильно, а пользователи были довольны стабильной работой и качественным UI, Вам пригодятся знания о жизненном цикле Android компонентов. В этой главе мы рассмотрим характеристики системных компонентов и их жизненный цикл.
Написать приложение или Android компонент – довольно тривиальная задача. Вы можете почитать руководство на официальном сайте Android, создать каркас приложения из шаблонов Android Studio, или скачать с гитхаба примеры наших приложений из книги и на этом каркасе строить уже Вашу разработку, или даже посмотреть видео туториалы на Youtube и по видео руководству создать приложение. Однако это простое приложение не обязательно будет стабильным профессиональным приложением, так как разработка Java или Kotlin приложений для настольных систем в корне отличается от мобильной разработки. Одна из причин, это то, что например операционная система Android может завершить ваше фоновое приложение для сохранения заряда или системных ресурсов, чего не случается в настольных системах, вроде MacOS или Windows.
Конечно, Android система не будет закрывать Ваше активное приложение, находящееся на переднем фоне, в случае если у вас конечно не возникнет ошибка времени исполнения. Но Вы должны предусмотреть вероятность того, что Ваше приложение будет перезапущено и оно желательно должно отображать все данные, введенные пользователем до этого.
С точки зрения файловой системы, файл Android приложения APK – это архивный zip файл с расширением *.apk. Этот архив содержит Ваше приложение, включая все мета данные для запуска Вашей программы. Самый главный файл в APK – это файл AndroidManifest.xml, описывающий приложение и все компоненты, содержащиеся в нем.
Мы не будем здесь подробно описывать структуру APK архива, так как в этом нет необходимости – Android Studio в большинстве случаев позаботится о корректном создании APK или Bundle файла, и Вам нет необходимости разбираться в этом вопросе. Однако Вы всегда можете сами изучить получившийся *.apk файл и даже попробовать его декомпилировать.
Пример содержания APK файла Вы можете посмотреть на рисунке 2-2.
Файлы *.dex содержат скомпилированные классы в формате Dalvik Executable(исполняемый файл формата Dalvik) – очень похоже на Jar файл в Java. По ходу повествования мы будем еще разбирать темы байт кода, исполняемой среды Android и т.д. А пока перейдем к следующей теме – Задачи.
Задачи
Задача – это группа активностей, взаимодействующих с друг с другом таким образом, что пользователь рассматривает их как единое приложение. Пользователь запускает Ваше приложение, видит главную активность, выполняет какие то действие, переключается на другие активности, переключается между приложениями и возвращается обратно в среду, закрывая Ваше приложение.
При внимательном взгляде , основная идея структуры задачи – это стек, в котором накапливают активности. Стандартное поведение, связанное со стеком для простого приложения – это создание корня стека при первоначальном запуске и помещение в него главной активности. При запуске следующей активности – вторая активность отправляется в стек над главной активностью, при запуске третьей активности оно помещается в стек над второй активностью и т.д. При каждом возврате назад, текущая активность будет удаляться из стека и так до главной активности. После удаления главной активности из стека, приложение считается закрытым.
Внутри тега <application> файла Androidmanifest.xml, мы увидим несколько настроек, которые изменяют стандартное поведение стека задач(см. глава 3). Таким образом, правильно спроектированный стек задач поможет Вашим пользователем свободно и интуитивно использовать приложение. Но и не стоит перегружать архитектуру множеством окон, чтобы пользователи не запутались в том, как именно работает Android приложение. Поэтому необходимо постараться найти баланс между мощностью возможностей и простотой использования.
Заметка. Больше информации по стеку активностей Вы можете прочитать по адресу https://developer.android.com/guide/components/activities/tasks-and-back-stack.html
Манифест Приложения
Самым важным файлом конфигурации Android приложения считается файл AndroidManifest.xml. Он описывает приложения и объявляет все используемые компоненты приложения. Схема типового приложения файла AndroidManifest.xml выглядит следующим образом:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="de.pspaeth.tinqly"> ... <application android:allowBackup="true" android:icon="@mipmap/my_icon" android:label="@string/app_name" android:roundIcon="@mipmap/my_round_icon" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity ... /> </application> </manifest>
Самый важный атрибут корневого тега manifest – package. Он объявляет уникальный идентификатор имени пакета. И если вы планируете разместить свое приложение в маркетах, Вам необходимо выбрать уникальный идентификатор, чтобы у Вас не было конфликта имен с уже существующим приложением. Идеальным решением будет использование имени домена Вашей компании и потом добавить название приложения.
Все доступные теги <manifest> приведены в таблице 2-1. Обратите внимание, что для большинства простых приложений, Вам нужно определить только имя пакета и добавить один элемент <application>
Наименование | Описание |
android:installlocation | Определяет место установки приложения. Используйте “internalOnly” для установки только во внутреннюю память, “auto” – по умолчанию устанавливается во внутреннюю память, но позже в настройках пользователь может перенести приложение во внешнюю память, и “preferExternal” – если хотите разрешить ОС принять решение об установке на внешнее хранилище. Если Вы не выбрали ни один пункт, то по умолчанию стоит internalOnly. Современные устройства поставляются с большими объемом внутреннего хранилища и Вам не нужно указывать куда необходимо устанавливать Ваше приложение. |
package | Уникальный идентификатор Вашего приложения. Строка вида “abc.def.ghi.[…]” где в качестве символом могут быть символы из латинского алфавита [A-Z] и [a-z], числа и символ подчеркивания _ Цифры могут идти только после символов алфавита, но не до. Имя пакета также является именем процесса в ОС Android и имя задач по умолчанию. Обратите внимание, что после публикации Вашего приложения в маркете, Вы уже не сможете изменить имя пакета. Для этого атрибута нет значения по умолчанию |
android:sharedUserid | Признан устаревшим начиная с API 29. Имя ID пользователя ОС Android, назначенного приложению. |
android:sharedUserlabel | Устарело начиная с API 29. Если Вы назначили sharedUserid, Вы можете установить удобочитаемую метку для ID пользователя. |
android:targetSandboxVersion | Уровень песочницы для вашего приложения. Может принимать значение 1 или 2. Чем выше значение, тем выше уровень безопасности. При установке второго уровня, параметр сетевой безопасности usesCleartextTraffic автоматически становится равным false. Совместное использование UID становится запрещен. Для Instant Apps(приложения с мгновенным запуском) необходимо установить уровень 2. |
android:versionCode | Внутренний номер версии приложения. Необходим для управления выпусками Ваших приложений в консоли разработчика. Версии должны увеличиваться, т.е. сначала идет 1, 2, потом 3 и т.д. По умолчанию не определено |
android:versionName | Версия приложения, отображаемая пользователю. Используется только для информирования пользователя. Может использоваться как текстовая константа, так и строковый ресурс. |
Полная документация доступная по адресу https://developer.android.com/guide/topics/manifest/manifest-element. Мы перечислили наиболее важные и те, с которыми Вы будете работать по мере разработки приложений