Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

Мобильная Java: Статьиjavax.microedition.midlet

javax.microedition.midlet

Mobile Information Device Profile не имеет сходства с Applet моделью введенной в J2SE. MIDP вводит новую модель, которая построена на CLDC и позволяет множеству Java приложениям запускаться конкурентно на KVM и разделять данные.

Итак, давайте начнем изучение MIDP с простейшего хрестоматийного примера HelloWorld. Ниже представлен код мидлета.


package examples;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public final class Examples extends 
        MIDlet implements CommandListener
{
/*===============[ INSTANCE VARIABLES ]=========*/
 private Command exitCommand;
 private Form form;

/*===============[ CONSTRUCTORS ]===============*/
 public Examples()
 {
  exitCommand = new Command ("Exit", Command.EXIT, 1);
 }

/*===============[ CLASS METHODS ]==============*/
 protected void destroyApp (boolean unconditional)
        throws MIDletStateChangeException
 {
  exitMIDlet();
 }

 private void exitMIDlet()
 {
  notifyDestroyed();
 }

 protected void pauseApp()
 {
  form = null;
 }

 protected void startApp()
        throws MIDletStateChangeException
 {
  form = new Form ("Hello MIDlet");
  form.append ("Hello World!");
  form.addCommand (exitCommand);
  form.setCommandListener(this);
  Display.getDisplay (this).setCurrent (form);
 }

 public void commandAction (Command c, Displayable d)
 {
  if (c == exitCommand)
  {
   exitMIDlet();
  }
 }
}
/*===========================================*/

Рассмотрим данный пример поближе.
Первое, что мы сделали это, создали класс, который реализует абстрактный класс javax.microedition.midlet.Midlet. Для реализации данного класса необходимо реализовать три абстрактных метода startApp, pauseApp, и destroyApp. Эти три метода и определяет жизненый цикл нашего мидлета.

Но сначала несколько слов о создание объекта MIDlet. В MIPD модели система вызывает public конструктор без аргументов для создания объекта MIDlet. Если вам необходимо проинициализировать ваш мидлет следует такой код поместить именно здесь.

Метод startApp вызывается системой, чтобы стартовать или рестартовать мидлет. Его целью является подготовить мидлет к работе, например, распределить ресурсы создать необходимый пользовательский интерфейс. Метод startApp может "упасть" двумя способами. Их принято называть как transient и non-transient. Transient не является фатальным случаем, мидлет может сказать системе, чтобы его попытались запустить еще раз немного позднее. Для этого мидлет должен выкинуть MIDletStateChangeException. Non-transient случай, когда произошло что-то из ряда вон выходящее что не должно происходить по нашему запланированному сценарию, например Error или RuntimeException. В этом случае мидлет будучи настоящим мужиком должен сделать себе харакири чтоб не запятнать честь его создателя, вызвав метод destroyApp.

Эти обе ситуации представлены в примере ниже.


 void startApp() throws MIDletStateChangeException
 {
  HttpConnection httpConnection = null;
  int status = -1;
  try
  {
   httpConnection = (HttpConnection)Connector.open(...);
   status = httpConnection.getResponseCode();
   ...	
  }
  catch (IOException ioe)
  {
   // Transient failure: 
   // невозможно установить соединение
    throw new MIDletStateChangeException
    ("Network not available");
  }
  catch (Exception e)
  {
   // Non-transient failure: 
   // Опа! Спасаем честь программиста!
   destroyApp(true);
   notifyDestroyed();
  }
 }
Метод pauseApp вызывается системой, чтобы приостановить действие мидлета. Добропорядочный мидлет впадает в спячку и должен освободить ненужные для него ресурсы. Сразу стоит сказать, что освобождение ресурсов это не пустые слова, так как возможности KVM существенно ограничены. Любой ненужный ресурс должен быть освобожден. Метод pauseApp как правило должен работать в связке с методом startApp.


private int [] buffer;
…
void startApp() throws MIDletStateChangeException
{
    buffer = new int[400];
}

