onWindowFocusChange与Activity生命周期之间的关系

以下部分转载自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是否对用户可见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值