Разработка Android-приложений в деталях

Tekst
Przeczytaj fragment
Oznacz jako przeczytane
Czcionka:Mniejsze АаWiększe Aa

Wizard мастера ADT плагина

Мастер Android Project

Для создания Android-приложения откроем среду Eclipse с инсталлированным ADT-плагином и в меню File выберем команду New | Other | Android | Android Application Project и нажмем кнопку Next.

Введем имя приложения, отображаемое в устройстве, имя проекта, имя пакета. Выберем минимальную версию SDK, предпочтительную версию SDK, версию SDK относительно которой приложение будет компилироваться, тему приложения и нажмем кнопку Next. Оставим отмеченными флажки Create custom launcher icon и Create activity и нажмем кнопку Next. Определим значок приложения и нажмем кнопку Next. Выберем создаваемый Activity-компонент и нажмем кнопку Next:

Blank Activity – экран с надписью «Hello world!».

Blank Activity with Fragment – экран с фрагментом с надписью «Hello world!».

Empty Activity – все равно экран с надписью «Hello world!».

Fullscreen Activity – экран, нажатие на который вызывает переключение между обычным и полноэкранным режимами.

Master/Detail Flow – экран с боковой панелью меню.

Navigation Drawer Activity – экран с двумя фрагментами, панелью навигации и контентом.

Tabbed Activity – экран с вкладками и типом навигации: с помощью жеста Swipe Views (ViewPager), с помощью панели закладок Action Bar Tabs (with ViewPager), с помощью выпадающего списка Action Bar Spinner.

Определим имя Activity-компонента, имя компоновочного файла res/layout/activity_main. xml и нажмем кнопку Finish – в результате будет сгенерирована основа проекта Android-приложения.

Модель программирования Android-приложений основывается не на конструкции с главным классом приложения, имеющим точку входа – статический метод main (), а является компонентной моделью. Android-приложение может состоять из одного или нескольких компонентов, объявленных в файле манифеста приложения AndroidManifest. xml и относящихся к четырем типам:

Activity – расширение класса android.app.Activity, обеспечивающее создание одного окна на экране Android-устройства с формированием в нем GUI-интерфейса.

Service – расширение класса android.app.Service, обеспечивающее выполнение операций без предоставления GUI-интерфейса.

BroadcastReceiver – расширение класса android.content.BroadcastReceiver, отвечающее за прослушивание широковещательных сообщений с запуском других компонентов Android-приложения или выводом уведомлений пользователю в строку статуса.

ContentProvider – расширение класса android.content.ContentProvider, обеспечивающее хранение и извлечение общих данных.

Существующая версия ADT-плагина при создании Android-проекта предлагает формирование основы только Activity-компонента.


Основа самого простого Android-проекта, сгенерированная средой Eclipse, состоит из следующих узлов окна Package Explorer:

src – содержит пакет класса, расширяющего класс android.app.Activity.

gen – содержит R-класс, автоматически генерируемый инструментом aapt набора SDK Platform-tools из существующих ресурсов проекта для программного к ним доступа, а также класс BuildConfig, содержащий константу DEBUG, которая со значением true определяет запуск приложения в режиме отладки. При экспорте подписанного приложения значение константы DEBUG автоматически становится false.

Android х.х – библиотека Android-платформы, на основе которой создается приложение.

Android Private Libraries – дополнительная библиотека android-support, обеспечивающая обратную совместимость с предыдущими версиями Android API.

аssets – каталог предназначен для хранения данных приложения, доступ к которым осуществляется с помощью класса android.content.res.AssetManager. Отличие данного каталога от каталога res заключается в том, что он не должен иметь строго преопределенной структуры, которая для каталога res обеспечивает автоматическую генерацию R-класса.

bin – каталог сборки приложения.

libs – содержит JAR-файл библиотеки android-support.

res – содержит ресурсы приложения, доступ к которым осуществляется с помощью R-класса, и имеет строго предопределенную структуру:

animator – XML-файлы для создания объектов анимации.

color – XML-файлы, определяющие цветовую гамму View-объектов.

drawable – PNG, JPEG, GIF, 9-PNG и XML-файлы, формирующие графику.

