воскресенье, 11 апреля 2010 г.

Глава 2 Ключевые концепции


Глава 2 Ключевые концепции

            Сейчас вы знаете только идеи Android, давайте изучим концепции Android, которые нужны нам для работы. Некоторые из них могут быть знакомы, такие как Linux kernel, OpenGL и база данных SQL. Другие будут неизвестны, такие как идея life cycle приложения для Android.
            Необходимо хорошее понимание этих ключевых концепций для написания наилучшим образом приложения для Android, поэтому если вы прочитали только одну главу этой книги, прочитайте ещё и эту.




2.1 Общая картина

            Давайте взглянем на общую архитектуру системы – key layers и компоненты составляют открытую основу Android stack. На рисунке 2.1, вы можете увидеть «20,000-точек зрения» на Android. Изучение его подробно. Каждый layer использует services, обеспеченные layers под им. Начиная снизу, каждая секция выделяет layers предусмотренные Android. Рассмотрим их.

Linux Kernel

            Android строится на прочном и проверенном фундаменте: the Linux kernel. Созданный студентом университета Helsinki, Linus Torvalds в 1991, Linux можно найти сегодня везде: от часов до суперкомпьютеров. Linux обеспечивает абстрактный layer оборудования для Android, позволяющий Android быть портируемым на большое количество платформ в будущем.
 Рисунок 2.1: Архитектура Android
            Внутренне, Android использует Linux для управления своей памятью, процессами
управления, сетевыми, и другими сервисами операционной системы.
Пользователь Android телефона никогда не видит Linux и ваши программы не будут работать с Linux напрямую, как разработчику, вам необходимо ознакомиться с ним.
            Некоторые утилиты, которые вам нужны в процессе разработки взаимодействуют с Linux. Например, команды adb shell[1] открывают shell Linux, в которой вы можете писать другие команды для устройства. Вы можете просмотреть файловую систему Linux, активные процессы, и так далее.

Native Libraries

            Следующий layer выше ядра содержит Android native-библиотеки. Эти библиотеки общего пользования написаны с помощью C или C++, для конкретной предустановленной hardware архитектуры оборудования используемой телефоном, и предустановленной производителем телефона.


            Некоторые из самых важных native-библиотек:


  • Surface Manager: Android использует compositing window manager подобно тому, что есть в Vista или Compiz, но гораздо более простой. Вместо рисования напрямую в буфер экрана, команда рисует в закадровый bitmaps, в который так же рисуют другие команды, они совмещаются и выдаются пользователю на экран. Это позволяет системе создавать интересные эффекты, такие как просмотр через окна и необычные переходы.
  • 2D and 3D graphics: двух- и трехмерных элементы могут быть совмещены на одном пользовательском интерфейсе в Android. Библиотека использует 3D hardware, если устройство имеет его или быстрый программный renderer, если устройство не обладает им. См. главу 4, Исследование 2D графики и Главу 10, 3D Графика в OpenGL.
  • Media codecs: Android может проигрывать и записывать видео и аудио в разнообразных форматах, включая AAC, AVC (H.264), H.263, MP3 и MPEG-4. См. Главу 5, Мультимедия.
  • База данных SQL: Android включает ядро облегченной базы данных SQLite[2], такая же база данных используется в Firefox и iPhone Apple. Вы можете использовать её для длительного хранения информации в вашем приложении. См. Глава 9, Настройка SQL для работы.
  • Browser engine: Для быстрого отображения содержимого HTML, Android использует библиотеку WebKit[3]. Она лежит в основе браузеров Google Chrome, Safari Apple, iPhone Apple, и браузера платформы S60 Nokia. См. главу 7, Соединение с миром.

Android Runtime

            Выше уровня ядра находиться Android runtime, включая виртуальную машину Dalvik и библиотеки Java.


            Dalvik VM это реализация Google Java, оптимизированной для мобильных устройств. Весь ваш написанный код для Android, будет написан на Java и будет запускаться в VM.


            Dalvik отличается от традиционной Java-машины в 2 важных местах:


  • Dalvik VM запускает файлы с расширением .dex, которые получаются во время трансляции стандартых .class и .jar файлов, .dex files более компактны и эффективны, чем файлы class, это важно для лимитированной памяти и емкости батареи устройства с Android.
  • Ядро библиотеки Java для Android отличается и от стандартных библиотек Java(Java SE) и от Java Mobile Edition (Java ME) libraries. Конечно, есть совпадения. В приложении A, на странице 217, вы найдете сравнение Android и стандартных библиотек Java.

