前言
Activity是安卓提供给用户与手机之间可交互的界面组件,也是四大组件中比较重要的组件。那么?
Activity从创建到销毁过程是怎么样的呢?
我们从以下几个知识点做分析:
- Activity五个状态
- Activity的生命周期
- Activity横竖屏生命周期
- Activity四种启动方式
- Activity问题总结
Activity五个状态
Starting-> running-> poused-> stopped-> killed
关于activity四个状态所在的生命周期:
- 启动状态(Starting):Activity的启动状态很短暂,当Activity启动后便会进入运行状态(Running)。
- 运行状态(Running):Activity在此状态时处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互。如单击、长按等事件。即使出现内存不足的情况,Android也会先销毁栈底的Activity,来确保当前的Activity正常运行。
- 暂停状态(Paused):在某些情况下,Activity对用户来说仍然可见,但它无法获取焦点,用户对它操作没有没有响应,此时它处于暂停状态。
- 停止状态(Stopped):当Activity完全不可见时,它处于停止状态,但仍然保留着当前的状态和成员信息。如系统内存不足,那么这种状态下的Activity很容易被销毁。
- 销毁状态(Destroyed):当Activity处于销毁状态时,将被清理出内存。
注:还有一种情况由于系统内存不足可能在Paused状态中直接被系统杀死达到killed状态。
activity的生命周期
oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()
上面图概括了activity生命周期的各个环节,描述了activity从生成到销毁的过程。
- onCreate() : 在Activity创建时调用,通常做一些初始化设置;
- onStart(): 在Activity即将可见时调用;
- onResume(): 在Activity已可见,获取焦点开始与用户交互时调用;
- onPause(): 在当前Activity被其他Activity覆盖或锁屏时调用;
- onStop() : 在Activity对用户不可见时调用;
- onDestroy() :在Activity销毁时调用;
- onRestart() : 在Activity从停止状态再次启动时调用;
下面在Android Studio上创建一个Empty Activity工程来验证activity生命周期的各个环节
创建一个Empty Activity工程 (kotlin版本)
创建一个新的Empty Activity工程
工程名LifeCycle, 语言选择Kotlin。
主活动程序如下,只包含一个Activity创建时调用的初始化方法onCreate()
package com.example.lifecycle
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.example.lifecycle.ui.theme.LifeCycleTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
LifeCycleTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
LifeCycleTheme {
Greeting("Android")
}
}
创建其他Activity生命周期方法
其他方法为onstart(),onResume(),onRestart(),onPouse(),onStop()和onDestory()
为了可以调试看到各个生命周期的调用过程,定义一个字符串变量TAG="mytag", 在各个生命周期方法中调用Log.d()输出log。
private val TAG = "mytag"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
LifeCycleTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
Log.d(TAG,"onCreate:")
}
override fun onStart() {
super.onStart()
Log.d(TAG,"OnStart:")
}
override fun onResume() {
super.onResume()
Log.d(TAG,"onResume:")
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
Log.d(TAG,"onStop:")
}
override fun onRestart() {
super.onRestart()
Log.d(TAG, "onRestart:")
}
override fun onDestroy() {
super.onDestroy()
Log.d(TAG,"onDestroy:")
}
在Logcat窗口观察过程
在虚拟设备上运行,打开Logcat窗口,跟踪变量mytag。
第一次启动时,过程为oncreate()->onstart()->onResume():
按home键退出时,过程为调用onStop():
重新调入时,onRestart()->onstart()->onResume():
横竖屏切换时,过程为onStop()->onDestory()->oncreate()->onstart()->onResume():