android焦点切换,android – 使用FLAG_ACTIVITY_REORDER_TO_FRONT在持续运行的UI活动之间切换会导致“无窗口焦点”错误...

我的目标是保持两个UI活动,并在它们之间来回切换,而不必杀死/重启其中任何一个.但是使用FLAG_ACTIVITY_REORDER_TO_FRONT执行此操作会产生严重的副作用:当我恢复上一个活动(当前正在后台运行)时,会失去窗口焦点.

我通过花费5分钟创建一个包含两个“Hello World”活动的简单应用程序来证明这个问题.

>应用程序以活动A开始,活动A只显示一个名为“启动B”的按钮(没有别的).

>按此按钮 – 执行startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT,ActivityB.class).

>活动B变为活动状态,只显示一个名为“启动A”的按钮.

>按此按钮 – 执行startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT,ActivityA.class).

> Activity A的onResume()按预期调用,一切看起来都很好(我再次看到Activity A内容).

>按设备的返回键,这组错误将在100%的时间内发生:

E/ActivityManager( 513): Reason: Input dispatching timed out (Waiting

because no window has focus but there is a focused application that

may eventually add a window when it finishes starting up.)

I/WindowState( 513): WIN DEATH: Window{5294687c u0

com.android.launcher/com.android.launcher2.Launcher}

W/ViewRootImpl( 8066): Dropping event due to no window focus:

KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0,

metaState=0, flags=0xc8, repeatCount=1, eventTime=14965546,

downTime=14965045, deviceId=-1, source=0x101 }

(从用户的角度来看,窗口死亡的实际结果本质上是“崩溃” – Android会将用户从应用程序中抛回主屏幕,尽管技术上应用程序仍然在后台运行.)

我调试了这个并发现Activity A可见但没有焦点的原因是因为活动A的onWindowFocusChanged()没有像通常那样调用(即使调用onResume()).这与活动B在后台仍处于活动状态的事实有关(即使B已经失去焦点 – 为B调用onWindowFocusChanged(false),以及onStop()).我知道这是因为在上面的第4步之后如果我立即调用活动B上的finish(),将调用活动A的onWindowFocusChanged(true)并且一切正常.活动B仍然活跃但不集中的事实干扰了活动A重新获得焦点.这是一个Android错误还是我错过了什么?

请注意,如果活动A中有多个视图,并且我在上面的步骤6之后触摸其中一个视图,我会得到相同的“由于没有窗口焦点而丢弃事件”错误,尽管由于某种原因不是100%的时间.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值