![Платформа J2Me _17.jpg](https://litlife.club/books/121163/read/images/_17.jpg)
Рисунок 3.3. Если доступно более одного MID-лета, AMS выводит меню, показывая вам их все. AMS, а не ваше приложение, создает кнопку Launch (Запуск). Вы должны нажать на нее, чтобы запустить выбранный МЮ-лет
![Платформа J2Me _18.jpg](https://litlife.club/books/121163/read/images/_18.jpg)
Рисунок 3.4. Главное окно этого приложения содержит название и одну строчку текста
Нажмите на красную кнопку с трубкой («hang up» — «отбой») на эмуляторе и вы вернетесь в главное окно AMS. Закрыв окно эмулятора, вы завершите его работу. Теперь вы закончили полный жизненный цикл выполнения приложения. Далее в этой главе вы узнаете больше о деталях жизненного цикла MID-лета и модели состояний MID-лета.
Теперь, когда. вы изучили жизненный цикл приложения, наступило время взглянуть на исходный код простого MID-лета. Вы, возможно, уже догадались, что я собираюсь начать с показа наипростейшего MID-лета — MIDP-версии все той же злополучной программы «HelloWorld». В листинге 3.1 показан исходный код для первой версии MID-лета HelloWorld.
Листинг 3.1. Это MIDP-версия знакомой вам программы HelloWorld
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
/**
Создание программы «Hello world» в J2ME MIDP.
Обратите внимание, что класс должен быть открытым, для того чтобы программа
управления приложениями устройства могла создать его экземпляр.
*/
public class HelloWorld extends MIDlet
{
// Displayable. Этот компонент отображается на экране, private Form form;
// Display. Этот объект управляет всеми компонентами
// Displayable.
private Display display;
// Открытый конструктор no-arg необходим, даже хотя система
// вызывает startAppO! AMS вызывает конструктор
// no-arg класса для создания экземпляра класса.
// Либо создайте открытый конструктор no-arg, либо
// объявите об отсутствии конструкторов и позвольте
// компилятору создать открытый конструктор no-arg. public HelloWorldO
{
super (); I
public void destroyApp(boolean destroy)
form = null;
notifyDestroyed();
}
public void pauseAppO
}
public void startApp()
// Создайте элемент Displayable. form = new Form (."Hello, World");
// Добавьте строку в форму. String msg = "My first MIDlet!"; form.append(msg);
// Это приложение просто выводит на экран одну форму, созданную выше.
display = Display.getDisplay (this);:
display.setCurrent(form);
}
}
Во-первых, отметьте, что это приложение описывает класс, называемый HelloWorld, который дополняет javax.microedition.midlet.MIDlet. Все MID-леты должны дополнять этот класс.
Класс HelloWorld является основным классом вашего приложения. По этой причине он должен быть объявлен открытым (public). Более того, вы должны объявить открытый безаргументный (no-argument) конструктор или убедиться, что конструкторов нет, в этом случае компилятор определит безаргументный конструктор для вас. Те читатели, которые знакомы с апплетами Java, найдут сходство между моделями управления жизненным циклом апплета и MID-лета.
Когда вы выберете HelloWorld в главном окне AMS, AMS запустит ваше приложение и создаст экземпляр класса HelloWorld. Технически она запустит виртуальную машину (или убедится, что она запущена) и проинструктирует ее создать экземпляр вашего класса. В этом случае виртуальная машина называется безаргументным конструктором.
AMS затем вызовет метод startAppO. В листинге 3.1 методы startApp(), pauseApp() и destroyApp() подменяют абстрактные объявления класса MIDlet. Обратите внимание на то, что все кода инициализации входят в метод startApp (), а не в конструктор. Вы, естественно, можете добавить какой-либо код инициализации в ваш конструктор, он будет выполнен перед вызовом startApp(). Однако метод startApp() всегда вызывается в качестве входной точки вашего MID-лета.
А как насчет метода main ()? Определение языка Java требует, чтобы все приложения на Java имели метод main () со следующей сигнатурой:
public static void main(String [] args)
Если приложения на J2ME являются настоящими приложениями Java, а это требование я оговаривал ранее, тогда где-то должен быть главный метод, который является реальной точкой входа, используемой виртуальной машиной для запуска процесса выполнения приложения. В действительности существует такой метод. Это часть реализации MIDP (не приложения), и, обычно, программное обеспечение AMS вызывает его. Программа AMS обрабатывает запросы вызова приложения, например, порождая подпроцесс нити запроса запуска каждого MID-лета и контролируя MID-лет из этой нити. Реальные детали зависят от продукта. В J2ME Wireless Toolkit компании «Sun» класс com.sun.midp.Main определяет метод main().
Метод startApp() создает объект, называемый формой, и пересылает в конструктор строку, которая представляет из себя название формы. Форма — это экземпляр класса javax.microedition.lcdui.Form, который является разновидностью экрана, отображаемого на вашем дисплее. Она имеет такое название, поскольку ее функции в чем-то сходны с функциями формы HTML — она содержит один или более визуальных элементов, таких как строки.
Затем метод startApp() создает стандартный объект String и добавляет его в форму. Он затем получает ссылку на объект, называемый display, и устанавливает объект формы в качестве текущего отображаемого на дисплее объекта.
Когда этот код выполняется, вы видите экран, изображенный на рисунке 3.4. Когда вы нажимаете на кнопку с телефонной трубкой, которая сообщает устройству об отключении, AMS вызывает destroyApp(), который просто устраняет все ссылки на объект формы, созданные перед этим. Теперь наступает время сборки мусора. Затем AMS закрывает MID-лет.
Вы отвечаете за правильное расположение объектов, созданных вашими МЮ-летами. В случае с данным примером не должно иметь значения, задали ли вы то, что ссылки на формы изменяются до нуля, поскольку MID-лет был закрыт. Но, в общем, вам необходимо правильно управлять ссылками на объекты вашей программы, как и в любой программе Java.
MID-леты переходят к различным состояниям в течение их жизненного цикла. Спецификация MIDP определяет модель перехода из режима в режим. В таблице 3.1 перечислены возможные состояния MID-лета и их соответствующие описания.
Таблица 3.1. Состояния MID-лета
Название состояния MID-лета — Описание
Paused (Приостановлен) — MID-лет не выполняется. Он не может начать работу до тех пор, пока не перейдет в активное состояние.
Active (Активен) — MID-лет либо готов к запуску, либо запущен. Процесс, который управляет MID-летом, может не быть в запущенном состоянии, но MID-лет все равно активен.
Destroyed (Прерван) — MID-лет не запущен и уже не может переходить в другие состояния.