0

我正在开发跟踪传入/传出呼叫并将呼叫记录保存到数据库中的应用程序。昨天我看到一个场景,应用程序被操作系统终止并弹出警告消息(错误:应用程序没有响应)。应用程序被操作系统终止后。应用程序无法再次收听来电/去电。我认为,Application Phone Listener 因应用程序异常终止而未注册。操作系统调用System.Exit(0)应用程序终止

如果我遵循这种方法:-

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

   new SampleUIApp().enterEventDispatcher();
   }

在这种情况下,每次应用程序启动时,都会注册电话监听器。并且应用程序的(电话监听器)注册了多次。单次呼入/呼出的手段我得到了多次

void callConnected( int aCallId ) 
callDisconnected( int aCallId ) 

为了解决这个问题,我正在使用 RunTime Store Management System。为此,我使用以下方法:-

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 不为空,但应用程序电话侦听器是 Derigester。

请帮我解决这个问题。

4

1 回答 1

1

这里发生的事情比你向我们展示的要多,所以我不相信这是正确的答案。我有信心的是,您需要更改代码才能使其正常工作。

我怀疑您在滥用侦听器处理。

通常侦听器在他们正在侦听的应用程序的上下文中运行。所以实际上你的监听器是在 Phone 应用程序的控制下运行的。您不想在侦听器代码中破坏这一点(就像您正在做的那样)。因此,您应该尽可能使您的侦听器代码紧凑(高效且牢不可破)。在这种情况下,从内存中,侦听器与事件线程一起运行,因此除了确保您的代码紧凑之外,您不应该执行任何阻塞操作 - 请记住,读取数据库可以算作阻塞操作。

一般的建议是确保侦听器尽可能少做 - 最好的建议是他们启动一个全局事件并在您的应用程序中处理繁重的处理。

这是一篇关于全球事件的文章:

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

讨论了理论之后,这里发生了什么?

在这种情况下,我怀疑您的侦听器正在阻塞并且您正在关闭电话应用程序。我很确定电话应用程序会被系统重新启动(没有电话应用程序的电话有什么用!)所以你可能不会注意到这一点。但是当电话应用程序重新启动时,它没有你的监听器 - 所以你停止收到通知。

所以我认为你需要修复你的监听器代码以确保它停止关闭电话应用程序。

我怀疑你有两个选择:

  1. 使用全局事件将处理移动到您自己的应用程序(我的建议)
  2. 将阻塞操作移出事件线程。

实施任何一个都应该阻止您的应用程序破坏电话应用程序,并且问题将得到解决。

于 2013-09-20T08:46:54.253 回答