以下部分转载自http://blog.csdn.net/qweewqpkn/article/details/45890981
一.函数调用情形
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
二.调用情形分析
1.onPause 和 onStop 有什么不同
我们可以对比一中的14和16的情形,可以发现,只要A activity还可见,就不会调用A onStop。所以我们可以知道onStop调用时机是:当一个activity对用户已经不可见的时候就会调用。
官方说明:onStop可能永远不会被调用:当处于低内存状态下,系统没有足够的内存保持你的activity的处理运行在activity的onPause调用之后。
从(b)知道onStop在低内存情况下不会被调用,但是:onPause一定会被调用! 所以我们可以将一些保存当前activity的数据的行为,放到onPause()中调用!!!!
onPause中处理保存activity中的数据,对应的我们在onResume中恢复保存的数据。
2.onWindowFocusChanged 官网文档解释
当前activity的窗口获得或失去焦点的时候会调用,这个函数是最好的方向标对于activity是否对用户可见,它默认的实现是清除键跟踪状态,所以应该总是被调用。
它也提供了全局的焦点状态,它的管理是独立于activity生命周期的。当焦点改变时一般都伴随着 生命周期的改变,你不应该依赖onWindowFocusChanged 调用和其他生命周期的方法(例如onResume) 的先后顺序,来处理我们要做的事情。
通常的规则是,当一个activity被唤醒,那么就拥有窗口焦点。除非这个窗口已经显示了对话框或者其他弹出框抢占焦点,这个窗口只有等到这些对话框关闭后,才能获取焦点,同理,当系统显示系统级的窗口,系统级的窗口会临时的获取窗口输入焦点同时不会暂停前景 activity.
自我总结:我们可以从一得调用情形中发现:大多数情况下只要调用了onResume 就会调用 onWindowFocusChanged,但是也可以发现当我们显示下拉菜单的时候只会调用onWindowFocusChanged。我们可以假设一个情况:我们在下拉菜单中改变了网络的状态(开启或者关闭),我们这时候就不能在onResume()中处理更新网络状态,而应该将更新网络状态放到onWindowFocusChanged中处理。
3.onResume 官网文档解释
对于你的activity来说,onResume调用后就可以和用户交互,这是很好的地方去开始动画,打开互斥访问设备元件(例如:照相机),etc.
但是有一点我们必须认清:onResume不是用来说明你的activity对于用户是可见的最好的指向标,例如系统的窗口可能在你的activity前面。所以应该用onWindowFocusChanged来判断我们的activity是否对用户可见。