Джо спрашивает: Что такое Dalvik?

            Dalvik – виртуальная машина (VM) сконструированная и написанная Dan Bornstein из Google. Ваше код компилируется в машинонезависимый байт-код, который выполняется в виртуальной машине Dalvik на мобильном устройстве. Несмотря на то, что байт-код отличается, Dalvik по существу есть виртуальная машина Java, оптимизированная для низкого потребления памяти. Архитектура позволяет многократный запуск VM, обеспечивая преимущество операционной системы (Linux) для безопасности и изолирования процессов. Название виртуальной машине дал Bornstein, Dalvik – рыбацкое село в Исландии, где жили его предки.

Application Framework

Поднимаясь от native libraries и runtime, вы попадете на Application Framework layer. Этот слой обеспечивает высокоуровневые механизмы, которыми вы будете пользоваться при создании приложений. Framework устанавливается с Android, но вы можете также расширять его своими собственными компонентами по мере необходимости.


Самые важные части framework:


  • Activity manager: контролирует жизненный цикл приложений (см. Раздел 2.2, Оно живо!) и поддерживает общий обратный стек для навигации пользователя.
  • Content providers: objects инкапсулируют данные, которые необходимо поделить между разными приложениями, например контакты. См. раздел 2.3, Content Providers.
  • Resource manager: ресурсы программы не размещаются в коде. См. раздел 2.4, Использование ресурсов.
  • Location manager: Android телефон всегда знает где он. См. главу 8, Положение и осязание.
  • Notification manager: события такие как получение сообщения, задачи, сигналы тревоги, и другие предоставляются пользователю в ненавязчивом виде.

Embrace и Extend

            Одно из уникально и мощных качеств Android то, что все приложения имеют уровень playing field. Я имею в виду то, что системные приложения используют теже public API, которыми пользуетесь вы. Поэтому вы можете написать программу, которая заменит стандартную.

Приложения

            Самым высоким layer в архитектуре Android - Applications layer. Это вершина айсберга Android. Конечный пользователь видит только эти приложения, непредставляя что происходит под водой. Однако разработчик для Android должен знать что там.


            Когда кто-то купит Android телефон, он распакует его и увидит стандартные приложения системы:


  • Dialer телефона
  • Email
  • Контакты
  • Web browser
  • Android market


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


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

2.2 Оно живое!

            На вашем компьютере с Linux или Windows, вы можете иметь много приложений и видеть их все сразу в разных окнах. Одно из окон имеет фокус клавиатуры, но в целом все программы равны. Вы можете легко переключаться между ими, на вашей ответственности как пользователя находиться не только переключение и перемещение окон, но и их закрытие. Android работает по другому. В Android, одно foreground приложение, которое типично занимает весь экран, кроме панели индикации. Когда пользователь включает телефон наблюдает первое приложение - Home application(см. рисунок 2.2). Эта программа обычно показывает время, фоновое изображение, и листаемый список других приложений, которые пользователь может вызвать. Когда пользователь запускает приложение, Android начинает его выполнять и переносит его в foreground. С запуском приложения, пользователь может запускать другие, или переключиться на другой экран в этом приложении и так далее. Все эти программы и экраны записываются в стеке приложений (application stack) системным Activity Manager. В любое время, пользователь может нажать кнопку назад, для того чтобы возвратиться к предведущему экрану в стеке. С точки зрения пользователя он работает как будто в браузере: нажатие назад возвращает его к предыдущей странице.

Рисунок 2.2: Домашний экран

Процесс! = приложение

            Внутренне, каждый экран пользовательского интерфейса представляет собой Activity class (см. раздел 2.3, Activities). Каждая activity имеет свой собственный жизненный цикл. Приложение имеет одну или больше activities плюс процесс Linux привязанный к нему. Мило звучит не так ли? Однако тут кроется клюква.
            В Android, приложение может быть «живое» даже если его процесс был убит, то есть, жизненный цикл activity не привязан к жизненному циклу процесса. Процессы как бы тара одноразового использования для activity. Это есть отличие от любой другой системы с которой вы знакомы, поэтому нам необходимо более детально рассмотреть этот механизм, чтобы двигаться дальше.

