看见大多数Activity翻译成 活动, 为了便于理解我就把它当做 页面 吧。
生命周期对应页面创建过程中的不同阶段。先上一张官方图:
可以看出页面的几种状态:
- running: 当前页面聚焦
- paused: 当前页面被暂停,比如多任务切换时的卡片状态
- stopped:比如跳转到一个新的页面
- killed:比如退出应用
生命周期钩子:
-
onCreate
: 这个是必须调用的,就好比如React.js 中 必须调用render()
方法一样。多用于初始化一些成员变量,配置UI资源,比如调用setContentView(R.layout.main_activity)
-
onStart
: 此时页面已经可见,可用于绘制元素,开启动画等,这个阶段十分的短暂,马上会进入onResume
阶段 -
onResume
: 这个可以说是页面的稳定阶段了,如果不做任何操作,页面将维持在这个阶段。如果出现中断操作,比如来电话了,打开相机,跳转到其它页面,多窗口模式等,则这个阶段结束,进入onPause
阶段 -
onPause
: 这个阶段和onStart
一样十分短暂,任何无法聚焦到当前页面的操作,都会导致进入onPause 阶段,比如打开一个半透明的modal框(Android里面好像叫dialog),还有切换应用时。 不用在这里保存应用状态,保存数据,发起网络请求,读写数据库等操作 -
onStop
: 页面对用户不可见时,在onPause之后就会进入这个阶段。在这个阶段可以用于保存应用状态,保存数据,发起网络请求,读写数据库等操作 -
onDestroy
: 做一些清理操作,类似于React.js 里面的componentWillUnmount
。 -
onRestart
: 这个表示页面一开始可见,然后变为不可见,再从不可见变为可见的阶段,这个阶段进入后马上进入onStart
阶段
示例
假设有 A
和 B
2个Activity,对应2个页面,其中 A
页面是MainActivity, 下面操作可以大致了解上面生命周期的阶段
// A.kotlin
class A: AppCompatActivity() {
// 便于调试用的tag
private val tag = this::class.java.simpleName
private lateinit var button: Button // 这个按钮用于导航到B页面
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.A_activity)
Log.d(tag, "A onCreate")
button = findViewById(R.id.button)
button.setOnClickListener {
// 点击跳转到B
val intent = Intent(this, B::class.java)
startActivity(intent)
}
}
override fun onRestart() {
super.onRestart()
Log.d(tag, "A onRestart")
}
override fun onStart() {
super.onStart()
Log.d(tag, "A onStart")
}
override fun onResume() {
super.onResume()
Log.d(tag, "A onResume")
}
override fun onPause() {
super.onPause()
Log.d(tag, "A onPause")
}
override fun onStop() {
super.onPause()
Log.d(tag, "A onStop")
}
override fun onDestroy() {
super.onPause()
Log.d(tag, "A onDestroy")
}
}
B Activity:
// B.kotlin
class B: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.B_activity)
Log.d(tag, "B onCreate")
}
override fun onRestart() {
super.onRestart()
Log.d(tag, "B onRestart")
}
override fun onStart() {
super.onStart()
Log.d(tag, "B onStart")
}
override fun onResume() {
super.onResume()
Log.d(tag, "B onResume")
}
override fun onPause() {
super.onPause()
Log.d(tag, "B onPause")
}
override fun onStop() {
super.onPause()
Log.d(tag, "B onStop")
}
override fun onDestroy() {
super.onPause()
Log.d(tag, "B onDestroy")
}
}
- 打开应用,然后点返回退出应用
A页面为MainActivity,打开A页面然后退出应用,流程为:
进入A页面:
A onCreate ----> A onStart ----> A onResume
点击返回退出:
A onPause ----> A onStop ----> A onDestroy
- A -> B -> A
即从A页面进入B页面, 再从B页面返回A页面。
打开A页面:
A onCreate ----> A onStart ----> A onResume
进入B页面:
// 可以看出 A onPause 和 A onStop 中间穿插着B的创建过程
A onPause ---->
B onCreate ----> B onStart ----> B onResume ---->
A onStop
从B返回A页面:
// 此时A的 onRestart 触发
B onPause ---->
A onRestart ----> A onStart ----> A onResume ---->
B onStop ----> B onDestroy
- A页面 进入 悬浮状态 然后再次获取焦点
即类似ios切换应用时,应用悬浮状态
A失去焦点:
A onPause ----> A onStop
A再次获取焦点:
A onRestart ----> A onStart ----> A onResume
这些是暂时了解的Activity生命周期,另外和生命周期可能相关的点有:
onSaveInstanceState(outState: Bundle?) & onRestoreInstanceState(savedInstanceState: Bundle? )
关于应用状态保存的问题Intent & startActivity & startActivityForResult & onActivityResult
等页面之间的切换,或者跳转到其它应用等Lifecycles-Aware Components
组件对生命周期的封装,实现复用。实现LifecycleObserver
, 使用@OnLifecycleEvent(Lifecycle.Event.ON_XXX生命周期)
上面相关的点有待后续学习,详细可以参考
2019年08月20日15:42:26