Я читал-читал J2ME SDK documentation и нигде не обнаружил упоминания, что в "приостановленном" режиме мидлет "заморожен". Похоже, дело обстоит так:
1. мидлет стартует - вызывается метод
StartApp(), который устанавливает свой обработчик команд
CommandListener, инициализирует переменные и т.п. (занимает ресурсы, одним словом), а затем вызывается метод
run(). Завершение этого метода - конец работы мидлета (я не рассматриваю его).
2. поступает звонок - вызывается метод
PauseApp() - паскаль в этом методе просто устанавливает значение переменной
МР=-1. А в доке написано, что "
мидлет должен освободить занятые ресурсы и т.п." Так вот, никакого освобождения не происходит в паскале! Наверное, если бы это делалось, надо было бы освободить
CommandListener, т.е. как я понимаю, отключиться от очереди событий - тогда мидлет действительно перестал бы работать.
3. После того, как метод
PauseApp() отработал - нет никаких сведений, что метод
run() каким-то образом остановлен - он продолжает крутиться - это подтверждает приведенный мною ранее пример кода.
4. Когда разговор завершен - вызывается метод
StartApp() - тот самый, что и при запуске мидлета - паскаль проверяет, создан ли уже экземпляр мидлета (конечно, это ведь не первый запуск) - и сбрасывает переменную
МР в
0 (эта переменная и есть результат функции
IsMidletPaused).
Если кто найдет какие-то упоминания в J2ME SDK о том, что я не прав - пусть меня поправит. А тот факт, что не на всех телефонах мидлеты так себя ведут, я могу объяснить двумя причинами: либо недостаточно качественное тестирование проблемы на других телефонных платформах, либо кривая реализация ява-машины. Последнее косвенно подтверждается качеством программных эмуляторов телефонов - у сименсов они на высоте, а например у самсунга - вообще левые какие-то
.
Будут другие мнения?
P.S. Было бы интересно узнать о результатах работы приведенного мнюю кода на разных телефонах - надо же понимать, как работают наши программы!