void pauseApp()
{
    buffer = null;
}

И последний метод destroyApp вызывается системой, чтобы сказать мидлету, что он будет уничтожен, и самое время приготовиться к этому. Закрыть ресурсы, сохранить необходимую информацию, надеть белые тапочки.


 void startApp() throws MIDletStateChangeException
 {
  ...
  rs = RecordStore.openRecordStore(...);
  ...
 }
 
 void destroyApp(boolean u)
 {
  if (rs != null)
  {
   // сохраняемся
   ...
  }
 }
Теперь поговорим поподробней о житие мидлета.

Во время жизни мидлет может находиться в одном из трех состояний.

Paused State

Мидлет в этом состояние может находиться, когда он только что был создан и метод startApp еще не был вызван. В это состояние мидлет также может попасть в результате вызовов pauseApp и notifyPaused методов. Когда мидлет входит в это состояние, он должен освободить не нужные ему ресурсы. Но жизнь для мидлета продолжается даже когда он в спячке, асинхронные сообщения могут поступать к нему, к примеру сообщения от Timer. Но следует отметить, что система может и не реализовывать данное состояние. К примеру, если мидлет был запущен и на телефон поступил звонок, то телефон может просто убить виртуальную машину, так как в данном устройстве Paused состояние может быть не реализовано.

Active State

Мидлет находиться в активном состоянии после вызова startApp метода. Также он может попасть в это состояние из состояния Paused после вызова resumeRequest.

Destroyed State

В данное состояние мидлет попадает после вызовов destroyApp или notifyDestroyed. Войдя в данное состояние, перейти в другое состояние мидлет уже не может. Переходы мидлета из одного состояния в другое могут производиться как системой, так и самим мидлетом.

Теперь, суммируем информацию о шести методах класса Midlet. (Седьмой метод getAppProperty не затрагивает жизненный цикл)
  • startApp - Этот метод вызывается системой, чтобы перевести мидлет в состояние Active, в первый раз, и воскресить его повторно из состояния Paused. Не путайте метод startApp с методом main. startApp метод может вызываться неоднократно.

  • pauseApp - Этот метод может быть вызван системой в ситуации, когда поступает звонок на мобильный телефон или при нехватке памяти. В этом случае мидлет, должен освободить ресурсы.

  • destroyApp - Это нормальный путь завершить работу мидлета. Данный метод имеет boolean параметр (unconditional). Параметр показывает, является ли вызов "безоговорочным". Иными словами, в случае если параметр равен false и мидлет не хочет заканчивать свою работу, он может 'запросить жизнь' у системы, выкинув MIDletStateChangeException. Тогда система может выполнить данную просьбу и отклонить смертный приговор, и состояние мидлета не измениться. Если параметр равен true, мидлет должен подчиниться, и освободить все ресурсы, не прося пощады.

    Следующие три метода могут вызываться самим мидлетом, чтобы изменить свое текущее состояние.

  • resumeRequest: Мидлет может инициировать переход, из Paused состояния в Active, вызвав этот метод. Такая ситуация может возникнуть к примеру по истечении тайм-аута.

  • notifyPaused: Этот метод позволяет мидлету добровольно перейти из состояния Active в состояние Paused.

  • notifyDestroyed: Мидлет может вызвать этот метод, чтобы сказать, что он завершил работу, сохранил все необходимые данные и освободил ресурсы, при этом метод destroyApp не будет вызван.

  • Автор Mank
    www.midlet.ru


    Дэвид Флэнаган
    "Java в примерах. Справочник"
    Подробнее>>
    Заказать>>


    Х. М. Дейтел, П. Дж. Дейтел
    "Как программировать на Java. Книга 2. Файлы, сети, базы данных"
    Подробнее>>
    Заказать>>

    Узнай о чем ты на самом деле сейчас думаешь тут.


    [an error occurred while processing this directive]



    Apache Struts 2.0.11
    Apache MyFaces Trinidad Core 1.2.3.
    Sun переводит мобильные устройства с Java ME на Java SE
    Хакерская атака!