пользователей установить на существующие аппараты новый браузер тоже сложно. Сценарий «предложить новый телефон с новым браузером» (с возможностью просмотра мобильной рекламы), видимо, показался компании 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

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату