Когда комплект мидлета установлен
на устройство, его классы, файлы ресурсов, атрибуты и постоянное хранилище хранятся
на устройстве и готовы к применению. Мидлет(ы) доступны пользователю через ПО
управления приложениями устройства.
Когда мидлет запущен, создается экземпляр основного класса мидлета с использованием
его конструктора без параметров. Методы мидлета вызываются в зависимости от
смены его состояний. Кроме того, мидлет может запросить изменение своего состояния
или уведомить ПО управления приложениями о изменении своего состояния.
Когда мидлет завершен или прерван ПО управления приложениями, он уничтожается
с освобождением всех ресурсов, включая объекты и классы мидлета.
Мидлет в жизненном цикле приложения может находиться в одном из трех возможных
состояний: активный, приостановленный или уничтоженный.
Активное состояние (active) означает, что мидлет запущен. Мидлет переходит в
это состояние, когда вызван метод startApp(). Метод public static void main()
может отстутсвовать, более того, он будет проигнорирован при запуске приложения.
В приостановленном состоянии (paused) ресурсы, захваченные мидлетом, освобождаются,
но он готов к активизации. Мидлет попадает в это состояние:
• Непосредственно после создания с помощью new. Вызван конструктор без параметров
и он завершился без возбуждения исключений. Как правило, на этом этапе производится
минимум инициализации. Если произошло исключение, приложение немедленно переходит
в состояние destroyed.
• Из состояния active после успешного завершения работы метода MIDlet.pauseApp().
Этот метод может быть вызван ПО управления приложениями.
• Из состояния active после успешного завершения работы метода MIDlet.notifyPaused().
• Из состояния active, если произошло возбуждение исключения MIDletStateChangeException
при вызове метода MIDlet.startApp().
В состоянии уничтоженного (destroyed) мидлет полностью завершил работу, освободил
все ресурсы и ожидает сборщик мусора. Переход в это состояние происходит в следующих
случаях:
• Метод MIDlet.destroyApp() завершил работу. В этом методе следует освободить
все захваченные ресурсы. Этот метод может быть вызван ПО управления приложениями.
• Метод MIDlet.notifyDestroyed() успешно завершился. Мидлет должен выполнить
аналог метода MIDlet.destroyApp() перед вызовом MIDlet.notifyDestroyed().
Типичная последовательность состояний
мидлета:
1. ПО управления приложениями создает новый экземпляр мидлета. Вызывается конструктор
мидлета по умолчанию (без параметров). Мидлет находится в состоянии paused.
2. ПО управления приложениями принимает решение о запуске мидлета и вызывает
метод MIDlet.startApp() для перевода его в состояние active. Мидлет захватывает
необходимые ресурсы и начинает выполнение своих задач.
3. ПО управления приложениями больше не имеет необходимости в исполнении мидлета
и сигнализирует об этом вызовом метода MIDlet.pauseApp(). Мидлет прекращает
выполнение задач, может освободить часть ресурсов.
4. ПО управления приложениями трубуется завершить работу мидлета, оно сигнализирует
об этом вызовом метода MIDlet.destroyApp(). Если необходимо, мидлет сохраняет
некоторые данные о своем текущем состоянии и освобождает ресурсы.
Состояния мидлета и их взаимодействие отображены на рисунке:
Пример мидлета:
import javax.microedition.midlet.MIDlet;//импортирование
классов
import javax.microedition.lcdui.Command;//и интерфейсов,
import javax.microedition.lcdui.CommandListener;//применяемых в программе
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
public class HelloWorld extends MIDlet
implements CommandListener
{//Основной класс HelloWorld наследуется от класса MIDlet.
//Все мидлеты наследуют этот класс.
//Также этот класс реализует
интерфейс CommandListener
//для обработки событий
private Form form;
public HelloWorld()//Конструктор основного класса
{
form = new Form("Test App");//Создание формы
form.append("My first midlet.");//и ее инициализация
form.addCommand( new Command( "Exit", Command.EXIT, 1 ) );// Добавить
кнопку "Exit"
form.setCommandListener( this );// Зарегистрировать этот объект, как обработчик
событий
}
public void startApp()
{
Display display = Display.getDisplay(this);//Получить доступ к экрану
display.setCurrent( form );//и отобразить форму
}
public void pauseApp() { } public void
destroyApp(boolean unconditional)
{
form = null;//Освобождение ссылки на форму
}
public void commandAction(Command c,
Displayable d)
{
destroyApp(true);
notifyDestroyed();
}
}