Android的TV监听Home键切换信源碰到的问题
实现的功能是按下Home键,焦点放到TV小窗口上,再次按下Home键,切换信源,进入另一个信源。在另一个信源的显示下,按下Home键,原信源视图缩小并显示当前信源。
这个需求的解决代码比较容易的。实现一个BroadCastReceiver,监听Home键。但是依照HOME键的实现的时候,系统会切换到当前Launcher,因此,在当前信源的情况下点击HOME键,走的流程是:
onPause->onStop->onRestart->onStart->onResume。
这是暴露给我们能够复写的函数,但是这里其实隐藏了一个很重要的细节。执行到onRsume的时候,系统应该是异步的切换Avtivity的View,即显示当前默认Launcher的View。因此在切换信源的时候,这个时间周期同步就可能出现问题。即,当焦点在TV小窗口的时候按下Home键
①android系统切换到当前Launcher,
②切换信源,进入TV。
或者②——>①,不能进入TV。这时候当前的Launcher的View不会重绘,因此完全看不出来是已经切换了信源,又切回来的这么个过程。
之前一直有在各个周期函数中写下Log,检查无异样(所以据此猜测是异步执行View的重绘)。然后查看整个android系统的Log。在命令行中重定向:
adb logcat -v -f time > f:\adblocat.txt。
以此来查看整个系统的log,发现在ActivityManager中有一次切换到当前的Launcher,因此解决这个问题。方法很简单,就是在BroadCastReceiver中新开线程并sleep一小段时间来强制系统切换Launcher在前,转换信源在后(即①——>②),这样便ok了。
总结,在多应用(信源)切换的时候,外接应用(jar)较多的时候要多看系统的log,已查看问题的所在。了解核心控件,事件的时候要相对深刻一点,尽量去思考实现机制,以便查处问题的所在!