android activity lifecycle (doc)
暂停(pause your activity)
一般在onPause()
方法中,应该做一下几件事:
停止动画以及一些消耗cpu的操作
提交未保存的改动;那些在用户离开时,希望持久化的但是尚未保存的改动,例如:邮件草稿
释放系统资源,例如:广播、传感器(gps)、其他用户不需要且影响系统电量的资源
1 | // 官方示例:camera |
- 通常,你不用在
onPause()
中持久化数据,除非你确定用户期望持久化。但是绝对不能在onPause()
方法中执行消耗cpu的工作,如写入数据库,它会延缓用户进入下一个activity。应该在onStop()
方法中做这些事
重新开始(resume your activity)
在
onResume()
方法中初始化在onPause()
方法中释放的组建初始化其他一些在resumed state需要执行的操作,例如:开始动画,一些activity获得用户焦点时需要的组建
1 | // 官方例子:初始化在onPause()方法中释放的camera |
停止和重启(stopping and restarting an activity)
以下3种情况下,你的activity会stopped, restarted
用户从当前app进入到另一个app,当前app的前台activity就stopped。如果用户通过home页面的app图标或者最近打开的app窗口回到你app的activity,那activity就restart了
在同一个app中,用户从当前activity进入到另一个activity,则当前activity就stopped,如果用户通过back button回到前一个activity,那activity就restart了
在使用app的过程中,接电话
stop your activity
当app stopped以后,如果system需要内存时,就会destroy activity的实例
极端情况:系统只是简单的kill了app的进程,并没有调用
onDestroy()
方法,为了防止内存泄漏,手动调用onStop()
方法是很必要的尽管在
onStop()
方法之前会调用onPause()
方法,但是你仍需要在onStop()
方法中执行一些大的,消耗的cpu的操作,比如写入数据到数据库
1 | // 官方案例: |
重新创建(recreating an activity)
destroy activity: 当使用back button 或者 调用
finish()
方法结束activity,这种情况的销毁,系统认为activity instance已经销毁destroy activity: 长时间在后台不运行的activity,且系统需要内存,这种情况的系统强制销毁,尽管activity instance已经不在了,但是系统仍然认为它存在,当你使用导航再次回到该activity时,系统会创建一个new instance使用之前存储的数据
注意:当屏幕旋转时,activity会经过destroyed 和 recreated两个过程。当横竖屏切换时,activity可能需要重新加载可选的资源文件
onSaveInstanceState()
onRestoreInstanceState()
onCreate()
Bundle
保存activity的状态(save your activity state)
- 在activity准备停止stop时,系统会调用
onSaveInstanceState()
方法,你可以使用key-value键值对保存一些信息。默认的,该方法会存储view的层级结构,listview的滑动位置,edittext的文字等。如果需要额外的信息,就需要Bundle
对象
1 | static final String STATE_SCORE = "playerScore"; |
恢复activity的状态(restore your activity state)
- 可以在
onCreate()
方法中恢复
1 | @override |
- 也可以在
onRestoreInstanceState()
方法中恢复,该方法在onStart()
之后进行
1 | @override |