序号 | 现象描述 |
1 | 进入最近任务栏,发现最近任务栏中的快照也是主界面的Activity,且显示错误。 |
2 | 通过adb查看任务栈信息,发现任务栈信息正常,银联二维码界面确实在HomeActivity之上,但被应用快照遮住。 |
3 | 页面点击事件响应的是银联二维码页面的点击事件。 |
4 | 页面进入后台后重新打开,执行onStop->onRestart->onStart->onResume流程,银联二维码页面恢复正常。 |
在Activity启动的前期准备阶段,系统会借助PMS确认需要启动的Activity,并对intent、权限等进行验证,同时根据launcheMode和flag配置task,为了提升用户体验,系统会加载一个快照(预览窗口)进行过渡,当按下home键时,framework会保存当前应用的快照,该快照可以通过taskId获取,当应用从后台进入前台时,系统会先显示这个快照,再开始执行当前Activity的生命周期方法,在某些情况下,如跳转到银联二维码界面时,如果应用进入前台触发了绘制快照但销毁快照失败,就会导致银联二维码界面被主界面的快照遮住。
对跳转到银联二维码界面的跳转方法延时500毫秒,以确保主界面HomeActivity组件初始化完毕,从而成功销毁快照,这样可以有效避免银联二维码界面被主界面快照遮住的问题。
1. 为什么需要加载快照?
答:加载快照是为了提升用户体验,在Activity启动过程中,通过显示快照可以让用户更快地看到应用的预览,减少等待时间。
2. 快照是如何生成的?
答:快照是在Activity启动的前期准备阶段生成的,系统会根据当前应用的状态和界面元素生成一个预览图像,并保存为快照,当应用从后台进入前台时,系统会先显示这个快照。
3. 如何确保快照能够正确销毁?
答:为了确保快照能够正确销毁,可以在跳转到新Activity时适当延时,以确保主界面组件已经初始化完毕,还可以检查代码中是否存在导致快照无法正确销毁的逻辑或异常情况。