Жизненные циклы

            Во время своей продолжительности жизни, каждая activity программы Android находиться в одном из нескольких положений, показанных на рисунке 2.3. Вы, разработчик, не имеете управления над этими состояниями вашей программы, это управляется системой. Однако, вы получаете сообщения, когда состояние меняется, через вызов методов onXX ().

Рисунок 2.3: Жизненный цикл Android activity

            Вы переопределяете эти методы в вашем Activity class, и Android вызовет их в подходящее время:
  • onCreate (Bundle): Этот метод вызывается, когда activity первый раз запускается. Вы можете использовать его, для того чтобы выполнить инициализации, такие как создание пользовательского интерфейса. onCreate() принимает один параметр из двух: null или некоторые данные по ранее сохраненному состоянию с помощью метода OnSaveInstanceState( ) .
  • onStart( ): Этот метод указывает activity о том, что она должна быть отображена пользователю.
  • onResume( ): Этот метод вызывается, когда ваша activity может начать взаимодействовать с пользователем. Это хороший момент, для того чтобы начать воспроизводить анимацию или звук.
  • onPause( ): Этот метод вызывается, когда activity должна перейти в background, обычно это вызвано тем, что другая activity была запущена. Это применяется для сохранения состояния вашей программы, например, сохранение отредактированной записи базы данных.
  • onStop( ): Этот метод вызывается, когда ваша activity долго не видна пользователю, т.е. он в ней не нуждается. Если память сильно занята, то onStop() может быть не вызван(система может просто прекратит ваш процесс).
  • onRestart( ): Если этот метод вызван, то он сообщает вашей activity о необходимости перерисоваться с момента остановки.
  • onDestroy( ): Этот метод вызывается прежде, чем ваша activity будет уничтожена. Если Памяти мало, onDestroy() может не вызываться (система может просто прекратить ваш процесс).
  • onSaveInstanceState (Bundle): Android вызовет этот метод, для того чтобы позволить activity сохранить свое состояние, например, положение стрелки внутри текстого поля. Обычно вам не нужно переопределять его, потому что по умолчанию для всех приложений с пользовательскими интерфейсами это происходит автоматически[4].
  • onRestoreInstanceState (Bundle): Этот метод вызывается, когда activity переинициализируется с момента, ранее сохраненного, с помощью метода OnSaveInstanceState(). По умолчанию выполняется восстановление вашего пользовательского интерфейса.
            Activity, которые не запущенны в foreground могут быть остановлены или могут быть убиты в любое время по требованию процесса Linux, который занимается перераспределением памяти в случае необходимости освободить место для новых Activity. Это общее правило, важно, чтобы ваше приложение было сконструировано от начала до конца с этой концепцией. В некоторых случаях, метод onPause() может быть последним методом вызвал в вашей activity, для того чтобы сохранить данные, которые потребуются следующий раз.
            В дополнение к управлению жизненным циклом вашей программы, Android framework обеспечивает множество блоков, которые вы используете для создания вашего приложения. Взглянем на них потом.

Закрытие крышки

            Быстрый путь испытать, что ваш код ответственный за сохранение работает. В текущих версиях Android, изменение ориентации (между портретным и ландшафтным) требует от системы запустить процесс сохранения состояния, сделать паузу, остановку, разрушение, и после этого создать новую копию activity с сохраненным состоянием. На телефоне T-Mobile G1, например, это закрытие крышки клавиатуры, в эмуляторе Android нажатие Ctrl+F11 или клавиш 7 или 9  на клавиатуре.

2.3 Строительные блоки

            Немного объектов объявлены в Android SDK, каждому разработчику необходимо ознакомиться с ними. Самые важные: activities, intents, services, и content providers. Вы увидите несколько примеров их использования внутри книги, поэтому мне хотелось бы остановиться на них.

Activities

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

Intents

            intent механизм для описания специфических действий, так как «выбор фото» «телефон» и другие. В Android всё происходит через intents, поэтому вы имеете возможность заменять или повторно использовать компоненты. См. раздел 3.5, создание About Box, для примера. Например, intent для «отправки email». Если вашему приложению требуется послать почту, вы вызовете этот intent, или если вы пишете новое приложение для работы с email, вы можете зарегистрировать activities для того чтобы управлять intent и заменить стандартную почтовую программу. Если кто-нибудь пытается послать вам email, его получит ваша программа вместо стандартной.