layout – XML-файлы для формирования структуры GUI-интерфейса Activity-объектов.

menu – XML-файлы, описывающие меню приложения.

raw – каталог предназначен для хранения таких данных приложения как файлов в формате MP3 или Ogg.

values – XML-файлы для хранения строк, стилей, чисел, размеров и др., используемых приложением, в виде пар имя-значение.

xml – различные конфигурационные и ресурсные XML-файлы.

AndroidManifest. xml – файл манифеста приложения, определяющий запуск Android-приложения средой выполнения Android и описывающий Android-компоненты приложения, права пользователя, минимальный уровень API Android-платформы, необходимый для запуска приложения, требуемые опции Android-устройства и др.

ic_launcher-web.png – значок приложения для магазина Google Play Store.

proguard.cfg – файл инструмента proguard набора SDK Tools, обеспечивающего сокращение, оптимизацию и обфускацию кода.

project.properties – содержит установки проекта.

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

Для создания Android-библиотеки нужно в окне Package Explorer нажать правой кнопкой мышки на узле Android-проекта и в контекстном меню выбрать команду Properties. Далее в разделе Android отметить флажок Is Library и нажать кнопку OK.



Для использования созданной Android-библиотеки другим Android-проектом необходимо в окне Package Explorer нажать правой кнопкой мышки на узле Android-проекта и в контекстном меню выбрать команду Properties. Далее в разделе Android нажать кнопку Add и выбрать Android-библиотеку.

В результате в окне Package Explorer в Android-проект добавится узел Library Projects, содержащий временный JAR-файл Android-библиотеки, код и ресурсы которой можно использовать в проекте.

Запуск Android-приложения из среды Eclipse

Перед тем как воспользоваться командой Run As | Android Application контекстного меню окна Package Explorer для тестирования Android-приложения в реальной среде выполнения, необходимо либо подсоединить к компьютеру реальное Android-устройство, либо создать экземпляр Android-эмулятора.

Для тестирования Android-приложения в реальном Android-устройстве нужно зайти в настройки устройства и открыть раздел Приложения. В разделе Приложения отметить флажок Неизвестные источники, затем открыть раздел Разработка и отметить флажок Отладка USB. После чего инсталлировать драйвер устройства на компьютер и подсоединить устройство к компьютеру. В результате среда Eclipse произведет опознание устройства, которое отобразится в окне Devices (команда Window | Show View | Android | Devices).

Для запуска Android-приложения выберем команду Run As | Run Configurations контекстного меню окна Package Explorer и в разделе приложения во вкладке Target отметим флажок Always prompt to pick device. Нажмем кнопку Run, в окне Android Device Chooser выберем устройство и нажмем кнопку OK. В результате Android-приложение будет инсталлировано и запущено в реальном Android-устройстве. Нажав кнопку Screen Capture панели инструментов окна Devices можно сделать снимок экрана реального Android-устройства.




Для тестирования Android-приложения в Android-эмуляторе нужно запустить приложение AVD Manager и для создания виртуального Android-устройства во вкладке Android Virtual Devices нажать кнопку Create:

В поле AVD Name: ввести имя устройства.

В списке Device: выбрать тип устройства.

В списке Target: выбрать версию Android-платформы устройства.

В списке CPU/ABI: выбрать тип процессора.

В списке Skin: выбрать оболочку эмулятора – установка аппаратной клавиатуры и отображение кнопок устройства в оболочке Android-эмулятора.

В списках Front Camera: и Back Camera: определить камеры устройства.

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

В разделах Internal Storage: и SD Card: определить размер внутренней памяти и тип/размер карты памяти устройства. Поле File: раздела SD Card: предназначено для определения образа карты памяти, созданного с использованием инструмента mksdcard набора SDK Tools.

В разделе Emulation Options: с помощью флажка Snapshot определить ускорение повторного запуска виртуального устройства, так как его состояние будет сохраняться при закрытии, с помощью флажка Use Host CPU определить ускорение работы эмулятора, так как он будет использовать CPU компьютера.

 

И нажать кнопку OK. В результате в окне Android Virtual Device Manager появится созданное виртуальное устройство, которое нужно запустить кнопкой Start.




Кнопка Create Device вкладки Device Definitions позволяет создать новое устройство списка Device.

