среда, 16 июня 2010 г.

Pragmatic Android, part #0

Скачал несколько книжек о программировании для Android, хочется сделать себе одну программку, на маркете ничего похожего не нашел пока (а у жены, на ее Corby такой виджет есть и она его хвалит) – так что читаю, пробую

Одна из книжек пока понравилась больше других, так что не поленюсь и сделаю тут “конспект” – может кому еще пригодится

Автор по шагам описывает, как сделать игру Судоку для андроида (я пытался несколько раз поиграть на iPod-е, ни разу так и не до решал ее до конца.. тупой я что-ли настолько), получается такое себе хорошее howto

Разная там теория мне особо никогда не была нужна, мне нужен был результат, так что про теорию читать еще где-то; в 3-х словах – программы для андроида пишутся на яве, рекомендуется использовать Eclipse со специальным плагином, должен быть установлен андроидный SDK, про все это написано например на android.com; eclipse у меня уже установлен, а скачать/установить SDK недолго и несложно

Вместе с SDK устанавливается эмулятор устройства, так что можно сделать первую программу даже без телефона; если же телефон есть, то у него в настройках включается режим отладки по usb, после чего программа загружается/запускается после компиляции сразу на телефоне

Внутри телефона работает Linux (поэтому умельцам с samdroid.net например можно компилить прошивки с разными версиями ядер и перепрошивать их в телефон); правда линух используется собственно андроидом, юзер и его программы не имеют доступа к системе напрямую (получение root это уже хак)

Выше линуховского ядра находятся библиотеки, написанные для конкретного телефона производителем телефона. Самые важные библиотеки – это:

  • Surface Manager – приложение говорит, что оно хочет нарисовать, а как это отобразится на экране – зависит от этого менеджера.. что-то типа DWM в висте
  • 2D and 3D graphics – используется для комбинирования 2D и 3D элементов, с использованием аппаратного ускорения, если есть
  • Media codecs – используется для кодирования/декодирования видео и аудио, поддерживает AAC, H264, MP3 и т.д.
  • SQL database – поддержка базы данных
  • Browser engine – использует WebKit для отображения HTML (его – WebKit – используют также хром и сафари на маках и iPhone)

Дальше внутри андроида есть виртуальная машина, оптимизированная для устройств с ограничениями, названная Dalvik; сделал ее сам Google из явы; чем-то она отличается от “обычной” явы, но мне честно говоря до лампочки, чем именно

Все перечисленное используется Application Framework-ом – набором высокоуровневых блоков, которые используют приложения; самые важные части фреймворка - это:

  • Activity manager – контроллирует жизненный цикл приложения и обеспечивает “стек” окон/приложений (в андроиде есть прикольная клавиша Back, которая как в броузере перемещает юзера назад – но даже по разным приложениям)
  • Content providers – контроллирует данные, которые могут быть расшарены между приложениями (контакты например)
  • Resource manager – ресурсы – это все, что не код
  • Location manager – сервисы определения местоположения
  • Notification manager – сервисы оповещения юзера о входящих сообщениях или запланированных событиях

Ну и то, что видит юзер – это приложения и виджеты; приложение занимает весь экран и самолично занимает все внимание юзера; виджет занимает кусочек экрана и работает “внутри” приложения Home (оно запускается самое первое и содержит ссылки на другие программы)

Когда новый телефон распакован и включен, внутри всегда найдутся: Звонилка, Контакты, Электронная почта, Веб-бровзер, Маркет (через который купятся/скачаются/установятся остальные нужные и ненужные программки). Одна из супер-фич андроида – то, что у него нет “системных” приложений, Звонилка или Home могут быть заменены программой с тем же функционалом без всяких хаков (например первое, что я сделал после очередной перепрошивки и получения “голого” телефона – скачал и установил Launcher Pro)

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

В андроиде все не так: всегда есть приложение на переднем плане (обычно занимающее весь экран минус строку статуса); сразу после включения это Home (Pandeon у самсунга или Launcher Pro у меня сейчас). Когда запускается новое приложение, оно помещается “поверх всех”, это приложение может запустить следующее или показать свое новое окно – все приложения/окна помещаются андроидом в стек/стопку, еще у него есть кнопка Back, с помощью которой можно перемещаться назад по этой стопке

Это в разы удобнее в сравнении с iPhone-ом, например: я читаю почту, в письме ссылка, я щелкаю ее, смотрю в броузере; в iPhone потом я должен выйти в Home, снова запустить почтовый клиент (который обязательно решит заново проверить почту) и продолжить с почтой. Сейчас же я тыкаю по ссылке, смотрю ее в бровзере, ПОТОМ нажимаю Back и возвращаюсь в ту же точку, где я нажал ссылку.. Лично я это оценил :)

Каждый экран/окно, которое видит пользователь – это экземпляр класса Activity; у приложения один или несколько экранов и один процесс, который их обслуживает. В течении жизни окна/экрана/activity находится в одном из состояний, контроля над которым у программиста нет; он просто уведомляется событием On*** при смене состояний:

lc

Все эти методы могут быть переопределены, андроид вызовет их в нужный момент:

  • onCreate(Bundle): вызывается при создании activity; здесь происходит настройка пользовательского интерфейса (параметр, который передается в метод – null или некая информация о состоянии, сохраненная в прошлом при вызове метода onSaveInstanceState
  • onStart( ): вызывается, когда экран показывается юзеру
  • onResume( ): вызывается, когда экран начинает взаимодействовать с юзером
  • onPause( ): вызывается, когда экран уходит на задний план; именно здесь самое место сохранить какие-то данные, с которыми работали..
  • onStop( ): когда экран не на виду и не нужен какое-то время, может быть вызван этот метод; но система может решить (например, если мало памяти) и просто убить процесс, onStop при этом не будет вызван
  • onRestart( ): метод вызывается, если экран снова показывается юзеру (и до этого он был в состоянии Stopped)
  • onDestroy( ): вызывается перед уничтожением активити (но не гарантированно, как и в случае с onStop)

Как видно из этого списка, время жизни активити не гарантированно и последнее, что с ним может случится – это OnPause

Пока все..

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

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