А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я
0-9 A B C D I F G H IJ K L M N O P Q R S TU V WX Y Z #


Чтение книги "Журнал PC Magazine/RE №04/2008" (страница 19)

   Проблемы и решения
   Советы и секреты: pcmag.ru/solutions/

   Google Android: азы разработки

   Андрей Иванов
   Слухи о том, что компания Google занялась разработкой собственного мобильного телефона, ходили давно. Описания и фотомонтажи «гуглофона» появились в Сети уже год назад, часто даже более фантастические, чем когда-то iPhone. Но Google не стала размениваться на мелочи (один телефон), создав полномасштабную мобильную платформу. Система получила название Android.
   Компания анонсировала глобальные планы по развитию этой платформы. (Из действий Google можно сделать вывод, что аппарат воспринимается ею прежде всего как мобильный носитель контекстной рекламы.) С этой целью был создан консорциум Open Handset, куда вошли изготовители микросхем для мобильных устройств (прежде всего, конечно, Texas Instruments), сотовых телефонов (Samsung Electronics, HTC и др.) и операторы сотовой связи (T-Mobile и China Telecom).
   Как действия этого альянса в ближайшие год-два повлияют на развитие мобильной связи, пока неясно. Обсуждается даже, станет ли Google первым бесплатным оператором сотовой связи или беспроводного доступа в Интернет. Ситуация на рынке сотовой связи сейчас дает его участникам мощный стимул к развитию: средний доход в расчете на одного абонента неуклонно падает. Это заставляет их изыскивать новые источники дохода, в том числе от мобильной рекламы.
   Android (изначально созданный небольшой стартап-компанией, купленной Google года два назад) считается «оружием победы». В течение ближайших двух лет предполагается продать до 50 млн. телефонов на базе этой платформы (будущий объем рынка ПО для Android оценивается в 300 млн.).
   Будучи именно платформой, Android оставляет изготовителям реальных устройств значительную свободу творчества. Например, T-Mobile, участник консорциума OHA, давно продает собственный мобильный аппарат под маркой SideKick. (Первоначально SideKick был программой-органайзером, созданной в конце 1980-х компанией Borland. Когда Филипп Канн, ее основатель, покинул Borland, он получил в виде бонуса лицензию на SideKick, и после серии перепродаж права на торговую марку попали к T-Mobile). Другой участник OHA, компания Amazon, недавно выпустил свою электронную книгу с использованием технологии электронной бумаги. Android можно также инсталлировать на уже существующие устройства.
   Проект Android в Google начался с приобретения одноименной компании, разработавшей набор основных компонентов новой сотовой платформы. Ход вполне предсказуемый, особенно на фоне активности других участников рынка, начиная с Apple.
   Зачем Google потребовалась целостная платформа и почему нельзя было обойтись набором мобильных служб – вполне очевидно. Контекстная реклама Google требует наличия браузера с рядом специальных технологических возможностей, в то время как мобильные браузеры большинства платформ довольно ограничены, например, в средствах работы с JavaScript и, как следствие, AJAX. Заставить миллионы пользователей установить на существующие аппараты новый браузер тоже сложно. Сценарий «предложить новый телефон с новым браузером» (с возможностью просмотра мобильной рекламы), видимо, показался компании Google более перспективным.
   Но уже первые анонсы показали, что Android – это нечто большее, чем телефон-рекламоноситель. Приняв решение строить его на базе Linux, Google собрала огромный набор средств и подсистем (от внутренней СУБД до ПО управления телефоном), также основанных на открытых разработках. Компания отошла от привычной для мобильного мира стратегии «закрытости» системных модулей и предоставила разработчикам практически полную свободу (практически, поскольку часть компонентов, содержащих некоторые алгоритмы, все же недоступна).
Android изнутри
   Одна из главных особенностей Android – теснейшая связь, почти симбиоз, мобильного телефона и сервиса определения координат (не обязательно GPS, в бюджетных моделях координаты будут определяться с точностью до километра по привязке к базовой станции мобильной сети). Часть аппаратов, как предполагается, будут конвергентными, т. е. работающими не только в сотовых сетях, но и по беспроводным сетям WiFi (что привлекательно для корпоративных пользователей).
