Перейти к содержимому

Создание простейшего Java приложения для сотового телефона

    В языке Java есть ряд преимуществ. Он легок в освоении. Под него есть большое количество документации и средств разработки. Кроме того, разработкой Java-приложений (не обязательно под мобильные телефоны) занимается множество людей по всему миру – и, в случае необходимости, есть у кого спросить совета.

    Введение

    Технология Java была разработана компанией Sun Technologies, Inc. На сайте компании можно найти документацию и средства разработки: http://java.sun.com и http://wireless.java.sun.com/. Спецификации по CLDC и MIDP – наиболее нужные документы для разработчика приложений под «беспроводные устройства связи», находятся по адресу http://java.sun.com/j2me/docs.

    Несколько слов про совместимость. Как известно, поддержка сотовыми телефонами языка Java предполагала появление универсального средства разработки. В реальности все оказалось не совсем так. Да, язык программирования один и, при необходимости, адаптировать программу для работы на разных телефонах вполне реально. Но, иногда, для этого приходится выпускать несколько версий приложения.

    Дело в том, что основным предназначением Java очень быстро стала разработка игр. И вот здесь MIDP 1.0 (Mobile Information Device Profile), использующийся в настоящий момент в большинстве телефонов, оказался не на высоте. Отсутствие возможности использования прозрачных спрайтов уже сильно затрудняло разработку приложений. К этому прибавлялось невозможность использования полноэкранного режима, поворота и инвертирования спрайтов (чтобы сделать кораблик, способный лететь в четыре направления, надо было рисовать и закачивать на телефон четыре практически одинаковых спрайта, что отрицательно сказывалось на размерах игры и доступной памяти) и некоторые прочие недостатки.

    Nokia решила не ждать появления MIDP 2.0 и разработать собственный API, ориентированный на производителей игр. MIDP 2.0 до большинства аппаратов Nokia еще не добрался, хотя большинство аппаратов поддерживает отдельные его функции.

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

    Вторая проблема совместимости тоже иногда доставляет проблемы. Дело в том, что разрешение экранов разных моделей очень сильно различается. В некоторых случаях это не имеет значение. В других – наоборот. Кроме того, есть модели телефонов, поддерживающих Java, но с черно-белым экраном, или экраном, отображающим только 256 цветов.

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

    Что Вам понадобится

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

           · Java™2 SDK, Standard Edition, v.1.4.1 (http://java.sun.com/j2se/1.4.1/download.html). Размер около 38 мб.

           · J2ME™ Wireless Toolkit 2.0 (http://java.sun.com/products/j2mewtoolkit/). Размер около 10 мб.

    Внимание! У приложений Sun Technologies есть одна неприятная особенность. Если произвести установку в каталог, в названии которого имеются пробелы или русские символы, они будут работать некорректно. В частности, будут большие проблемы с поиском библиотек во время компиляции.

    Создаем первое приложение

    Сейчас мы создадим свое первое Java-приложение, представляющее собой классический пример программы «Hello, world». Будут использоваться универсальные библиотеки, что позволит запускать приложение на любом телефоне, поддерживающем Java с версией MIDP 1.0.

    После установки средств разработки, запускайте KToolbar.

    Пуск -> Программы -> J2ME Wireless Toolkit 2.0 -> KToolbar

    В программе KToolbar создаем новый проект (кнопка New Project…)

    Введите название проекта (Project Name) и название класса MIDlet (MIDlet Class Name). Мы будем использовать “Hello” и “HelloWorldMIDLet” соответственно.

    После создания проекта будет предложено отредактировать его настройки. Нужно изменить всего один пункт, MicroEdition-Profile на MIDP-1.0 .

    Теперь нужно найти созданный проект. Найдите, куда Вы устанавливали J2ME™ Wireless Toolkit 2.0 и разыщите в этом каталоге подкаталог appsHellosrc.

    В нем создайте файл с названием «HelloWorldMIDLet.java». Учтите, что Java-код и имена файлов регистрозависимые.

    Код программы и комментарии приведены ниже. После заполнения файла скомпилируйте программу нажатием кнопки «Build» и запустите в эмуляторе нажатием на «Run».

    Чтобы опробовать созданное приложение на своем телефоне выберите меню Project -> Package -> Create Package. Файлы, предназначенные для закачивания на трубку буду находиться в подкаталоге bin, находящемся в каталоге с программой.

    Пример кода:

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

    public class HelloWorldMIDlet extends MIDlet
    {
        public HelloWorldMIDlet()
        {
        }

        public void startApp()
        {
        Displayable current = Display.getDisplay(this).getCurrent();
            if(current == null)
            {
            HelloScreen helloScreen = new HelloScreen(this, "Hello World."
            Display.getDisplay(this).setCurrent(helloScreen);
            }
        }
        public void pauseApp() 
        {
        }
        public void destroyApp(boolean b) 
        {
        }
        void exitRequested()
        {
            destroyApp(false);
            notifyDestroyed();
        }
    }
    class HelloScreen extends TextBox implements CommandListener
    {
          private final HelloWorldMIDlet midlet;
          private final Command exitCommand;
          HelloScreen(HelloWorldMIDlet midlet, String string)
          {
                super("HelloWorldMIDlet", string, 256, 0);
                this.midlet = midlet;
                exitCommand = new Command("Exit", Command.EXIT, 1);
                addCommand(exitCommand);
                setCommandListener(this);
          }
          public void commandAction(Command c, Displayable d)
          {
                if(c == exitCommand)
                {
                      midlet.exitRequested();
                }
          }
    }

    Любое J2ME приложение может находится в следующих состояниях: рабочее, пауза и уничтоженное. Для контроля за этими состояниями, управления приложением со стороны аппарата

    После создания MIDlet находится в состоянии паузы. Если в конструкторе MIDlet’а происходит прерывание, он немедленно входит в уничтоженное состояние и его ресурсы очищаются. Перейти из активного состояния в паузу приложение может после успешного завершения метода pauseApp (), или, в случае возникновения прерывания в методе startApp ().

    Перейти из состояния паузы в активное состояние MIDlet может при успешном завершении метода startApp() в случае нормальной работы приложения.

    Метод destroyApp (boolean unconditional) служится для перевода приложения в уничтоженное состояние, т.е. для очистки ресурсов, занимаемых им. Если аргумент unconditional соответствует значению true (истинно), MIDlet будет уничтожен. В противном случае (значение false) и при возникновении прерывания MIDletStateChangeException он не будет уничтожен. В этом случае может понадобится соответствующая обработка возникающих прерываний.

    Чего это означает для нас? Функция startApp () вызывается в двух случаях: когда приложение впервые запущено и когда оно возвращается из состояния паузы. Пауза, как правило, включается по решению самого сотового телефона, например, при входящем телефонном звонке (и, в этом случае, автоматом выполняется функция pauseApp(), в которой можно произвести необходимые действия – освободить некоторые ресурсы, остановить таймеры и прочее). В методе destroyApp () пишется код, который будет выполнен непосредственно перед выключением приложения – в частности, из нее может вызываться функция сохранения.

    В нашем случае в функции startApp производится анализ показываемого в данный момент экрана:

            Displayable current = Display.getDisplay(this).getCurrent();

    и, если показываемый в данный момент объект current пуст (на экране ничего нет) – мы создаем новый объект класса helloScreen и отображаем его на экране.

            if(current == null)
            {
                HelloScreen helloScreen = new HelloScreen(this, "Hello World.");
                Display.getDisplay(this).setCurrent(helloScreen);
            }

    Функция Display.getDisplay(this) возвращает объект класса Display, который может быть использован в этом MIDlet для отображения информации на экране.

    Подробнее разберемся с этим классом. Он наследует параметры класса TextBox, который в свою очередь наследует параметры класса Form. В данном случае это означает, что у нас на экран выводится элемент формы, предназначенный для ввода текста (содержащий строчку string). Кроме того, класс обладает возможностями CommandListener, т.е. может ожидать от пользователя ввода команд, реагировать на них, а также отображать подсказку по действиям команд на экране. В верхней части экрана также показывается строка (В данном случае —  HelloWorldMIDlet).

    Все операции организации ввода команд производятся в конструкторе, т.е. функции HelloScreen одноименного класса.

                super(«HelloWorldMIDlet», string, 256, 0);

    Создаем объект формы с названием (title) «HelloWorldMIDlet», изначальным содержимым (text) равным строке string, максимальной длиной вода 256 и без специальных ограничений на ввод текста.

                this.midlet = midlet;

    Просто присваиваем значению объекта midlet в классе значение объекта midlet, переданному в конструктор фукнции.

                exitCommand = new Command("Exit", Command.EXIT, 1);
                addCommand(exitCommand);
                setCommandListener(this);

    Создаем новый объект класса Command с названием «Exit», типа Command.EXIT. Пусть это Вас не смущает, несмотря на название типа, срабатывание этой команды не будет приводить к автоматическому выходу из приложения. Обработчик этой команды мы напишем после.

    Тип команды указывает телефону, в какое место экрана, обычно предназначено для отображения именно подобных команд, установить ее. В случае, если этих команд в одном месте оказывается несколько (к примеру, на правой soft-клавише телефона на одном экране могут оказаться повешены команды Command.EXIT и Command.BACK, т.е. выход и возврат в предыдущее меню) – обеспечивает выбор меню с соответствующим выбором; в этом порядок следования команд определяется третьим передаваемым параметром – приоритетом ( в нашем случае, 1).

    Функция addCommand добавляет выбранный объект (команду) на показываемый экран (Displayable).
    setCommandListener включает для данного же экрана режим приема команд.

          public void commandAction(Command c, Displayable d)
          {
                if(c == exitCommand)
                {
                      midlet.exitRequested();
                }
          }

    А вот и обработчик. В случае, если вызванная команда соответствует exitCommand, запускает функция exitRequested родительского класса. В данном случае она приводит к закрытию приложения.

    Для первого раза вполне достаточно. Только что мы написали простейшую команду на Java2ME, типичный «Hello World».

    Запускайте эмулятор кнопкой «Run» и смотрите на результат.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *