我正致力于跟踪InComing / Outgoing calls& amp;将记录保存到数据库中。
昨天我看到了一个场景,其中应用程序被OS&弹出警告消息(错误:应用程序没有响应)。应用程序被OS终止后。应用程序无法再次收听来电/去电。
我认为,应用程序电话侦听器未被异常应用程序终止注册。
Os调用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商店管理系统。 为此,我使用以下方法: -
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不为null,但Application Phone-listener是Derigester。
请帮帮我。
答案 0 :(得分:1)
这里发生的事情比你向我们展示的要多,所以我不相信这是正确答案。我有信心的是,您需要更改代码才能使其正常工作。
我怀疑你是在滥用监听器处理。
通常,侦听器在他们正在侦听的应用程序的上下文中运行。所以实际上你的监听器是在Phone应用程序的控制下运行的。你不想在你的监听器代码中打破这个(看起来你正在做)。因此,您应该尽可能地使您的侦听器代码紧密(高效且不易破碎)。在这种情况下,从内存中,侦听器使用事件线程运行,因此除了确保代码紧张之外,您不应该执行任何阻塞操作 - 并且记住读取数据库可能算作阻塞操作。
一般建议是确保听众尽可能少地做 - 最好的建议是他们启动全局活动,并在您的应用程序中处理繁重的处理。
这是一篇关于全球活动的文章:
讨论了这个理论后,这里发生了什么?
在这种情况下,我怀疑你的监听器是阻塞的,你正在取消Phone应用程序。我很确定电话应用程序会被系统重新启动(没有电话应用程序的手机有什么用途!)所以你可能不会注意到这一点。但是当重新启动Phone应用程序时,它没有您的监听器 - 因此您停止收到通知。
所以我认为您需要修复您的Listener代码以确保它停止取消Phone应用程序。
我怀疑你有两个选择:
实施任何一项都应该停止您的应用程序破坏电话应用程序,问题将得到解决。