Android之Activity全方位解析

一、Activity的生命周期

1、典型的生命周期

在这张图中,总共7种状态:

onCreate()与onDestroy()对应,存在状态

onStart()与onStop()对应,可见状态

onResume()与onPause()对应,前台状态,即可以进行点击操作等

而对于onRestart(),其执行具体过程:onStop() -> onRestart() -> onStart()

具体讲解如下:

  • onCreate():当Activity第一次创建时就会被调用。这是生命周期的第一个方法,该方法中可以做一些初始化工作,如调用setContentView加载界面布局资源。初始化Activity所需的数据。也可借助onCreate()方法中的Bundle对象来恢复异常清空下Activity结束时的状态。
  • onRestart():表示Activity正在重新启动。一般情况下,当当前Activity从不可见重新变成可见状态时,onRestart就会被调用。这种情况一般是用户行为导致的,如用户按Home键切换到桌面或打开另外一个新的Activity,接着用户回到这个Activity。
  • onStart():表示Activity正在被启动,即将开始,这时Activity已经出现,但是还没有出现在前台,无法与用户进行交互。该状态可以被理解为Activity已经显示出来,但无法进行操作。
  • onResume():表示Activity已经可见了,并且出现在前台并开始活动。和onStart()区别在于onStart:Activity在后台运行,而onResume:Activity显示在前台。
  • onPause():表示Activity正在停止,仍可见,正常情况下,紧接着onStop会被调用。特殊情况下,如果这个时候快速回到当前Activity,那么onResume就会被调用。注意:onPause不能进行耗时操作,会影响到新Activity的显示。因为onPause必须执行完,新的Activity的onResume才会执行
  • onStop():表示Activity即将停止,不可见,位与后台。可以做稍微重量级的回收工作,同样不能太耗时。
  • onDestroy():表示Activity即将销毁,这是Activity生命周期的最后一个回调,可以做一些回收工作和最终的资源回收

生命周期的几种普通情况

①针对一个特定的Activity,第一次启动,回调如下:onCreate()->onStart()->onResume()

②用户打开新的Activiy的时候,上述Activity的回调如下:onPause()->onStop()

③再次回到原Activity时,回调如下:onRestart()->onStart()->onResume()

④按back键回退时,回调如下:onPause()->onStop()->onDestory()

⑤按Home键切换到桌面后又回到该Actitivy,回调如下:onPause()->onStop()->onRestart()->onStart()->onResume()

⑥调用finish()方法后,回调如下:onDestory()(以在onCreate()方法中调用为例,不同方法中回调不同,通常都是在onCreate()方法中调用)

2、特殊情况下的生命周期

  • 横竖屏切换

在横竖屏切换的过程中,会发生Activity被销毁并重建的过程。

在了解该情况的生命周期时,需先了解这两个回调:onSaveInstanceState和onRestoreInstanceState。

在Activity由于异常情况下终止时,系统会调用onSaveInstanceState来保存当前activity的状态。该方法的调用在onStop之前,但与onPause的调用没有既定的前后顺序(注意:只在Activity被异常终止时调用)。

异常终止Activity被重建时,系统会调用onRestoreInstanceState,并把Activity销毁时onSaveInstanceState方法所保存的Bundle对象参数同时传递给onRestoreInstanceState和onCreate

因此,可以通过onRestoreInstanceState方法来恢复Activity状态,该方法的调用在onStart之后

onRestoreInstanceState和onCreate区别onRestoreInstanceState回调则表明其Bundle对象不为空无需判断。而onCreate需加判断,因而建议使用onRestoreInstanceState

横竖屏切换的生命周期:

onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

通过AndroidManifest文件的Activity中指定如下属性:

android:configChanges="orientation|screenSize"复制代码

来避免横竖屏切换时,Activity的销毁和重建,而是回调如下方法:

@Override
public void onConfigurationChanged(Configuration newConfig){
   super.onConfigurationChanged(newConfig);
}
  • 资源内存不足导致低优先级的Activity被杀死

(1)前台Activity:正在和用户交互的Activity,优先级最高

(2)可见但非前台Activity:如Activity中弹出了一个对话框,导致Activity可见但位与后台无法和用户交互

(3)后台Activity:已经被暂停的Activity,比如执行了onStop,优先级最低

内存不足时,会按照上述优先级从低到高取杀死目标Activity所在的进程。

二、Activity的启动模式

1、启动模式的类别:

四种:

  • standard:不会检查返回栈中是否存在该Activity,直接创建新的Activity存入栈顶
  • singleTop:检查栈顶是否存在该Activity,存在则直接使用,否则创建
  • singleTask:检查返回栈中是否存在该Activity,存在将其上的Activity出栈,使用该Activity。否则创建
  • singleInstance:新建一个返回栈,存放该Activity。

2、启动模式的结构——栈

Activity的管理是采用任务栈的形式,任务栈采用“后进先出”的栈结构

3、特殊情况——前台栈和后台栈的交互

假如目前有两个任务栈。前台任务栈为AB,后台任务栈为CD,这里假设CD的启动模式均为singleTask,现在请求启动D,那么这个后台的任务栈都会被切换到前台,这个时候整个后退列表就变成了ABCD。当用户按back返回时,列表中的activity会一一出栈,如下图。

如果不是请求启动D而是启动C,那么情况又不一样,如下图。

调用SingleTask模式的后台任务栈中的Activity,会把整个栈的Actvity压入当前栈的栈顶。singleTask会具有clearTop特性,把之上的栈内Activity清除。

4、Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK:与“singleTask”对应
  • FLAG_ACTIVITY_SINGLE_TOP:与“singleTop”对应
  • FLAG_ACTIVITY_CLEAR_TOP:当具有该标记的Activity启动时,在同一个任务栈中所有位与它上面的Activity都要出栈。这个模式一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。在这种情况下,被启动Activity的实例如果已经存在,那么系统就会调用它的onNewIntent。如果被启动的Activity采用standard模式启动,那么它连同它之上的Activity都会出栈,系统会创建新的Activity实例放入栈顶。与“singleTask”对应
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有该标记的Activity不会出现在历史Activity的列表中,当某些情况下我们不希望用户通过历史列表回到我们的Activity的时候该标记比较有用。其等效于在XML中指定Activity的属性android:excludeFromRecents="true"

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【安卓】,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

发布了289 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45365889/article/details/103005350