WindowManager当前焦点窗口管理,及多用户下当前焦点window错乱问题

   android中窗口是由WindowManagerService管理的,其中有一个成员变量mCurrentFocus,记录的是当前的焦点窗口,用于将实时input event传递给这个window处理,比如back键。当然在activity切换的时候,这个mCurrentFocus的值会实时变化成当前activity所在的window.这个原生逻辑本来是没有问题的,但是在引入多用户之后,情况却变的复杂了,一个典型的情况就是:如果从桌面直接切换用户的话,新用户的当前窗口无法获取焦点。下面主要针对这个问题,对windowmanager设置mCurrentFocus的过程做一个梳理。

  下面我会对这个问题的完整发现解决过程做个记录,以期帮助改善之后的解bug思路。

   首先问题是什么呢?在切换用户之后,来到新用户的时候,发现menu键、back键无效,这个刚开始困扰了很久,因为当时对windowmanager也不了解,所以根本也没往这个方向想。但我们公司有点好的地方,就是有些牛人,对framework非常熟悉。所以我就请教了其中一个大牛,果不其然,他很快给我指明了思路,当前窗口可能不是焦点窗口。但怎么找到当前焦点窗口呢?adb shell dumpsys window.android已经提供了工具,可以看到当前系统的各种状态,唉,确实积累过少,对这个工具知道来到这个公司才知道。所以诚恳的说,来到这个公司很是学到不少东西的,尤其是系统开发这方面的,因为之前是做app开发的,这些东西没接触过。

  好了,继续回到技术上。通过dumpsys命令查到当用户切换之后,当前的焦点窗口变成null了,而不是新用户的前台窗口。有了这个发现,肯定很激动,至少不会是一个无头苍蝇漫无目的的猜测了,可以有一个明确的思路方向了。下面的问题就变成mCurrentFocus为什么会在切换用户之后变成null的追寻过程了。

 1. 查看WindowManagerService源码,发现:

      private WindowState findFocusedWindowLocked(DisplayContent displayContent) {

                   ............................................

                   if (mFocusedApp == token) {
                            // Whoops, we are below the focused app...  no focus for you!
                            if (localLOGV || DEBUG_FOCUS_LIGHT) Slog.v(TAG,
                                    "findFocusedWindow: Reached focused app=" + mFocusedApp);
                            return null;
               

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值