Описываем активность нашего класса
   Помимо Linux, в Android реализовано ядро Java (с набором соответствующих инструментальных средств разработчика на базе популярной IDE Eclipse). Это заметно упрощает адаптацию существующего ПО и разработку корпоративных инструментов там, где не требуется изощренного программирования, достаточно вывести несколько экранных форм и сохранить введенные данные.
   Идеология интеграции между программами, реализованная в Android, – исключительно мощное и гибкое средство. В рамках проекта OpenIntents ведется БД разработчиков, URL и Intent. Здесь напрашивается сравнение с конвейерами UNIX-систем, где выходные текстовые данные от одной программы передаются к другой по цепочке до получения желаемого результата. Но Android не ограничена текстовыми данными, платформа позволяет эффективно обрабатывать информацию разных типов, в том числе аудио– и видеопотоки. Данные можно фильтровать, обрабатывать, вызывая окна («активности») и пр.
Ресурсы диалоговых форм для Android разрабатываются на базе XML
   Интересная особенность платформы – две графические подсистемы на базе браузера и с использованием OpenGL. Разработчикам не придется переучиваться на новую оконную среду, и процесс разработки больше похож на создание динамических Web-страниц. Хотелось бы лучшей интеграции ресурсов форм и исходных текстов, в идеале что-то вроде среды Delphi. Но это дело наживное, да и больших проблем не возникает, тем более что при малых размерах экрана больше усилий тратится не на кодирование форм, а на разработку удобного интерфейса как такового.
   В частности, если посмотреть на наш пример, то стоило бы удалить кнопки и добавить вместо них пункты меню – для мобильного телефона это более привычная система управления. А вот для сенсорного экрана экранные кнопки удобнее.
...
   Архив с файлами программы можно найти по адресу на http://uri2dec.sf.net/samples/android-sample-inventory.zip.
   Сетевая подсистема Android обеспечивает, помимо механизма Intent, привычные сетевые библиотеки Java, а также парсер XML. В одном из реальных проектов я использовал пакет kSOAP, так как SDK не содержит в себе стандартных RPC-функций. Поскольку ОС Android не позволяет процессам «зависать», удаленные вызовы лучше выполнять асинхронно в отдельных потоках.
   Реализована возможность разработки «демонов» – программ, выполняющихся только в фоновом режиме. В Android они тоже разрабатываются на Java, и с их помощью можно периодически отсылать, например, координаты ребенка на телефон родителя и по сигналу от родителя задействовать камеру.
Разработка для Android
   Попробуем создать небольшую программу для Android. Она будет действительно маленькая – строк двести. Задача: хранение инвентарных номеров в базе данных устройства (реализована на базе SQLite). Это довольно обширный класс задач, – скажем, наш пример можно впоследствии взять за основу при создании системы хранения номеров для кодовых замков, коммунальных служб или чего-то подобного.
   Несмотря на компактность, данный пример позволяет продемонстрировать возможности Android по обработке довольно сложных наборов данных, а главное, обмениваться ими между программами. Мне кажется, это интересно, так как SDK Android предлагает только один такой способ.
   Установив Android SDK и модуль для Eclipse, запускаем среду разработки. Выбираем меню File-New-Android Project. В появившемся диалоге задаем имя проекта (пусть будет inventory), папку, где будут храниться файлы проекта, имя Java-пакета (ru.icsit.inventory), имена «активности» и «приложения» (inventory, они должны быть одинаковыми). Термин «активность» (action) – фактически называет класс окна Android (поведение окна в Android отличается от того, к чему привыкли Windows-программисты). По умолчанию среда Eclipse генерирует новый проект с одной «активностью», хотя их может быть и несколько.
   Начнем с добавления класса, обеспечивающего доступ к базе данных. Берем меню File-New-Java class и в диалоге вводим имя нового класса ItemsProvider. Этот класс расширит класс провайдера данных ContentProvider. Мы используем его, чтобы предоставить другим программам доступ к нашей БД.
   Можно было бы написать класс провайдера с использованием файла или внешнего сервера для хранения данных, но, поскольку в Android входит SQLite, разумно ее и использовать. С нею удобнее работать, чем с файловым хранилищем, причем это не отражается на требованиях к памяти и скорости. Если проводить сравнение с Windows, то можно сказать, что SQLite подходит как для хранения настроек программы, так и для записи данных. Разумеется, хранить полноценную СУБД предприятия на мобильном устройстве никто не рискнет, – кроме того, как показывают некоторые эксперименты, размер одной таблицы не может превышать 40 Мбайт (хотя здесь, скорее всего, сказываются аппаратные ограничения).
   Итак, объявим вложенный объект DatabaseHelper, который поможет создать саму базу данных при первом запуске программы. Нам потребуется перекрыть два абстрактных метода. Метод onCreate вызывается, если база еще не существует, и создает таблицу оператором SQL:
...
   CREATE TABLE items (_id INTEGER PRIMARY
   KEY, invno INTEGER, description TEXT,
   qty INTEGER, location TEXT)
   Когда пользователь получит инсталляционный пакет и запустит его, нужные файлы будут созданы автоматически. Одна из особенностей SQLite – поле первичного ключа _id будет автоинкрементным. SQLite не проверяет типы данных, поэтому не имеет смысла указывать длины полей.
   Метод onUpdate вызывается, когда пользователь устанавливает обновление программы с измененной структурой таблиц (это отмечается увеличением номера версии базы данных). В примере просто уничтожим существующую таблицу и вызовем метод onCreate для создания таблицы заново. В реальной системе изменение структуры таблиц, безусловно, должно происходить без потери пользовательских данных.
Главное меню Android с пиктограммой нашей разработки
   Перейдем к классу ContentProvider. Перекроем метод ItemsProvider.onCreate, где создадим экземпляр объекта DatabaseHelper и вызовем его метод openDatabase. Другие программы могут получить доступ к нашим данным, вызывая методы query, getType, insert, delete (их тоже нужно перекрыть), которые получают в параметре url:
...
   content://ru.icsit.provider.Inventory/items
   Этот URL мы присвоим публичному члену класса CONTENT_URI_ITEMS, он будет часто использоваться и внутри нашей программы для доступа к данным. Другие приложения узнают о нем из системного манифеста.
   Таким образом, программы могут взаимодействовать с хранилищами друг друга, используя URL. Как в Web, возвращаемый ответ снабжается указанием MIME-типа данных. Фактически программу Android можно рассматривать как Web-сервер в миниатюре, функционирующей в «карманном Интернете» – операционной системе Android. По аналогии с Интернетом, где требуется зарегистрировать домен, в Android необходимо зарегистрировать «адрес», чтобы публиковать данные.
   Системный манифест – XML-файл, описывающий программу Android. Среда Eclipse создает файл манифеста AndroidManifest.xml автоматически. Но мы добавим к нему указание, что объект ItemsProvider по заданному URL предоставляет некие данные:
...
   <provider class="ItemsProvider" authorities="ru.icsit.provider.Inventory" />
   Из манифеста операционная система не только извлекает информацию о возможностях обмена данными, но и позволяет контролировать взаимодействие между программными компонентами. В SDK Android нет понятия «событие» для оповещения других приложений (как в Windows), но описанная выше техника вполне их заменяет. Получив запрос на предоставление данных, Android загрузит объект ItemsProvider, а тот обеспечит передачу нужной информации в соответствующем формате.
Диалоговое окно для создания нового проекта Android Inventory
   В нашем случае передается не текст, а специальная структура данных (курсор набора данных), значит, надо это как-то описать. В перекрываемом методе getType, в зависимости от переданного URL, вернем один из двух MIME-типов:
...
   vnd.android.cursor.item/vnd.icsit.item
   vnd.android.cursor.dir/vnd.icsit.item
   (Можно передать и картинки, тогда нужно указать, например, тип image/jpeg.) Далее, если требуется отдельная запись, то ее можно запросить, указав идентификатор прямо в URL. Если идентификатора нет, вернем курсор для всего набора данных. Создадим объект URL_MATCHER класса ContentURIParser, задача которого – определить по URL, какие данные нам требуются. Добавим два варианта —.items и items/#.
   Если URL завершается items/#, то вернем одну запись по ее идентификатору (вариант 2), иначе вернем весь набор данных (вариант 1). Перейдем к методу query. В параметре selection передается выражение SELECT за словом WHERE (мы используем SQLite, так что проблем нет. Если бы для хранения использовались файлы, этот параметр можно было бы просто игнорировать). Поскольку имеется СУБД, то можно управлять сортировкой и группировкой результатов (заблокировать такую возможность можно, если в вызове конструктора запроса не передавать эти параметры).
   Перекрытые методы insert, update, delete проверяют правильность передаваемого URL и вызывают для выполнения операций вставки, обновления и удаления одноименные методы класса SQLiteDatabase, а те возвращают количество затронутых запросом строк. Приятная особенность, которую мы можем использовать в методе update: если в результате выполнения mDB.update()записей, удовлетворяющих условию, не обнаружилось (и ничего не обновилось), то вызывается метод вставки. (Строго говоря, не совсем корректное решение, зато упростит пример.)
   Теперь перейдем к наполнению формы. Eclipse создал два файла для нашей единственной формы – inventory.java и main.xml и (уже в классе активности) добавил загрузку элементов управления по описанию в main.xml. Можно вызывать конструкторы элементов управления в коде, но это слишком трудоемко. Поэтому будем редактировать ресурс main.xml. На форму перетаскиваем элементы типа «поле ввода» для четырех полей в таблице, снабжаем их метками «Номер», «Описание», «Количество», «Размещение». Добавим также кнопки: со знаком «?» для поиска, «Схр» для сохранения изменений и одновременно для создания новой записи (для этого я и совместил insert с update в классе провайдера) и «-» для удаления записи. После ввода инвентарного номера и нажатия кнопки поиска все элементы управления заполнятся соответствующими значениями. Отредактировав их, можно сохранить изменения кнопкой «Схр».
Главное окно программы Inventory
   В качестве визуального редактора формы лучше использовать утилиту DroidDraw. Можно отредактировать main.xml и вручную, но этого лучше не делать. Тут есть тонкость: текущая версия DroidDraw несовместима с кодировкой UTF-8, а поскольку на нашей форме используется кириллица, пришлось немного подправить файл руками. Заодно автоматически создаваемые идентификаторы элементов были переименованы в более осмысленные:
...
   <Button id="@+id/bsearch" a: text="?" />
   После сохранения формы ее требуется скомпилировать. Eclipse вызывает упаковщика ресурсов SDK aapt для генерации класса R, добавляемого в проект для указания идентификаторов ресурсов. Символы @+id/ означают инструкцию «поместить идентификатор bsearch в класс R». (Идентификаторы меток были удалены, поскольку нам не требуется ссылаться на них из программы.) Идентификаторы кнопок позволят назначить им обработчики нажатий, из полей ввода необходимо извлекать значения, так что им тоже нужны идентификаторы. Для отрисовки формы Android использует встроенный браузер. В целом принципы Android вряд ли станут чем-то новым для Web-разработчиков.
При создании ПО для Android программист имеет возможность работать в привычной среде Eclipse
   Готово. Соберем все вместе в коде класса активности inventory. Перекроем метод onCreate и убедимся, что не забываем загрузить форму main.xml из ресурсов:
...
   setContentView(R.layout.main);
   В ресурсы можно добавлять не только XML-файлы, но и картинки и мультимедиа-объекты (утилита aapt назначает им идентификаторы по названию файла). Инициализируем переменные, которые будут указывать на элементы ввода текста:
...
   mEditNum = (TextView) findViewById(R.id.enumber);
   Затем создадим (пока пустые) обработчиков нажатий
...
   mButtonSearchClick, mButtonApplyClick, mButtonDeleteClick
   для всех трех кнопок. Найдем загруженную кнопку по ее идентификатору, помещенному в классе R
...
   findViewById(R.id.bsearch). setOnClickListener(mButtonSearchClick),
   и назначим обработчика событий в методе onCreate.
   Теперь остается написать код для этих трех событий. В обработчике кнопки сохранения введенные данные берутся из формы и помещаются в объект ContentValues, который затем передается по URL нужному провайдеру данных в метод update:
...
   values.put(«invno», mEditNum.getText(). toString());
   getContentResolver(). update(ItemsProvider.CONTENT_URI_ITEMS.addId(invno), values, null, null);
   Как видно, URL указывает на объект класса ItemsProvider, а кроме того, содержит идентификатор записи, так что будет вызван метод ItemsProvider.update. Можно было бы написать код доступа без класса ItemsProvider, но в данном случае мы получили возможность отделить часть программы, связанную с манипуляцией данными, от подпрограмм управления элементами ГИП. А вдобавок еще и получили возможность предоставлять данные другим программам.
   Вернемся к манифесту. Добавим в него элемент intent-filter в раздел активности inventory:
...
   <activity class=".inventory" a: label="@string/app_name">
   …
   <intent-filter a: label="Номер">
   <action a: value="android.intent.action.VIEW" />
   <action a: value="android.intent.action.EDIT" />
   <action a: value="android.intent.action.DELETE" />
   <type a: value="vnd.android.cursor.item/vnd.icsit.item" />
   </intent-filter>
   Действия VIEW, EDIT, DELETE соответствуют трем кнопкам формы. Иными словами, объявляется (это называется Intent), что класс активности inventory позволяет показывать, редактировать и удалять данные указанного типа, а другие приложения могут вызывать нашу форму для выполнения этих действий. Так обеспечивается интеграция приложений Android.
   Например, из своей программы легко можно вызвать такие модули, как android.intent.action.CALL (набирается номер, указанный в URL вида tel:<номер телефона>), android.intent.action.VIEW (демонстрация Web-страницы или географического положения; URL вида geo: latitude,longitude или http://<адрес Web-сайта>). Компоненты, к которым обращается программа, могут возвращать результаты, которые разработчик может задействовать для своих целей (простейший пример – географические координаты). Службы Android также обеспечивают уведомления о внешних событиях (поступившем сообщении или звонке), снижении заряда батареи и мощности сигнала и др. (если в манифесте указано, что это необходимо).
...
Новости. С 15 по 15
   Принтеры
   Компания Konica Minolta (www.konicaminolta.ru) объявила о выпуске монохромных принтеров pagepro 4650EN и pagepro 5650EN. Они предназначены для средних и больших рабочих групп, оборудованы новым контроллером Emperon. Скорость печати pagepro 4650EN – 34 стр./мин, pagepro 5650EN – 43 стр./мин, разрешение (обеих моделей) – 1200 точка/дюйм, максимальная плотность носителя – до 216 г/м2. Оба устройства оснащены 128-Мбайт ОЗУ. Предусматривается большое количество режимов, связанных с защитой информации. В частности, в режиме «секретной печати» пользователю придется ввести пароль. Имеется возможность прямой печати с USB-накопителей (выводятся файлы PDF, TIFF и JPEG). Принтеры совместимы с языками описания страниц PS3 и PCL6, а также форматом файлов Microsoft XPS (XML Paper Specification).
   Комплектующие
   Компания Cooler Master (www.coolermaster.ru) на выставке CeBIT’2008 анонсировала новые модели устройств. В частности, объявлено о выпуске новой серии шасси, входящей в весьма популярную серию COSMOS S. Корпус отличается оригинальным дизайном, оснащается 200-мм вентилятором, предусматривается возможность установки трех дополнительных вентиляторов, а также подключения систем жидкостного охлаждения. Блок питания смонтирован в нижней части. На верхней панели размещен оригинальный сенсорный блок управления, а также внешние порты ввода-вывода (скрытые за сдвижной крышкой). Еще одна интересная возможность – установка специальной корзины (до четырех дисков), которая может монтироваться на место 5,25-дюйм отсеков.
Чтение онлайн



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 20 21 22 23 24 25 26 27

Навигация по сайту
Реклама


Читательские рекомендации

Информация