Е. Буткевич Пишем программы и игры



страница2/15
Дата22.06.2019
Размер2.79 Mb.
ТипКраткое содержание
1   2   3   4   5   6   7   8   9   ...   15
Глава 2

Hello, World!

В этой главе мы рассмотрим структуру программы для мобильного телефона, а также все этапы ее создания и загрузки в телефон. Будем считать, что все необ­ходимые провода уже приобретены и подключены к телефону, который поддер­живает платформу J2ME, а соответствующее программное обеспечение успешно установлено на вашем компьютере.

Для создания полноценного мобильного приложения нам придется выполнить следующие этапы разработки:


  • написание кода (текста) программы на языке J2ME;

  • компилирование программы;

  • тестирование приложения на эмуляторах;

  • упаковка приложения в jar-архив;

  • загрузка приложения в мобильный телефон.

Не будем спешить и для начала выясним, что же представляет собой приложение для мобильного телефона и что у него внутри.

Класс MIDIet

Поскольку Java 2 Micro Edition поддерживает большое количество разных уст­ройств, то существуют различные конфигурации этой платформы. Не вдаваясь в подробности, мы будем использовать конфигурацию CDLC (Connected Limited Device Configuration), расширенную профайлом MIDP (Mobile Information Device Profile), который обеспечивает необходимую функциональность для программи­рования под мобильные телефоны, пользовательский интерфейс, постоянное хра­нение данных, таймеры, средства сетевой связи. Мидлет (MIDIet) — это и есть приложение Java, которое использует профайл MIDP и конфигурацию CLDC.

Название «мидлет» происходит от имени ос новного класса мобильного прило­жения javax.microediti on. mi dlet. MIDIet. Основной класс приложения должен быть унаследован от абстрактного класса MIDIet и должен реализовывать методы startAppC), pauseApp() и destroyApp( boolean). К сожалению, основы объектно-ори­ентированных языков остаются за рамками этой книги, поэтому те, кто считает, что ООП — это Организация Освобождения Палестины, могут на этом этапе почитать дополнительную литературу. Особо нетерпеливые могут сразу перей­ти к водным процедурам и подхватывать идеологию и терминологию языка на ходу, аккуратно разбирая приведенные в дальнейшем примеры программ.

24 Глава 2. Hello, World!

Реализация MIDP дает программисту много возможностей и большую свободу действий, однако и эти возможности не безграничны, поэтому начнем с ложки дегтя — той головы, выше которой не прыгнуть в классической реализации язы­ка. MIDP не поддерживает системного программирования, не дает доступа к сис­темным функциям устройства и самой исполняющей системе. В компетенцию МГОР не входит управление пользовательскими приложениями и обеспечение средств для загрузки, хранения или запуска приложений.

При запуске загруженного в телефон приложения события развиваются следу­ющим образом. Управляющая система создает экземпляр основного класса, на­следованного от класса MIDI et, используя конструктор без аргументов, доставшийся в наследство от базового класса. Приложение переходит в состояние PAUSED, после чего система вызывает метод start App(), который и будет являться для нас точкой входа в программу. «А как же main O?», — спросят опытные Java-программисты. Метода main О мы не видим, но он есть! Это часть реализации МШ Р-профайла, и программное обеспечение телефона вызывает его без нашего ведома.

После вызова метода startAppC) приложение переходит в состояние ACTIVE, захва­тывает необходимые ресурсы и начинает заниматься своими делами. Приложе­ние выполняется до тех пор, пока система не переведет его в одно из состояний — PAUSED или DESTROYED. Три упомянутых состояния и составляют жизненный цикл приложения. Остановимся на каждом из них.


  • ACTIVE — активное состояние. Приложение готово к запуску или уже вы­
    полняется. Система может приостановить выполнение приложения, выз­
    вав метод pauseAppO, или совсем прервать выполнение с помощью метода
    destroyApp(boolean).

  • PAUSE — приостановленное состояние. Приложение прекращает выполнение
    задач и освобождает часть ресурсов. Выполнение приложения может быть во­
    зобновлено системой с помощью метода startAppC) или полностью остановле­
    но методом destroyApp(boolean).

  • DESTROYED — прерванное состояние. Приложение остановлено и уже не может
    перейти в другие состояния. Все используемые ресурсы освобождаются.

«Жизненный цикл» приложения может быть представлен схемой, показанной на рис. 2.1.

Система управляет сменой состояний приложения с помощью абстрактных ме­тодов класса MIDlet, обязательных к реализации. Кроме того, класс MIDIet предо­ставляет нам еще несколько методов для контроля над состоянием приложения и получения информации о нем:



  • abstract void startAppC) — вызывается системой при переходе мидлета в активное
    состояние. Метод может быть вызван только из приостановленного состояния;

  • abstract void pauseApp() — вызывается системой при переходе мидлета в при­
    остановленное состояние. Приложение должно освободить совместно исполь­
    зуемые ресурсы;

  • abstract voiddestroyApp( boolean unconditional) — вызывается при переходе мид­
    лета в прерванное состояние. Приложение должно освободить все ресурсы
    и сохранить все необходимые данные в постоянном хранилище. Если аргумент
    unconditiona1 задает значение true, то приложение будет прервано в любом слу-

Создание мидлета

25


чае. Если передан аргумент fa I se, то система может отказаться переводить при­ложение в прерванное состояние и сформировать исключениеMI DIetStateChange Exception;





new О


destroyAppO




Рис. 2.1. «Жизненный цикл» приложения

void resumeRequest() — используется для оповещения системы о желании прило­жения перейти в активное состояние, когда система будет готова перевести мид-лет в активное состояние, она сама вызовет метод startApp(). Метод resumeRequest () вызывается приложением в приостановленном состоянии, в котором поддер­живается обработка таймера;

voidnotifyPaused() —приложение информирует систему о переходе в приоста­новленное состояние. Метод не будет иметь эффекта, если приложение еще не запущено или уже прервано;

voidnotifyDestroyed() — мидлет информирует систему о переходе в прерванное состояние. С этого момента система будет считать все ресурсы свободными;

StringgetAppProperty(Stringkey) —возвращает параметр приложения, хранящийся в файле описателя мидлета, в виде строки. Аргумент key задает имя необходимо­го параметра. Если запрашиваемый параметр не задан, то возвращается значе­ние nul 1. Имена параметров мы рассмотрим позже вместе со структурой файла описателя.

Создание мидлета

Итак, для создания мидлета остановимся на одном из перечисленных в первой главе средств разработки J2ME Wireless Toolkit (WTK), с помощью которого реализованы все приведенные в этой книге примеры. После установки Wireless Toolkit запускаем его основную утилиту KToolbar. Доступные после запуска дей­ствия — это NewProject (Новый проект) и OpenProject (Открыть проект). Можно



26

Глава 2. Hello, World!



открыть демонстрационные проекты и на готовых примерах рассмотреть воз­можности и особенности языка, но мы создадим новый проект и назовем его MyFirstMidlet. Так же назовем и основной класс мидлета (MIDlet Class Name) в окне создания нового проекта (рис. 2.2).





4 new project or open an existing one







New Project
У £i






Osete PffteeT j '■ &

JMyFirstMidlet

MIDlet Class Name JMyFirstMidlet



Рис. 2.2. Окно создания нового проекта

После нажатия кнопки Create Project (Создать проект) появится диалоговое окно ввода информации для файла — описателя приложения (рис. 2.3). Диалоговое окно состоит из нескольких вкладок, первая из которых — Required (Обязательные) — содержит обязательные атрибуты файла-описателя:



■ MIDlet-Jar-Size — размер jar-файла в байтах. Обратите внимание, что данный атрибут прописывается в файле описателя автоматически средствами WTK при упаковке проекта. Будьте аккуратны при ручном редактировании jar-ар­хива: несовпадение заявленного и реального размеров jar-файла послужит при­чиной ошибки при загрузке приложения в телефон;

;§JSettings for project "MyFirstMidtet"