При запуске кнопкой Start виртуального устройства появляется окно Launch Options определения опций запуска, в котором:

Флажки Launch from snapshot и Save to snapshot работают в случае отмеченного флажка Snapshot раздела Emulation Options: и определяют загрузку и сохранение состояния виртуального устройства при закрытии.

Флажок Scale display to real size определяет масштабирование виртуального устройства путем установки диагонали и плотности экрана.

Флажок Wipe user data позволяет при запуске виртуального устройства стереть его сохраненное состояние, при этом будет отключена опция Launch from snapshot.

Виртуальное устройство окончательно запускается кнопкой Launch окна Launch Options.



По умолчанию приложение AVD Manager создает конфигурацию виртуального устройства в каталоге [user]\.android\avd файловой системы компьютера. Если в пути данного каталога будут присутствовать русские буквы, виртуальное устройство не запустится. Кроме того, запуск виртуального устройства занимает значительное время, поэтому рекомендуется как можно реже его закрывать.

После запуска виртуальное устройство отобразится на экране компьютера.



Для запуска Android-приложения в виртуальном Android-устройстве воспользуемся командой Run As | Android Application контекстного меню окна Package Explorer.

В результате запуска Android-приложения каталог bin Android-проекта заполнится файлами и папками:

Папка classes – откомпилированные Java класс-файлы, включая классы приложения и R-классы.

Папка dexedLibs – конвертированные в DEX-формат виртуальной машины Dalvik дополнительные библиотеки.

Папка res – ресурсы приложения.

Файл манифеста AndroidManifest. xml.

Бинарный файл resources.arsc строк приложения.

Файл classes.dex – конвертированные в DEX-формат виртуальной машины Dalvik Java класс-файлы.

APK-файл – ZIP-архив Android-приложения для инсталляции в отладочном режиме, содержащий папку META-INF с Java-манифестом MANIFEST. MF и сертификатами, папку res с ресурсами, файл манифеста AndroidManifest. xml, файл resources.arsc и файл classes.dex.

Подготовка к публикации Android-приложения

Среда выполнения Android при инсталляции приложений требует, чтобы все Android-приложения были подписаны цифровой подписью с помощью сертификата, закрытый ключ которого имеется в распоряжении разработчиков приложений. Однако в отладочном режиме инструменты сборки приложения набора Android SDK автоматически подписывают приложение специальным отладочным ключом, который генерируется и по умолчанию хранится в файле debug.keystore каталога [user]\.android. По умолчанию отладочный сертификат имеет срок действия 365 дней и по истечении этого периода необходимо удалить файл debug.keystore для повторной автоматической генерации сертификата.

Для того чтобы подготовить Android-приложение к реальной инсталляции в Android-устройстве, так как среда выполнения Android не позволит инсталлировать приложение, подписанное отладочным ключом, можно воспользоваться командой Android Tools | Export Signed Application Package контекстного меню окна Package Explorer – в результате откроется мастер Export Android Application, в поле Project: которого будет отображено имя Android-проекта и в окне которого надо нажать кнопку Next.

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

Для создания хранилища закрытого ключа в окне Export Android Application выберем переключатель Create new keystore, в поле Location: введем путь файла хранилища, в полях Password: и Confirm: введем пароль хранилища и нажмем кнопку Next.

Примечание

Для поля Location: необязательно использовать кнопку Browse – можно вручную ввести путь несуществующего файла, например, C:\Users\user\my_keystore, где файл my_keystore будет сгенерирован.

В поле Alias: введем имя ключа, в полях Password: и Confirm: введем пароль ключа, в поле Validity (years): введем срок действия сертификата более 25 лет, в поле First and Last Name: введем имя разработчика и нажмем кнопку Next, в поле Destination APK file: введем путь APK-файла Android-приложения и нажмем кнопку Finish.

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


Activity-компонент

Сгенерированная мастером Android Project основа Android-проекта Blank Activity в узле src окна Package Explorer содержит файл исходного кода Activity-компонента, в котором его класс, расширяющий класс android.app.Activity, переопределяет метод onCreate ().

Данный метод является одним из методов обратного вызова Activity-компонента, которые среда выполнения Android вызывает при переходе Activity-компонента между различными состояниями его жизненного цикла. Переопределение метода onCreate () является важным, так как он вызывается при запуске Activity-компонента и предназначен для инициализации GUI-интерфейса.

Помимо метода onCreate () класс android.app.Activity предоставляет следующие методы обратного вызова для их переопределения:

onRestart – метод жизненного цикла, вызывается после того как Activity-компонент был остановлен, перед вызовом метода onStart.

onStart – метод жизненного цикла, вызывается, когда Activity-компонент становится видимым.

onResume – метод жизненного цикла, вызывается, когда Activity-компонент помещается на передний план для взаимодействия с пользователем.

onPause – метод жизненного цикла, вызывается, когда Activity-компонент помещается на задний план. После данного метода может вызываться метод onResume, если Activity-компонент помещается снова на передний план, или метод onStop, если Activity-компонент становится невидимым.

onStop – метод жизненного цикла, вызывается, когда Activity-компонент становится невидимым. После данного метода может вызываться метод onRestart или метод onDestroy.

onDestroy – метод жизненного цикла, вызывается перед уничтожением Activity-компонента программным способом методом finish класса android.app.Activity или Android-системой для освобождения ресурсов.

onActionModeFinished – вызывается при окончании работы режима контекстного меню ActionMode.

onActionModeStarted – вызывается при запуске режима контекстного меню ActionMode для Activity-компонента.

onActivityResult – при запуске другого Activity-компонента методом startActivityForResult вызывается после закрытия запущенного Activity-компонента для обработки возвращаемых им результатов.

onAttachFragment – вызывается при присоединении объекта Fragment к объекту Activity между вызовами методов жизненного цикла Fragment. onAttach и Fragment. onCreate.

onAttachedToWindow – вызывается при присоединении окна Activity-компонента к Window-менеджеру, метод может быть использован вместо метода onCreate.

onBackPressed – вызывается при нажатии пользователем клавиши Back.

onConfigurationChanged – вызывается при изменении конфигурации устройства во время работы Activity-компонента, при этом информацию о новой конфигурации предоставляет объект android.content.res.Configuration.

onContentChanged – вызывается при изменении GUI-интерфейса Activity-компонента при вызове метода setContentView.

onContextItemSelected – вызывается при выборе элемента контекстного меню.

onContextMenuClosed – вызывается при закрытии контекстного меню.

onCreateContextMenu – вызывается при создании контекстного меню – меню, которое открывается при долгом нажатии на GUI-элементе.

onCreateDescription – вызывается перед вызовом метода onPause.

onCreateNavigateUpTaskStack – вызывается при создании стека задач.

onCreateOptionsMenu – вызывается при создании меню опций – меню, которое связано с Activity-компонентом.

onCreatePanelMenu – вызывается для инициализации содержимого меню (меню опций или контекстного меню).

onCreatePanelView – вызывается при создании панели меню.

onCreateThumbnail – вызывается перед вызовом метода onPause и позволяет определить для Activity-компонента значок, а не скриншот.

onCreateView – вызывается для создания фрагментом GUI-интерфейса.

onDetachedFromWindow – вызывается при отсоединении окна Activity-компонента от Window-менеджера.

onGenericMotionEvent – вызывается для необработанного события MotionEvent.

onKeyDown – вызывается для необработанного события KeyEvent при нажатии клавиши.

onKeyLongPress – вызывается для необработанного события KeyEvent при долгом нажатии.

onKeyMultiple – вызывается для необработанного события KeyEvent при многократном нажатии одной клавиши.

onKeyShortcut – вызывается для необработанного события KeyEvent при нажатии комбинации клавиш.

onKeyUp – вызывается для необработанного события KeyEvent при освобождении клавиши.

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

onMenuItemSelected – вызывается при выборе элемента меню.

onMenuOpened – вызывается при открытии меню.

onNavigateUp – вызывается при нажатии кнопки Up.

onNavigateUpFromChild – вызывается, если дочерний Activity-компонент использует Up-навигацию.

