从图中咱们能够看出,Activity的主要生命周期有:onCreate()
、OnStart()
、OnRestart()
、OnResume()
、OnPause()
、OnStop()
、OnDestroy()
这7个方法。java
采用语音:Kotlin(基于1.2.61)
测试机:魅族 M15(基于Android 7.1.2)
项目名称:activity_basic_use
编译版本:
minSdkVersion 17
targetSdkVersion 26
复制代码
先新建4个文件,MainActivity
、SecondActivity
、ThirdActivity
、FourthActivity
,其中MainActivity
用来作跳转测试的主Activity
,SecondActivity
是普通的Activity
,ThirdActivity
是以Dialog
形式显示的Activity
,FourthActivity
使用透明主题的普通Activity
,并新建4个布局文件,布局文件很简单,再也不贴出布局文件中的代码,而后覆写相关的生命周期的方法,下面是MainActivity
代码:git
class MainActivity : Activity() {
private var button1:Button? = null
private var button2:Button? = null
private var button3:Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button1 = findViewById(R.id.button1)
button2 = findViewById(R.id.button2)
button3 = findViewById(R.id.button3)
button1?.setOnClickListener {
val intent = Intent(this,SecondActivity::class.java)
startActivity(intent)
}
button2?.setOnClickListener {
val intent = Intent(this,ThirdActivity::class.java)
startActivity(intent)
}
button3?.setOnClickListener {
val intent = Intent(this,FourthActivity::class.java)
startActivity(intent)
}
println("MainActivity->onCreate")
}
override fun onStart() {
super.onStart()
println("MainActivity->onStart")
}
override fun onRestart() {
super.onRestart()
println("MainActivity->onRestart")
}
override fun onResume() {
super.onResume()
println("MainActivity->onResume")
}
override fun onPause() {
super.onPause()
println("MainActivity->onPause")
}
override fun onStop() {
super.onStop()
println("MainActivity->onStop")
}
override fun onDestroy() {
super.onDestroy()
println("MainActivity->onDestroy")
}
}
复制代码
而后是SecondActivity
里面的代码:github
class SecondActivity : Activity() {
private var button2: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
button2 = findViewById(R.id.button2)
button2?.setOnClickListener{
finish()
}
println("SecondActivity->onCreate")
}
override fun onStart() {
super.onStart()
println("SecondActivity->onStart")
}
override fun onRestart() {
super.onRestart()
println("SecondActivity->onRestart")
}
override fun onResume() {
super.onResume()
println("SecondActivity->onResume")
}
override fun onPause() {
super.onPause()
println("SecondActivity->onPause")
}
override fun onStop() {
super.onStop()
println("SecondActivity->onStop")
}
override fun onDestroy() {
super.onDestroy()
println("SecondActivity->onDestroy")
}
}
复制代码
Home
键后,再次点击应用图标后,获得如下输出:
返回
键后,获得如下输出:
button1
按钮后,跳转到SecondActivity
,获得如下输出:
SecondActivity
中的按钮后,获得如下输出:
button2
按钮后,弹出Dialog
形式的ThirdActivity
,获得如下输出:
ThirdActivity
中的按钮后,获得如下输出:
button3
按钮后,显示透明主题的Activity
,获得如下输出:
FourthActivity
中的按钮后,获得如下输出:
onCreate()面试
这是生命周期的第一个方法,表示Activity
正在建立,在这个方法中,咱们能够作一些初始化操做,好比加载布局资源、初始化Activity
相关数据等。bash
onStart()ide
表示Activity
正在被启动即将开始,这时Activity
已经可见了,只不过尚未出如今前台,没法和用户进行交互。能够理解为Activity
已经显示出来了,可是用户看不到。布局
onRestart()测试
表示Activity
正在从新启动,通常状况下,当Activity
从不可见状态从新变为可见状态后,此方法就会被回调,这种情形通常都是用户行为所致使的,好比用户按下Home
键后或者打开了一个新的Activity
,接着又回到了这个Activity
,就会出现这种状况。字体
onResume()动画
表示Activity
已经可见了,而且出如今前台开始活动,能够和用户进行交互。须要注意onStart
和onResume
的对比,两者都表示Activity
可见,可是onStart
表示Activity
在后台而且没法和用户进行交互,而onResume
表示Activity
已经显示在前台,能够和用户进行交互。
onPause()
表示Activity
正在被中止,此时能够作一些数据存储、动画中止等,但不能是耗时的操做。通常状况下会接着回调onStop
方法,若是此时再次回到这个Activity
后,会接着回调onResume
方法。但也有特殊状况,好比显示一个以Activity
形式的Dialog
或者采用了透明主题就不会回调onStop
方法。
onStop()
表示Activity
正在被中止,此时Activity
变得不可见,在这个方法中能够作一些稍微重量级的回收工做,但也不能太耗时。
onDestroy()
表示Activity
正在被销毁,这是Activity
生命周期的最后一个方法,在这个方法中,咱们能够作回收工做和一些资源的释放。
从整个生命周期来讲,onCreate()
和onDestroy()
是配对的,表示Activity
的建立和销毁,而且只能回调一次;onStart()
和onStop()
是配对的,这是从Activity
是否可见来讲的,随着用户的操做和屏幕的点亮或者熄灭,这2个方法会回调屡次;onResume()
和onPause()
是配对的,这是从Activity
是否在前台来讲的,随着用户的操做和屏幕的点亮或者熄灭,这2个方法会回调屡次。onStart()
+onStop()
和onResume()
+onPause()
,这两组回调方法表示的意义不一样,onStart()
+onStop()
是从Activity
是否可见这个角度来回调的,onResume()
+onPause()
是从Activity
是否位于前台这个角度来回调的,除了这种区别,在实际使用中并无其余明显区别。
锁屏
Activity
没有被系统回收,就是普通的切换到不可见状态;若是被系统回收后,会销毁当前
Activity
,而后从新建立一个。
旋转屏幕(程序运行时,默认都是竖屏)
Manifest
中进行设置,竖屏切到横屏(横屏再切回到竖屏,输出是和下面同样的,也就是说会回调2次):
Activity
被销毁,而后从新建立,此时就算重写了onConfigurationChanged
方法,也不会调用此方法Manifest
中设置MainActivity
的configChanges="orientation|screenSize"
,并重写onConfigurationChanged
方法,会获得如下输出:Activity
并无销毁,而是回调了onConfigurationChanged
方法Activity
也没有被销毁,也是回调了onConfigurationChanged
方法故从以上能够知道,配置configChanges="orientation|screenSize"
能够阻止Activity
的销毁与从新建立,若是少了其中的任何一个,都会致使Activity
的销毁。
属性值 | 说明 |
---|---|
locale | 用户所在区域发生变化,通常是用户切换了语言 |
keyboardHidden | 键盘的可用性发生了改变,好比调出或隐藏了键盘 |
fontScale | 字体比例发生了变化 |
orientation | 屏幕方向发生了变化 |
screenSize | 屏幕尺寸发生了变化 |
更多的属性值,直接截取《Android开发艺术探索》中的图:
保存数据
屏幕方向发生了旋转,或者Activity
因为资源内存不足被系统杀死等异常销毁,而且有机会从新显示,系统会回调两个方法:onSaveInstanceState(outState:Bundle?)
和onRestoreInstanceState(savedInstanceState:Bundle?)
。若是在EditText
或者其余控件中有值的话,能够在onSaveInstanceState
方法中,调用Bundle
对象的相关putXxx
方法进行存储,而后在onRestoreInstanceState
方法或者onCreate
中调用Bundle
的getXxx
方法进行获取对应的值,通常咱们推荐在onCreate
中进行获取。注意:在正常的生命周期中并不会回调这两个方法
项目地址: github.com/leewell5717…
本文对Activity
生命周期的基础作了一些讲述,生命周期对于咱们来讲是很是重要的,也有许多面试官喜欢问关于生命周期的基础,可能本文总结的不是很全面,或者有错误的地方,欢迎指出,也欢迎给我一些建议,我将在后面的写做中提高本身。