Services

            service это задача которая работает в background без прямого взаимодействия с пользователем, подобная демону Unix, например, музыкальный проигрыватель. Он может быть сделан через activity, но вы хотите, чтобы он работал даже при переходе к другим приложениям. Код, непосредственно воспроизводящий звук, должен быть сделан через service. Другая activity может управлять этим service, например, ставить на паузу или переключать треки. Android содержит много services и имеет удобное APIs для доступа к ним.

Content Providers

            Content Providers – заворачивает данные с помощью API для того чтобы читать и писать их. Это лучший способ передачи данных между приложениями. Например, Google открывает доступ к контактам через Content Providers. Вся информация (адреса, номера телефонов, и так далее) может быть разделена между любыми приложениями, использующими её. См. Раздел 9.5, Использование Content Provider,  для примера.

2.4 Использование ресурсов

            Ресурсы (локализованные текстовые строки, bitmap, и другие данные, кроме кода) всегда необходимы вашей программе. Во время build приложения все ваши ресурсы встраиваются в него.
            Вы создаёте и сохраните ваши ресурсы в директории res внутри вашего проекта. Компилятор ресурсов Android (aapt)[5] обрабатывает ресурсы согласовывая поддериктории, где они хранятся и их форматы. Например, формат PNG и JPG bitmaps должны быть помещены в директорию res/drawable, XML файлы описывающие layout экранов должны быть помещены в директорию res/layout. Компилятор ресурсов сжимает и пакует ваши ресурсы и после этого генерирует класс R содержащий идентификаторы, которые вы используете как ссылки в вашей программе для обращения к ресурсу. Это есть отличие от стандартых ресурсов Java, которые снабжены ссылками key strings. Такой подход позволяет Android держать все ссылки в актуальном состоянии, экономить место. Eclipse использует подобный метод для того чтобы хранить и снабжать ссылками ресурсы вставляемые Eclipse plug-ins. Мы увидим пример кода для того чтобы использовать ресурсы в Главе 3, Дизайн интерфейсов пользователя,.

2.5 Надежно и безопасно

            Как упомянуто более раньше, каждое приложение работает в своем собственном процессе Linux. Оборудование запрещает одному процессу обращаться к памяти другого процесса. Кроме того, каждому приложению присваивается user ID. Любые файлы, которые оно создает не могут быть прочитаны или перезаписаны другими приложениями, кроме того, доступом к некоторым критическим операциям ограничен, и они специально прописываются в файле Android-Manifest.xml. Когда приложение устанавливается, менеджер пакетов спрашивает о предоставлении им прав, основанное на certificates и, при необходимости, ответов пользователя. Вот некоторые из самых распространенных:
  • INTERNET: доступ к интернету.
  • READ_CONTACTS: Чтение (но не запись) данных контактов пользователя.
  • WRITE_CONTACTS: Запись (но не чтение) данных контактов пользователя.
  • RECEIVE_SMS: Контроль за входящими сообщениями SMS (текст).
  • ACCESS_COARSE_LOCATION: Использование грубых источников для определения положения, такого как вышки мобильной связи или wi-fi.
  • ACCESS_FINE_LOCATION: Использование более точного источника для определения положения(GPS).
            Например, для того чтобы контролировать входящие сообщения SMS, вы определите в manifest le:


Android может даже ограничить доступ ко всем частям системы. Используя теги XML внутри AndroidManifest.xml, вы можете ограничить запуск activity, старт и остановку service, прием и передачу, или доступ к данным в content provider. Это все охвачено этой книгой, но если вы хотите узнать больше, то прочитайте online-документацию для Android security model[6].

2.6 Резюме

            Остальная часть этой книги будет использовать все введенные концептуальные схемы в этой главе. В главе 3, Дизайн пользовательского интерфейса, мы будем использовать activities и методы жизненного цикла для простого примера программы. Глава 4, 2D графика, использует некоторые из графических классов Android стандартной библиотеки. Codecs будут исследованы в главе 5, Мультимедия, и content providers будут рассмотрены в главе 9, SQL для работы будет рассмотрен.


[1] http://d.android.com/guide/developing/tools/adb.html
[2] http://www.sqlite.org
[3] http://www.webkit.org
[4] Перед версией 0.9_beta, метод onSaveInstanceState() вызвал метод onFreeze(), и замораживал ваше приложение. Вы можете найти старые имена в некоторой документации и примерах
[5] http://d.android.com/guide/developing/tools/aapt.html
[6] http://d.android.com/guide/topics/security/security.html

Комментариев нет:

Отправить комментарий