onNewIntent – при запуске данного Activity-компонента другим Android-компонентом вызывается для уже существующего экземпляра Activity-компонента переднего плана своей задачи, имеющего атрибут android: launchMode=«singleTop» файла манифеста, или если вызывающий Android-компонент использует метод startActivity с флагом FLAG_ACTIVITY_SINGLE_TOP Intent-объекта, вместо создания нового экземпляра Activity-компонента.

onOptionsItemSelected – вызывается при выборе элемента меню опций.

onOptionsMenuClosed – вызывается при закрытии меню опций.

onPanelClosed – вызывается при закрытии панели меню.

onPostCreate – вызывается после вызова метода onRestoreInstanceState.

onPostResume – вызывается после вызова метода onResume.

onPrepareNavigateUpTaskStack – вызывается перед созданием стека задач.

onPrepareOptionsMenu – вызывается перед открытием меню опций.

onPreparePanel – вызывается перед открытием панели меню.

onProvideAssistData – вызывается, когда пользователь запрашивает помощь.

onRestoreInstanceState – вызывается после метода onStart для восстановления состояния Activity-компонента из объекта android. os. Bundle.

onSaveInstanceState – вызывается перед уничтожением Activity-компонента, перемещенного с переднего плана, Android-системой для освобождения ресурсов памяти. Данный метод предназначен для сохранения состояния Activity-компонента в объекте android. os. Bundle в виде пар имя-значение. Измененный объект Bundle передается Android-системой в методы onCreate (Bundle) и onRestoreInstanceState (Bundle).

onSearchRequested – вызывается при запуске поиска.

 

onTouchEvent – вызывается для необработанного события MotionEvent при прикосновении к экрану.

onTrackballEvent – вызывается для необработанного события MotionEvent при перемещении указателя.

onTrimMemory – вызывается при сокращении ненужной памяти у процесса.

onUserInteraction – вызывается при взаимодействии с пользователем.

onUserLeaveHint – вызывается, когда Activity-компонент перемещается на задний план в результате действий пользователя.

onWindowAttributesChanged – вызывается при изменении атрибутов окна.

onWindowFocusChanged – вызывается при потере или получении фокуса окном.

onWindowStartingActionMode – вызывается при запуске режима ActionMode для окна.

Другой метод обратного вызова класса android.app.Activity, который рекомендуется переопределять – это метод onPause (), вызываемый при потере фокуса Activity-компонентом и который предназначен для сохранения состояния Activity-компонента, так как Android-приложение не контролирует полностью жизненный цикл своих компонентов – Android-система может уничтожать приостановленные Activity-компоненты для освобождения ресурсов памяти.

В методе onPause () производится сохранение данных, общих для приложения или для использования другими приложениями, с помощью ContentProvider-компонента, или прямое сохранение измененных данных с помощью объекта SharedPreferences (сохранение пар имя-значение примитивных типов данных), метода openFileOutput () класса android.content.Context (сохранение данных во внутреннем хранилище устройства), метода getCacheDir () класса android.content.Context (кэширование данных), метода getExternalStorageDirectory () класса android. os. Environment (сохранение данных в карте памяти), сохранение данных в базе данных SQLite, в Web-сервисах с использованием пакетов java.net.* и android.net.*.

Использование метода onPause () для сохранения состояния Activity-компонента имеет свои преимущества, по сравнению с применением метода onSaveInstanceState (), так как метод onSaveInstanceState () не будет вызываться Android-системой, если Activity-компонент был уничтожен пользователем, например, нажатием клавиши BACK.

Переопределение методов onCreate (), onStart (), onRestart (), onResume (), onPause (), onStop (), onDestroy () и др. должно сопровождаться вызовом суперкласса с помощью ключевого слова super.

В переопределенном методе onCreate () класса Activity-компонента сгенерированной основы Android-проекта вызывается метод setContentView () класса android.app.Activity, устанавливающий GUI-интерфейс Activity-компонента на основе XML-файла activity_main. xml каталога ресурсов res/layout проекта.

В переопределенном методе onCreateOptionsMenu () класса Activity-компонента сгенерированной основы Android-проекта методом getMenuInflater () получается объект android.view.MenuInflater, отвечающий за создание объектов меню из XML-описания.

Переопределенный метод onOptionsItemSelected () класса Activity-компонента сгенерированной основы Android-проекта представляет каркас обработки выбора элементов меню.