前言
在接手的项目中,看到了onWindowsFocusChanged()的方法,抽空了解下它的用途
内容
概述
从字面上来讲,onWindowsFocusChanged()方法是指当窗口焦点变化的时候;从意义来说,onWindowsFocusChanged()就是指当前的Activity的Windows(窗口)获取或者失去焦点时这个方法就会被调用,并且当回调这个方法时,Activity是完全可见的。
在Activity生命周期中,onStart(), onResume(), onCreate()都不是布局visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。从onWindowFocusChanged()被执行起,用户可以与应用进行交互了,换句话说,如果你想要在Activity加载后做些操作,可以在这个方法里调用而这之前,对用户的操作需要做一点限制。
onWindowFocusChanged()的使用情景与作用
根据介绍可以了解,onWindowFocusChanged()使用于以下等情景:
首次进入一个Activity后会在onResume()方法后面调用;
从Activity 跳到另一个Activity,新的窗口会获取焦点, 就的Activity的窗口会失去焦点;
打开软键盘进行输入时,窗口失去焦点;
软键盘输入完毕消失时,窗口重新获取焦点;
应用进入后台,窗口失去焦点;
应用从后台返回当前, 窗口重新获取焦点;
…
因此其可以有如下作用:
监控一个Activity是否载完毕;
在Activity加载后进行一些操作,如获取手机屏幕的高度和宽度;
当Activity挂起或恢复时,可以在方法内进行一些数据的保存或恢复的操作;
…
onWindowFocusChanged()调用详解
介绍完onWindowFocusChanged()基本的使用情景以及作用后,撸个demo来看下onWindowFocusChanged()具体的调用情况。
首先在Activity中重写的onWindowFocusChanged()方法如下:
|
|
其中参数hasFocus表示窗口是否获取或失去焦点,true表示获取焦点,false表示失去焦点。
然后我们看下总体的代码:
|
|
运行该Demo,查看Log日志,可以得到以下日志结果。
1. 启动Activity时:
2. 按下任务栏键,Activity被遮挡时:
注意:按锁屏键和按任务栏或者Home键的生命周期是不同的,按Home执行onPause –> onStop –> onRestart –> onStart —> onResume 按锁屏键和对话框覆盖界面的生命周期是一样的,都只会进行onPause --> onResume .不会执行onStop,onRestart,onStart。
3. Activity恢复到前台时:
4. Activity退出时:
从上面的例子以及结果可以清楚的onWindowFocusChanged()在整个Activity生命周期内的调用情况,可以根据这些结果,在开发中来充分利用onWindowFocusChanged()方法的作用。
onWindowFocusChanged()源码分析
通过Activity源码去查看,发现onWindowFocusChanged()这个方法出现在WindowCallbackWrapper.java和View.java这两个类中,而WindowCallbackWrapper.java中其实也是调用View.java中的onWindowFocusChanged(),其代码如下:
|
|
从源码可以验证出,onWindowFocusChanged()方法被回调的触发时机是窗口获取或失去焦点的时候。并且在onResume()方法中的官方解释 Use {@link #onWindowFocusChanged} to know for certain that your activity is visible to the user (for example, to resume a game). 可以知道onWindowFocusChanged()第一次调用是在onResume()方法后面。
版权声明:本文为博主原创文章,转载请注明出处KidSea