细细学习Activity的生命周期


返回栈

Android中的Activity是可以层叠的,每启动一个新的Activity,就会覆盖在原Activity之上,然后点击Back键会销毁最上面的Activity,下面的一个Activity就会重新显示出来
Android是使用任务来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作为返回栈

每当新启动一个Activity,他就会在返回栈中入栈,并处于栈顶的位置,
每当我们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,系统总是会显示处于栈顶的Activity给用户

在这里插入图片描述

Activity状态

每个Activity在其生命周期中最多可能会有4种状态

运行状态

当一个Activity位于返回栈的栈顶时,Activity就处于运行状态,系统最不愿意回收的就是处于运行状态的Activity,因为这带来非常差的用户体验

暂停状态

当一个Activity不再处于栈顶位置但仍然可见时,Activity就处于暂停状态,处于暂停状态的Activity仍然是完全存活着的,系统也不愿意回收这种Activity(因为它还可见,回收可见的东西都会在用户体验有不好的影响)
Q:为什么Activity已经不在栈顶了,怎么会可见呢?
这是因为并不是每一个Activity都会占满整个屏幕,比如对话框形式的Activity只会占用屏幕中间的部分区域

停止状态

当一个Activity不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态,系统仍然会为这种Activity保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的Activity有可能会被系统回收

销毁状态

一个Activity从返回栈中移除后就变成销毁状态,系统最倾向于回收这种状态的Activity,以保证手机的内存充足

Activity的生存期

Activity类定义了7个回调方法,覆盖了Activity生命周期的每一个环节

onCreate()

我们在每个Activity中都重写了这个方法,它会在Activity第一次被创建的时候调用,你应该在这个方法中完成Activity的初始化操作,比如加载布局,绑定事件等

onStart()

这个方法在Activity由不可见变为可见的时候调用

onResume()

这个方法在Activity准备好和用户进行交互的时候调用,此时的Activity一定位于返回栈的栈顶,并且处于运行状态

onPause()

这个方法在系统准备去启动或者恢复另一个Activity的时候调用,我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶Activity的使用

onStop()

这个方法在Activity完全不可见的时候调用

onDestroy()

这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态

onRestart()

这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了

在这里插入图片描述

Activity回收问题

当一个Activity进入了停止状态,是有可能被系统回收的,假设:应用中有一个ActivityA,用户在ActivityA的基础上启动了ActivityB,那么A就进入了停止状态,这个时候由于系统内存不足,将A回收掉了,当用户按下back返回A的时候会出现什么情况?
其实还会正常显示A的,只不过不会执行onRestart()方法,而是执行A的onCreate()方法,会被重新创建一次
Q:A中会不会存在临时数据和变量的?重新创建就丢失数据了怎么办?
在MainActivity中添加如下代码进行保存:

override fun onSaveInstanceState(outState:Bundle){
    
    
	super.onSaveInstanceState(outState)
	val tempData="something you just typed"
	outState.putString("data_key",tempData)
}

恢复数据操作:

override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        Log.d(tag,"onCreate")
        setContentView(R.layout.activity_main)
        if(savedInstanceState!=null){
    
    
			val tempData=savedInstanceState.getString("data_key")
			Log.d(tag,tempData)
		}
        
}

猜你喜欢

转载自blog.csdn.net/Hedenghui777/article/details/121750837