2013-09-20 3 views
1

Я работаю над приложением, которое отслеживает InComing/Исходящие звонки & сохраняет записи вызовов в базу данных. Вчера я видел сценарий. В котором приложение завершено ОС & появляется предупреждающее сообщение Up (Ошибка: приложение не отвечает). После завершения приложения OS. Приложение больше не может прослушивать входящие/исходящие вызовы. Я думаю, приложение Phone Listener не зарегистрировано ненормальным завершением приложения. Os вызывает System.Exit(0) для прекращения примененияНе прослушивание PhoneListener после аномального завершения в Blackberry

Если я следовать этому подходу: -

public static void main(String[] args) 
{ 
    /** 
    * Registering the phone Listener. 
    * */ 
    Phone.addPhoneListener(new ConcretePhoneListener()); 

    new SampleUIApp().enterEventDispatcher(); 
    } 

В этом случае каждый раз при запуске приложения вверх, телефон слушатель зарегистрирован. И приложение (Phone Listener) зарегистрировано несколько раз. Средства для одного In/Out Зова я получаю multipule раза

void callConnected(int aCallId) 
callDisconnected(int aCallId) 

для sourt этого вопроса, я использую систему управления магазина RunTime. Для этого я использую следующий подход: -

private static void registeringPhoneListener() 
{ 
    RuntimeStore mRuntimeStore = RuntimeStore.getRuntimeStore(); 
    final long GUID = 0xba9e3b33ac5fe37eL; 

    String msPhoneListenerString = null; 

    if(mRuntimeStore.get(GUID) != null) 
    { 
     Log.debug( "PhoneListener is Already Implemented ## "); 
    } 
    else 
    { 
     Phone.addPhoneListener(new ConcretePhoneListener()); 
     mRuntimeStore.put(GUID, "PhoneListener"); 

      Log.debug("PhoneListener Implemented First Time ## ");   
    } 
} 

этот подход работает отлично, пока я не аварийное завершение ОС, Поскольку RuntimeStoreManagemnet не равно нулю, но Application Phone-слушатель Derigester.

, пожалуйста, помогите мне это.

+1

Я думаю, вам сначала нужно избавиться от этих ошибок ANR, вместо того, чтобы пытаться их исправить только для того, чтобы ухудшить ситуацию. Вы можете сделать свое приложение «автозапуск при запуске» и «скрыть значок приложения», чтобы он запускался только один раз при загрузке, и пользователь не может вручную запустить его. О, и вам не нужно расширять 'UiApplication', если вам действительно не нужен GUI, вместо этого расширьте« Приложение ». –

ответ

1

Здесь больше, чем вы показали нам, поэтому я не уверен, что это правильный ответ. Я уверен, что вам нужно изменить свой код, чтобы он работал правильно для вас.

Я подозреваю, что вы злоупотребляете обработкой слушателя.

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

Общая рекомендация состоит в том, чтобы убедиться, что слушатели делают как можно меньше - лучшая рекомендация заключается в том, что они запускают глобальное событие, и тяжелая обработка обрабатывается в вашем приложении.

Вот статья о Global Events:

http://supportforums.blackberry.com/t5/Java-Development/Global-Events-and-Global-Event-Listeners/ta-p/444814

Обсудив теорию, что здесь происходит?

В этом случае я подозреваю, что ваш слушатель блокируется, и вы снимаете приложение «Телефон». Я уверен, что приложение «Телефон» перезагружается системой (какой телефон используется без телефона!), Чтобы вы этого не заметили. Но когда приложение телефона перезапущено, у него нет вашего слушателя - и вы перестаете получать уведомления.

Так что, я думаю, вам нужно исправить свой код прослушивателя, чтобы убедиться, что он перестает удалять приложение «Телефон».

Я подозреваю, что у вас есть два варианта:

  1. перемещение обработки на собственное приложение с использованием глобального события (мой рекомендации)
  2. движения блокирующих операции выключают поток событий.

Реализация либо должна остановить приложение, нарушающее приложение телефона, и проблема будет решена.

+0

Спасибо за ответ .. но я просто хочу знать о ненормальном прекращении действия приложения, потому что для нормального состояния RunTime Store управляет слушателем .. и я следую за этим сообщением: - http://supportforums.blackberry.com/t5/ Java-Development/How-to-prevent-registering-a-phone-listener-multiple-times/td-p/987285 –

+0

Использование RuntimeStore - это правильный способ предотвратить использование нескольких прослушивателей. Как уже отмечалось, я думаю, что проблема возникает из-за того, что ваш код слушателя убивает приложение Phone. Остановите это, и ваши проблемы исчезнут. Пытаясь привести в порядок или повторно вставить слушателя после ненормального завершения, это не правильный подход, правильный подход заключается в том, чтобы не вызвать прерывание в первую очередь. –

Смежные вопросы