[ MIDlet-Jar-Size

■i 00

MIDIet-Jar-URL

l^,fltS.1Mli:t;t Щ

1 MIDIet-Name

JMyFirstMidiet

IMCW-Venda

IVooftanSofl

MIDIet-yersion

|1.O

rticroEdition-Configuration

JCLDCT F

1 h *'■ ■ ^ fc-i ■ ■ i^^n^

IMIDP-1.0

! ■ .<■■..

' * * ' * \У-1 ,■*

:; ■ :

> .^','■■<■■■ ' :

;■ h-:: :-■■■■■- ■ ;. . ■■ ' ■ ■'".■'.■ ..-:. ' .. ■ ■ ■ ■ :'" ■







Рис. 2.З. Определение обязательных атрибутов приложения


Создание мидлета 27

  • MIDlet-Jar-URL — сетевой адрес и название jar-файл а. В нашем случае это поле
    содержит лишь имя jar-файла;

  • MIDlet-Name — имя мидлета (или комплекта мидлетов), которое будет показа­
    но пользователю в меню запуска приложения;

  • MIDlet-Vendor — разработчик приложения (организация или частное лицо);

  • MI DLet-Version — версия мидлета в формате ..; может
    быть использована при установке и обновлении приложения;

  • MicroEdition-Configuration — требуемая конфигурация J2ME для выполнения
    мидлета. В рамках нашей книги используется конфигурация CDLC-1.0;

  • Mi cro Edition-ProfiLe — требуемый профайл J2ME для выполнения мидлета. Здесь
    мы рассматриваем работу с профайлом MIDP-1.0.

Поля ввода значений необязательных атрибутов расположены на вкладке Optional (Факультативные):

  • MI Dlet- Data -Si ze — минимальное количество байт данных для постоянного хра­
    нения, требуемое мидлетом. Значение поля по умолчанию — ноль;

  • MIDlet-Delete-Confirm -определяет, должна ли система запрашивать подтверж­
    дение пользователя при удалении приложения из устройства;

  • MI Dlet-Description — описание мидлета или набора мидлетов;

  • MIDlet-Icon — имя графического файла .png в jar-архиве, который будет исполь­
    зован системой для данного мидлета в меню запуска приложений;

  • MIDlet-Info-URL — сетевой адрес с описанием приложения или информацией
    о разработчике;

  • MIDlet-Install- Notify — указывает, должна ли система уведомлять пользователя
    перед установкой нового мидлета.

Разработчик также имеет возможность определить собственные атрибуты прило­жения на вкладке User Defined (Определенные пользователем). Имена атрибутов не должны начинаться с префикса MIDlet- и могут быть получены во время вы­полнения приложения с помощью метода getAppProperty( String key) класса MIDIet.

После того как все необходимые атрибуты указаны, нажимаем кнопку ОК и полу­чаем сообщение о том, что проект был успешно создан. Разберемся, что в данный момент произошло. Для этого перейдем в папку, где установлен Wireless Toolkit. В каталоге проектов apps появилась новая папка с именем нашего проекта MyFirstMidlet. В корневом каталоге нашего проекта были автоматически созданы еще несколько папок. Рассмотрим их назначение:



  • /bin — папка для хранения файлов приложения: jar-архив приложения, файл
    описателя приложения .jad и файл манифеста MANIFEST.MF. Автоматически соз­
    данные файлы MyFirstMidlet.jad и MANIFEST.MF содержат указанные при созда­
    нии проекта атрибуты;

  • /res — файлы ресурсов, используемые приложением во время выполнения.
    Файлы могут содержать текстовые или бинарные данные, картинки в формате
    PNG (Portable Network Graphics);

  • /src — исходные файлы приложения, содержащие собственно код программы.
    Файлы должны иметь расширение .Java.

28 Глава 2. Hello, World!

Пришло время перейти непосредственно к программированию, уверен, что вам уже надоело читать это скучное введение и уже не терпится перейти со своим телефоном «на ты». К сожалению, среда Wireless Toolkit не содержит текстового редактора, поэтому нам потребуется любой другой редактор, на худой конец обыч­ный блокнот. Достаточно простые и удобные в обращении, с моей точки зрения, такие редакторы, как UltraEdit или EditPlus, хотя опять же это дело вкуса, дан­ный вопрос не принципиален, можете пользоваться и блокнотом.



Импорт классов и пакетов

Начнем с того, что классы, предоставляемые нам реализацией J2ME, объединены в пакеты, представляющие группу классов определенной тематики. Для компи­лятора имя класса составляют название класса и полное название пакета, где он содержится. Такое имя может быть достаточно длинным, поэтому можно импор­тировать класс с помощью оператора import, а в дальнейшем пользоваться лишь названием класса. Синтаксис оператора import достаточно простой: import <имя пакета>. <имя класса>:

Таких операторов может быть сколько угодно. Они должны располагаться в са­мом начале программы. Существует возможность импортировать сразу все клас­сы, содержащиеся в пакете. Для этого в операторе import вместо определенного имени класса следует указать символ *:

import <имя пакета>.*

Для знатоков языка C++ и основ объектно-ориентированного программирования отметим, что import не является аналогом директивы include языка С, поскольку никакие файлы во время импорта не подключаются. Реализация J2ME, которую мы рассматриваем, включает в себя следующие пакеты, классы которых мы бу­дем рассматривать подробно на протяжении всей книги:


  • Java .iо — классы работы с потоками ввода и вывода данных;

  • Java.1ang — классы типов данных языка J2ME, а также некоторые системные
    классы;

  • Java ,'utii — классы дополнительных утилит, реализующие структуры данных,
    а также работу со временем;

  • javax,microedition. io — классы, обеспечивающие сетевые соединения;

я javax.microedition.Icdui — классы пользовательского интерфейса профайла MIDP;

  • javax.microedition.mi dlet — содержит единственный класс MI DIet, являющий­
    ся основным классом мобильного приложения;

  • javax.mi croedi tion. rms — классы поддержки долговременного хранения данных.

Итак, первой строчкой нашей программы мы импортируем основной класс мо­бильного приложения:

import javax.microedition.mi diet.MIDIet:

Далее реализуем свой собственный класс MyFirstMidlet, расширяющий класс MIDI et. Как уже говорилось, обязательны к реализации три абстрактных метода класса

Компиляция и запуск мидлета 29

MIDiet. Они могут быть и пустыми, но присутствовать в нашем классе обязаны. В методе startAppO получим атрибут имени приложения с помощью метода getAppProperty(Stringkey) класса MIDIet и отобразим его области системных сооб­щений вместе с сакраментальным «Hello, World!».

Область системных сообщений доступна нам с помощью поля out системного клас­са System. Поле out является потоком вывода системной информации и поддержи­вает вывод данных всех примитивных типов, а также строковых данных в область системных сообщений с помощью методов print и println, которые различаются лишь форматом вывода. Кроме этого, класс System содержит поле err, являюще­еся потоком для вывода сообщений об ошибках, а также несколько методов для доступа к системной информации. Как оформляются комментарии, вы без труда догадаетесь сами. Таким образом, весь код нашей программы будет выглядеть следующим образом:

import javax.microedition.midlet.MIDlet: public class MyFirstMidlet extends MIDlet

(

public void pauseAppO {



}

public void destroyApp(boolean unconditional) {

// уведомить систему о завершении

notifyDestroyedO;

}

public void startAppO {

// получить строку атрибута имени мидлета String name - getAppPropertyC'MIDlet-Name"); // вывести сообщение в системную область System.out.printlnC'MIDlet "+ name + " says: Hello. World!"): 1 I

Обратим внимание на то, что мы не импортировали классы String и System из па­кета Java. Iang, но без особых проблем используем их в нашей программе. Все вер­но. Дело в том, что пакет java. 1ang просматривается компилятором всегда и в им­порте не нуждается.



Компиляция и запуск мидлета

После того как весь код нашего первого приложения написан, сохраним получив­шийся файл в папке исходных файлов приложения /src с именем MyfirstMidlet.java. Заметим, что имя файла должно полностью совпадать с именем основного класса приложения, иначе компилятор выдаст следующую ошибку: Class MyFirstMidlet is public, should be declared in a file named MyFirstMidlet.java.



30

Глава 2. Hello, World !



Половина дела сделана, хотя пока что написанная программа является не более, чем простым текстом, который теперь нужно преобразовать в настоящее мобиль­ное приложение. Этим вопросом занимается компилятор — специальная програм­ма, переводящая написанный нами текст в машинные команды, понимаемые уст­ройством.

Для того чтобы откомпилировать наше приложение, следует выбрать команду Build (Компилировать) на панели управления главного окна KToolbar. В основном окне утилиты KToolbar мы увидим результат компиляции — количество ошибок в про­грамме, местонахождение и описание каждой из них. Если все в порядке, то ото­бразится сообщение о том, что компиляция прошла успешно (рис. 2.4).



Щ32МЕ Wireless Toolkit -MyFirstMWIet

■■: ^л--,.. v . ■ ■ ■ щ^




File: Edit Project Heip ' :




i -Фе New Project... Ш Open Pr^eci ■ 1; ^.SetUrrfu ,;. ^' BuU










>:-Duvibe. |D*fautttjrayPhQne .T |"л r\-.^;







Project settings saved Building "MyFirstHidlet"

Build complete



Рис. 2.4. Сообщение об успешном завершении компиляции

На этом этапе в папке нашего проекта было создано еще несколько директорий, в одну из которых, /classes, и было помещено откомпилированное приложение, представленное файлом MyFirstMidlet.class.

Сгенерированный компилятором файл уже является программой, готовой к ис­полнению на эмуляторе телефона. Чтобы запустить написанное нами приложе­ние, в списке Device (Аппарат) панели управления утилиты KToolbar нужно выб­рать один из стандартных или установленных нами эмуляторов. Эмулятор вместе с созданным нами приложением запускается с помощью команды Run (Запустить) панели управления. По умолчанию приложение запустится в эмуляторе с много­обещающим названием «DefaultGrayPhone».

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







'{ Devkia; JDetaultGreyPhone

Т 1 < ■•••:■> ^ > . ■

HIDlet MyrirstMidlet says: Hello, World!

Рис. 2.5. Результат работы программы «Hello World!»

Упаковка мидлета 31

После закрытия эмулятора в область.системных сообщений выводится разнооб­разная статистика. Оставим пока ее в покое, так как пользы сейчас нам от нее никакой.



Упаковка мидлета

Заключительным этапом создания полноценного мобильного приложения, гото­вого для загрузки в телефон, является упаковка созданных файлов в jar-архив, который уже пригоден для загрузки в мобильный телефон. Для упаковки прило­жения следует выбрать в меню Project (Проект) утилиты KToolbar команду Create Package (Создать архив).

После упаковки в папке /bin нашего приложения появился файл MyfirstMidlet.jar. Это и есть нужный нам jar-архив. Современные архиваторы типа Win ZIP или WinRAI^ поддерживают этот формат и позволяют нам заглянуть внутрь сформи­рованного архива. Ничего нового там мы не увидим, только все тот же файл MyFirstMidlet.class и файл манифеста в папке META-INF. В таком виде приложение уже готово к загрузке в телефон с помощью средств, рассмотренных в предыду­щей главе. Особого смысла загружать наше приложение в телефон нет, посколь­ку никакой реакции аппарата мы не увидим, так что отложите эту процедуру до следующей главы.

На этом процесс создания мобильного приложения завершен. Мы рассмотрели все этапы, от написания текста программы до тестирования приложения на эму­ляторе, упаковки и загрузки в телефон. Все эти этапы, кроме написания текста, мы проделали с помощью среды разработки J2ME Wireless Toolkit.

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

* * *

Итак, если у вас все получилось, то самое трудное уже позади. В программирова­нии, как и в любом деле, главное — начать, а дальше будет только легче. Не реко­мендую продолжать чтение книги, не выполнив первого задания, хотя это ваше личное дело. В дальнейшем вас ждет еще масса интересных примеров с их под­робным описанием. Не лишайте себя удовольствия, учитесь на чужих ошибках.




Каталог: Техника -> Информационные%20технологии
Информационные%20технологии -> Методические рекомендации по построению систем защиты узлов интернет 1 требования к системе защиты узла интернет 2
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации
Техника -> Ремонт китайских телефонов
Техника -> Для профилактики и лечения насморка Зачем промывать нос во время насморка?
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации


Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9   ...   15


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница