MIDlet модель Java приложения

В этой статье речь пойдет о J2ME MIDlet-ах.MIDlet – это разновидность MIDP (Mobile Information Device Profile) Java приложения, предназначенное для работы на различных мобильных устройствах.

Особенностью програмной модели MIDlet-а является возможность вмешательства операционной системы в ход выполнения программы. То есть работа вашего приложения может быть прервана в любой момент каким-нибудь внешним событием, например входящим телефонным звонком.  Это обстоятельство требует постоянного контроля системы над ходом выполнения программы. Реализуется этот контроль с помощью специального, встроееного в телефон управляющего софта, называемого AMS (Application-Management Software) - программа управления приложениями.  Вообще, AMS контролирует весь жизненный цикл приложения: от установки и обновления до удаления програмного обеспечения.

Жизненый цикл MIDlet-а

Если вы уже программировали на Java, то знаете, что в каждой программе должен присутствовать метод main(), с запуска которого и начинается ее работа. Однако, поскольку MIDlet это не простое Java приложение, Вам не придется писать этот метод. Он уже реализован и входит в пакет javax.microedition.midlet.MIDlet.   Вместо него предлагается использовать три других, необходимых для работы MIDlet приложения, метода: startApp(), pauseApp() и destroyApp().

Запущенное MIDlet приложение может находиться в трех возможных состояниях:

  • paused: MIDlet запущен, но не активен.
  • active: MIDlet активен.
  • destroyed:  MIDlet   был  остановлен, и  он   готов  к  запуску уборщика мусора.

Рассмотрим  жизненный цикл MIDlet-а. AMS запускает его в  ответ  на  команду пользователя. На практике это обычно выглядит как выбор пользователем одного из установленных на телефоне приложений.

Первоначально, MIDlet находится в соостоянии paused. Прежде чем перейти в активный режим, он должен выполнить инициализацию. MIDlet  не имеет  специального инициализационного метода, Поэтому все необходимые для нее действия выполняются внутри startApp().  Таким образом, через некоторое время после созданияя, AMS активизирует MIDlet и вызывает  метод  startApp()., который создает   и   выводит    на   экран пользовательский   интерфейс  приложения. MIDlet переходит из состояния  paused в active. При запуске возникли какие-нибудь ошибки, управление  передается методу javax.microedition.midlet.MIDletStateChangeException,  который непостредственно переключает MIDlet в состояние destroyed.

Если произошла  деактивация и переход в  состояние paused, MIDlet не  уничтожается, однако  он должен  освободить как можно больше системных  ресурсов. Если  деактивация явилась  результатом работы AMS,  вызывается метод  pauseApp(). Если  MIDlet деактивирует сам
себя,  то есть пользователь завершает работу приложения, то  pauseApp() не вызывается.

Уничтожение  происходит   когда  MIDlet  переходит   в  состояние destroyed. Если причиной послужила работа AMS, то вызывается  метод  destroyApp().  Метод имеет необязательный параметр  типа boolean, который определяет является ли уничтожение безусловным или необязательным. Если MIDlet уничтожает сам себя, destroyApp() не вызывается.

Ниже приведен код каркаса MIDlet-a.

import javax.microedition.midlet.*;
 
publicclass BasicMIDletextends MIDlet{
public BasicMIDlet(){
// Конструктор
}
 
protected void destroyApp( boolean unconditional)
throws MIDletStateChangeException{
// Вызывается когда система уничтожает MIDlet
}
 
protected void pauseApp(){
// Вызывается при переводе приложения в режим паузы.
}
 
protected void startApp()
throws MIDletStateChangeException{
// Вызывается, когда приложение переводится в активный режим.
}
}


 Контекст MIDlet-а


Класс java.microedition.midlet.MIDlet  определяет методы, которые позволяют  MIDlet-у взаимодействовать  с операциональным контекстом:getAppProperty()  возвращает значения  инициализационных свойств;resumeRequest()просит AMS  реактивировать MIDlet;notifyPaused() переводит MIDlet в  состояние paused;notifyDestroyed() переводит MIDlet в состояние destroyed.

Для правильного управления ресурсами, телефону необходима некторая инициализационная   информация о приложении. Она должна быть представлена в дескрипторе приложения (application  descriptor текстовый файл с расширением jad) или  его  манифесте (файл Manifest.MF). Метод  getAppProperty(), позволяет получить доступ к этой информации, причем сначала опрашивается дескриптор, и если информация не найдена, просматривается манифест. (MIDP  2.0  использует  концепцию доверенных    (trusted)   приложений,    согласно   которой    метод getAppProparty() ищет только манифест).

Остальные  методы  прямо   затрагивают  жизненый  цикл  MIDlet-а. Переведенный в  режим паузы MIDlet вызывает метод resumeRequest() для  реактивации. Активный  MIDlet  вызывает  notifyPaused(), чтобы деактивироваться.  Активный  или  находящийся  в  состоянии паузы
MIDlet вызывает метод notifyDestroyed() для самоуничтожения. Помните, что resumeRequest() просто просит  AMS реактивировать MIDlet; ASM решает  надо ли  это делать и если надо, то когда.  Реактивация вызывает метод startApp().    Матоды    notifyPaused()    и    notifyDestroyed()
непосредственно осуществляют перевод  MIDlet-а в новое состояние; как следствие ни pauseApp() ни destroyApp не вызываются.

Ниже приведен более полный код каркаса MIDlet-а.

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
 
publicclass BetterMIDletextends MIDlet{
 
private Display display;
 
public BetterMIDlet(){
}
 
protected void destroyApp( boolean unconditional)
throws MIDletStateChangeException{
exitApp();// вызывает уборщик мусора
}
 
protected void pauseApp(){
// Сюда следует добавить код, который надо выполнять непосредственно
// перед переводом приложения в режим паузы.
}
 
protected void startApp()
throws MIDletStateChangeException{
if( display==null){
initApp();// Определяет первоначальную инициализацию
}
// Сюда следует добавить код, который надо выполнять непосредственно
// перед переводом приложения в активный режим.
}
 
private void initApp(){
display= Display.getDisplay( this);
// Сюда добавляется код инициализации приложения
}
 
public void exitApp(){
// добавит код "уборки мусора"
notifyDestroyed();// уничтожение MIDlet-а
}
}
 
 
 


terMidlet определяет  initApp() - метод для первой инициализации и exitApp() - метод для централизованного освобождения ресурсов.

 удобства восприяния, все методы объединены в таблицу:


 

Методы, которые вызываются при изменении состояния MIDlet-а
startApp() Переводит приложение в активное состояние.
pauseApp() Переводит приложение в состояние паузы.
destroyApp() Завершает работу приложения.
Методы управления состоянием MIDlet-а.
notifyDestroyed() Запрос на завершение работы.
notifyPaused() Запрос на дезактивацию и переход в состояние паузы.
resumeRequest() Запрос на реактивацию и переход в активное состояние.


Более подробную информацию о MIDP вообще, и програмной модели MIDlet-ов в частности, можно найти в книге Варатана Пирумяна "Платформа программирования J2ME для портативных устройств".



Статья написана по мотивам "Understanding J2ME Application Models" by Eric Giguere. Автор: Arix




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна