最近写项目,遇到一个特蛋疼的问题,先记录下,哪位大牛知道原因,还请指导下。
案例场景:
app呼叫,提交http请求到后台,后台回拨电话下来,服务里面自动接听,不显示系统通话界面,app界面显示通话时长,若回到桌面或者在其他应该界面,则用悬浮窗去显示通话时长。
BUG:
1.按back键,提示phone应用 ANR。
这个bug知道问题在那,因为不让显示系统通话界面,又不要过多的改动系统phone源码,所以,在phone应用添加了一个私有广播,当监听到来电了,就发送广播给phone应用,调用对应的 接听键调用的方法,接听。挂断,也发送广播调用,对应的 挂断键 调用的方法。同时为了不显示系统通话界面,我把InCallScreen 的them设置为 Theme.NoDisplay。
而刚好,这个bug,就出现在这个Theme.NoDisplay上。当一个activity的them为Theme.NoDisplay时,点击back键,就会出现ANR的问题。现在还不知道具体原因。
于是,我在接听了后,又发送了一个广播,调用phone的 finish方法,以解决这个问题。
2.按back键,onStop,onDestory不执行。
按back键,onPause调用了,但是onStop 与onDestroy没有调用,导致我 在onStop时通知服务去显示 浮窗 的代码没有执行,而且,打印的log也相当诡异。back键后,activity不存在了,只调用了onPause,但是,再次进入的时候,会走onCreate,同时后面也打印了onStop与onDestroy,但是activity还在,浮窗也出来了。然后再次back后,activity与浮窗的交互流程就正常了。如果不back,直接按home键,流程也是正常的。
为了解决这个bug,我重写了onKeyDown,让back时候,回到桌面,类似home键。
我的activity的 android:launchMode="singleInstance" ,会不会和这个属性有关?现在bug多,没太多时间仔细研究,暂时记录下。
下面附上 log,看看诡异的流程吧。
添加了一下注释,去掉了一下无关的lgo
-----启动activity----
01-10 16:48:22.958: I/MainActivity(20504): --onCreate--
01-10 16:48:22.998: I/MainActivity(20504): --onStart--
01-10 16:48:22.998: I/MainActivity(20504): --onResume--
01-10 16:48:22.998: I/System.out(20504): 0
01-10 16:48:23.008: I/NavigationService(20504): --onStartCommand--IDEL--
01-10 16:48:23.008: I/MainActivity(20504): --onServiceConnected--
01-10 16:48:23.008: I/MainActivity(20504): --invokeService not null and registeCallBack&getCurrentInfo--
01-10 16:48:23.008: I/NavigationService(20504): --registeCallBack--
01-10 16:48:23.078: I/NavigationService(20504): --分发MSG到 activity--
----来电------
01-10 16:48:41.538: I/NavigationService(20504): --来电铃声--
01-10 16:48:41.628: I/NavigationService(20504): ----发送-接听-广播----
----phone应用启动,导致activity失去焦点----
01-10 16:48:42.058: I/MainActivity(20504): --onPause--
01-10 16:48:42.618: I/NavigationService(20504): --CALL_STATE_OFFHOOK 接听来电--
----finish phone界面----
01-10 16:48:42.618: I/NavigationService(20504): --sendBackToPhone--
01-10 16:48:42.668: I/MainActivity(20504): --startCalling--
01-10 16:48:42.688: I/MainActivity(20504): --updateTime--time_begin=2982502--
-----activity 重拾焦点----
01-10 16:48:42.938: I/MainActivity(20504): --onResume--
01-10 16:48:42.938: I/System.out(20504): 0
01-10 16:48:42.948: I/NavigationService(20504): --activityShowStateChange--isShow=true--callState=CALLING--
01-10 16:48:42.948: I/NavigationService(20504): --分发MSG到 activity--
-----按下back键-----回到前面的界面--可是浮窗没有出来--
01-10 16:48:48.328: I/MainActivity(20504): --onKeyDown event=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=2988157, downTime=2988157, deviceId=-1, source=0x101 }--
01-10 16:48:48.388: I/MainActivity(20504): --onBackPressed--
01-10 16:48:48.458: I/MainActivity(20504): --onPause--
-----为何只到onPause???
01-10 16:48:48.748: I/MainActivity(20504): --updateTime--time_begin=2982502--
01-10 16:48:49.748: I/MainActivity(20504): --updateTime--time_begin=2982502--
01-10 16:48:50.748: I/MainActivity(20504): --updateTime--time_begin=2982502--
01-10 16:48:51.748: I/MainActivity(20504): --updateTime--time_begin=2982502--
01-10 16:48:52.748: I/MainActivity(20504): --updateTime--time_begin=2982502--
----再次启动Activity----activity 与 浮窗同时出现--bug 啊
01-10 16:48:53.158: I/MainActivity(20504): --onCreate--
01-10 16:48:53.208: I/MainActivity(20504): --onStart--
01-10 16:48:53.208: I/MainActivity(20504): --onResume--
01-10 16:48:53.208: I/System.out(20504): 0
01-10 16:48:53.218: I/NavigationService(20504): --onStartCommand--CALLING--
01-10 16:48:53.218: I/MainActivity(20504): --onServiceConnected--
01-10 16:48:53.218: I/MainActivity(20504): --invokeService not null and registeCallBack&getCurrentInfo--
01-10 16:48:53.218: I/NavigationService(20504): --registeCallBack--
01-10 16:48:53.278: I/MainActivity(20504): --handleMessage--msg=7--
01-10 16:48:53.278: I/NavigationService(20504): --activityShowStateChange--isShow=true--callState=CALLING--
01-10 16:48:53.278: I/NavigationService(20504): --分发MSG到 activity--
01-10 16:48:53.278: I/NavigationService(20504): --关闭显示的浮框--
01-10 16:48:53.278: I/CallingFrontView(20504): --sIdel--
01-10 16:48:53.278: I/CallingFrontView(20504): --closeFrontView--
01-10 16:48:53.278: I/NavigationService(20504): --dispatchSrvMsgToView--SvrState=CALLING--
01-10 16:48:53.278: I/MainActivity(20504): --sCalling--
01-10 16:48:53.278: I/MainActivity(20504): --updateTime--time_begin=2982502--
01-10 16:48:53.278: I/NavigationService(20504): --getCurrentInfo--
01-10 16:48:53.278: I/NavigationService(20504): --dispatchSrvMsgToView--SvrState=CALLING--
01-10 16:48:53.278: I/MainActivity(20504): --sCalling--
01-10 16:48:53.278: I/MainActivity(20504): --updateTime--time_begin=2982502--
-----为何还会接着调用 onStop和onDestroy,没有onPause,而且测试Activity还显示着,由于这个,导致浮窗与Activity一起出现了--
01-10 16:48:53.738: I/MainActivity(20504): --onStop--
01-10 16:48:53.738: I/MainActivity(20504): --onDestroy--
01-10 16:48:53.778: I/MainActivity(20504): --handleMessage--msg=6--
01-10 16:48:53.778: I/NavigationService(20504): --activityShowStateChange--isShow=false--callState=CALLING--
01-10 16:48:53.778: I/NavigationService(20504): --分发MSG到 浮窗--
01-10 16:48:53.778: I/NavigationService(20504): --dispatchSrvMsgToView--SvrState=CALLING--
01-10 16:48:53.788: I/CallingFrontView(20504): --updateContentView vState=SHOWING--
01-10 16:49:01.758: I/MainActivity(20504): --onKeyDown event=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x48, repeatCount=0, eventTime=3001583, downTime=3001583, deviceId=-1, source=0x101 }--
01-10 16:49:01.878: I/MainActivity(20504): --onBackPressed--
01-10 16:49:01.948: I/MainActivity(20504): --onPause--
01-10 16:49:02.438: I/MainActivity(20504): --onStop--
01-10 16:49:02.438: I/MainActivity(20504): --onDestroy--
在网上看到这个哥们的问题,跟我的有几分类似,是不是我的Activity也透明了?可是我验证了下他说的情况,并没有出现。