其实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. 

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: