1.启动游戏
onCreate
onStart
onResume
onWindowFocusChanged
2.锁屏(已启动游戏)
onPause
onStop
onWindowFocusChanged
3.开锁(已启动游戏)
onRestart
onStart
onReume
onWindowFocusChanged
4.home键(已启动游戏)
onPause
onWindowFocusChanged
onStop
5.多任务切回程序(开启程序,home键切换程序到后台)
onRestart
onStart
onResume
onWindowFocusChanged
6.点击应用图标重启程序(开启程序,home键切换到后台)
onRestart
onStart
onResume
onWindowFocusChanged
7.点击back键(已开启程序,back键未自己处理)
onPause
onWindowFocusChanged
onStop
onDestroy
8.点击多任务键(已开启程序)
onPause
onStop
onWindowFocusChanged
9.再点击多任务键切回程序(已开启程序,且已点击多任务键)
onRestart
onStart
onResume
onWindowFocusChanged
10.下拉菜单(已开启程序,从屏幕上往下拉)
onWindowFocusChanged
11.收回下拉菜单(已开启程序,且下拉菜单已显示)
onWindowFocusChanged
12.显示一个AlertDialog对话框(非全屏)
onWindowFocusChanged
13.关闭一个AlertDialog对话框(非全屏)
onWindowFocusChanged
14.从A activity 启动 B activity (已启动A activity, 点击button 启动Bactivity, B activity 全屏大小)
A onPause
A onWindowFocusChanged
B onCreate
B onSstart
B onResume
B onWindowFocusChanged
A onStop
15.从B activity 返回 A activity (A 启动了 B,现处于B activity)
B onPause
A onRestart
A onStart
A onResume
A onWindowFocusChanged
B onWindowFocusChanged
B onStop
B onDestroy
16.从A activity 启动 B activity (已启动A activity, 点击button 启动 B activity, B 是对话框风格Theme.Dialog ,即B activity 非全屏大小)
A onPause
A onWindowFocusChanged
B onCreate
B onSstart
B onResume
B onWindowFocusChanged
(a) 我们可以对比一中的14和16的情形,可以发现,只要A activity还可见,就不会调用A onStop。所以我们可以知道onStop调用时机是:当一个activity对用户已经不可见
的时候就会调用。
(b) 官方说明:onStop可能永远不会被调用:当处于低内存状态下,系统没有足够的内存保持你的activity的处理运行在activity的onPause调用之后。
(c) 从(b)知道onStop在低内存情况下不会被调用,但是:onPause一定会被调用! 所以我们可以将一些保存当前activity的数据的行为,放到onPause()中调用!!!!
(d) onPause中处理保存activity中的数据,对应的我们在onResume中恢复保存的数据。
当前activity的窗口获得或失去焦点的时候会调用,这个函数是最好的方向标对于activity是否对用户可见,它默认的实现是清除键跟踪状态,所以应该总是被调用。
它也提供了全局的焦点状态,它的管理是独立于activity生命周期的。当焦点改变时一般都伴随着 生命周期的改变,你不应该依赖onWindowFocusChanged 调用和其他生命周期的方法(例如onResume) 的先后顺序,来处理我们要做的事情。
通常的规则是,当一个activity被唤醒,那么就拥有窗口焦点。除非这个窗口已经显示了对话框或者其他弹出框抢占焦点,这个窗口只有等到这些对话框关闭后,才能
获取焦点,同理,当系统显示系统级的窗口,系统级的窗口会临时的获取窗口输入焦点同时不会暂停前景 activity.
自我总结:我们可以从一得调用情形中发现:大多数情况下只要调用了onResume 就会调用 onWindowFocusChanged,但是也可以发现当我们显示下拉菜单的时候
只会调用onWindowFocusChanged。我们可以假设一个情况:我们在下拉菜单中改变了网络的状态(开启或者关闭),我们这时候就不能在onResume()中处理更新
网络状态,而应该将更新网络状态放到onWindowFocusChanged中处理。
对于你的activity来说,onResume调用后就可以和用户交互,这是很好的地方去开始动画,打开互斥访问设备元件(例如:照相机),etc.
但是有一点我们必须认清:onResume不是最好的指向标说明你的activity对于用户是可见的,例如系统的窗口可能在你的activity前面。所以应该用:onWindowFocusChanged来知道我们的activity是否对用户可见。