其实Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity 的集合,这个栈也被称作返回栈(back stack)。栈是一种后进先出的数据结构,在默认情况 下,每当我们启动了一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。而每当我 们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前 一个入栈的Activity就会重新处于栈顶的位置。系统总是会显示处于栈顶的Activity给用户。
01.状态
运行状态,暂停状态,停止状态,销毁状态
02.Activity的生存期
onCreate():这个方法你已经看到过很多次了,我们在每个Activity中都重写了这个方 法,它会在Activity第一次被创建的时候调用。你应该在这个方法中完成Activity的初始化 操作,比如加载布局、绑定事件等。
onStart():这个方法在Activity由不可见变为可见的时候调用。
onResume():这个方法在Activity准备好和用户进行交互的时候调用。此时的Activity一 定位于返回栈的栈顶,并且处于运行状态。
onPause():这个方法在系统准备去启动或者恢复另一个Activity的时候调用。我们通常 会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执 行速度一定要快,不然会影响到新的栈顶Activity的使用。
onStop():这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区 别在于,如果启动的新Activity是一个对话框式的Activity,那么onPause()方法会得到执 行,而onStop()方法并不会执行。
onDestroy():这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状 态。 onRestart():这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity 被重新启动了。
以上7个方法中除了onRestart()方法,其他都是两两相对的
03.生命周期的代码实战
MainActivity:
package com.example.activitylifecycletest
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.PersistableBundle
import android.util.Log
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val normalButton: Button =findViewById(R.id.startNormalActivity)
normalButton.setOnClickListener {
val intent= Intent(this,NormalActivity::class.java)
startActivity(intent)
}
val dialogButton:Button=findViewById(R.id.startDialogActivity)
dialogButton.setOnClickListener {
val intent=Intent(this,DialogActivity::class.java)
startActivity(intent)
}
}
override fun onStart() {
super.onStart()
Log.d("tag","onStart")
}
override fun onResume() {
super.onResume()
Log.d("tag","onResume")
}
override fun onPause() {
super.onPause()
Log.d("tag","onPause")
}
override fun onStop() {
super.onStop()
Log.d("tag","onStop")
}
override fun onDestroy() {
super.onDestroy()
Log.d("tag","onDestroy")
}
override fun onRestart() {
super.onRestart()
Log.d("tag","onRestart")
}
}
NormalActivity:
package com.example.activitylifecycletest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class NormalActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_normal)
}
}
DialogActivity:
package com.example.activitylifecycletest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class DialogActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dialog)
}
}
04.Activity的启动模式
standard是Activity默认的启动模式,在不进行显式指定的情况下,所有Activity都会自动使用这种启动模式
在该模式中,每启动一个新活动,都会创建一个新的实例,并在任务栈中入栈,处于栈顶的位置。假设你不停地进入同一个活动,你点击了十次,就要返回十次才能退出程序,因为你在返回栈中创造了十个相同的实例,尽管活动是一样的。
singleTop模式:在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例,否则就创建新活动并压入栈顶。
通过修改 android:launchMode="singleTop"来确认启动模式,其他模式以此类推
singleTask模式:每次启动该Activity时, 系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例, 并把在这个Activity之上的所有其他Activity统统出栈,如果没有发现就会创建一个新的 Activity实例。
singleInstance模式:最特殊的模式,系统为该模式的活动分配一个独立的任务栈,该任务栈有且只有一个该活动实例。也就是说,如果已经创建过目标活动实例,那么将不会创建新的任务栈,而是唤醒之前创建过的活动实例。
05.启动Activity
companion object 后续重点介绍下
06.