生命周期
活动状态
- 运行状态
栈顶且可见 此时Activity可以和用户交互,有焦点,strongly recommend 不回收此状态下活动 - 暂停状态
非栈顶且可见 虽然可见但是已经不可交互,无法获取焦点,例如弹窗下面的界面,虽然可见但是点了没反应。同样strongly recommend 不回收此状态下活动 - 停止状态
即不再栈顶而且不可见 此时Activity已经完全不可见,但是系统仍会保存该Activity的信息。当内存不足时可能被系统回收 - 销毁状态
出栈 被回收
共有7个callback,关联到生命周期的每一个环节
what is callback func?
callback is just a name to describe a method that’s supplied as an argument to another method, such that when the parent method is called
Method | 描述 |
---|---|
onCreate() | Activity首次创建时调用,并初始化可见控件 |
onStart() | 对用户可见 |
onResume() | Activity进入运行状态,可于用户交互 |
onPause() | 失去焦点,仅部分可见,进入暂停状态 |
onStop() | Act完全不可见 |
onDestroy() | 将在Act被系统回收前调用 |
onRestart() | 在Act从停止状态回到运行前调用 |
Activity恢复
当Act变为完全不可见时,很可能被系统回收,再次打开后重启生命周期,从onCreate()
开始,但是之前留存在Act中的数据丢失了,就需要用户充填,影响用户体验。
为了解决这一问题,使用onSaveInstanceState()
保存被回收Act中的信息,该方法保证在Act被回收前一定被调用
When exactly are onSaveInstanceState() and onRestoreInstanceState() called?
Prior to Honeycomb, activities were not considered killable until after they had been paused, meaning that onSaveInstanceState() was called immediately before onPause(). Beginning with Honeycomb, however, Activities are considered to be killable only after they have been stopped, meaning that onSaveInstanceState() will now be called before onStop() instead of immediately before onPause().
在Honeycomb之前,Act直到进入暂停状态才被认为时可kill的,这意味着onSaveInstanceState()
在onPause()
执行前调用;
从Honeycomb开始,Act进入停止状态才认为是可kill的,因此onSaveInstanceState()
将在onStop()
而不是onPause()
前调用
onSaveInstanceState()
可能调用的时刻:
- 锁屏
- 点击home
- 其他App进入前台
- 屏幕方向改变
- 点及back(用户主动销毁)
onSaveInstanceState()
将Act的信息保存在Bundle中,重新启动时传入onCreate(Bundle savedInstancesState)
,重构Act。
onSaveInstanceState()
仅适合于保存瞬态数据,而不应持有持久化数据(出门左转数据库)
不同场景下对Activity生命周期的影响
-
横竖屏切
参考链接:android-----横竖屏切换对Activity生命周期的影响
设置Activity的android:configChanges属性为orientation或者orientation|keyboardHidden或者不设置这个属性
设置Activity的android:configChanges属性为orientation|screenSize或者orientation|screenSize|keyboardHidden
或者直接设置参数禁止切屏,一劳永逸,从根源解决问题 -
按下back
-
按下home
Activity间数据传递
- Intent
// code - Bundle
将信息直接/序列化写入Bundle,再通过Intent传递 - startActivityForResult
// code - Application
Activity启动模式
- standard
系统并不在乎栈中是否已经有该Act实例,每次启动都是新建一个实例
这样每次打开一个页面都会向栈中新增一个Act,当用户退出时,只有把栈中所有的Act都清除才能退出,用户体验差 - singleTop
如果栈顶就是要新建的Act实例,则直接使用,不再新建;如果栈顶不是,则并不在乎栈中是否已经有该Act实例:新建
适合于接收 通知启动的内容显示页面 - singleTask
系统每次启动前首先检查栈中是否有该Act实例,如果有该实例,则直接使用,并把该实例之上的所有Act弹出;没有新建
适用于做App的首页 - singleInstance
单独启用栈管理该Act实例,后续的请求均不会创建新的Activity实例,整个App公用这个单例
关于栈;
应用通过栈管理Act,一个App默认一个栈,如果需要多个栈则需要手动指定