Activity初识 | 青训营笔记

95 阅读5分钟

Activity初识|青训营笔记

这是我参与[第四届青训营]笔记创作活动的第2天

前言

作为一名Android小白,学习Android时,最开始面对的就是四大组件之一的Activity,这也是app在与用户交互最多的UI页面,也是大家最需要掌握的知识点。接下来我将从activity生命周期,activity之间跳转,activity启动模式,activity状态保存及恢复来简单介绍Activity。

1.Activity生命周期

说道activity生命周期就不得不提到这张图⬇️

image-20220731140011768.png

这张图非常全面的为我们展示了activity的每个调用方法,接下来我们来看看代码中的activity生命周期回调方法

  //创建时回调,一般在此处创建视图和绑定数据
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
         Log.d(TAG, "onCreate")
     }
     //启动,即将进入前台,在onCreate()或者onRestart()之后启动
     override fun onStart() {
         super.onStart()
         Log.d(TAG, "onStart")
     }
     //与用户开始交互,位于Activity栈顶
     override fun onResume() {
         super.onResume()
         Log.d(TAG, "onResume")
     }
     //一般被遮挡时调用,Activity界面部分可见,
     override fun onPause() {
         super.onPause()
         Log.d(TAG, "onPause")
     }
     //Activity不再可见,被全部遮挡时调用
     override fun onStop() {
         super.onStop()
         Log.d(TAG, "onStop")
     }
     //重启已停止的Activity重新显示在用户交互界面时调用
     override fun onRestart() {
         super.onRestart()
         Log.d(TAG, "onRestart")
     }
     //销毁Activity,释放该Activity的所有资源时调用
     override fun onDestroy() {
         super.onDestroy()
         Log.d(TAG, "onDestroy")
     }
 ​

一般activity存在的生命周期中,其最多有4种状态

  1. 运行状态:当activity处于任务栈顶时,该activity就为运行状态
  2. 暂停状态:当一个activity不再处于任务栈顶,但依然可见,那么activity就为暂停状态
  3. 停止状态:当一个activity不再处于任务栈顶,并且完全不可见时,就为停止状态
  4. 销毁状态:当一个activity不再处于任务栈顶,并被移除时,该activity就会变为销毁状态

2.Activity之间跳转

知道activity的生命周期的各个回调方法后,那我们就来试试不同activity之间的跳转其生命周期是如何变化的,加深我们对其生命周期的了解😎

首先,我们创建一个ActivityA,一个ActivityB,注意每个activity都需要在Androidmanifest.xml中的 下添加标签注册,否则就会像我这样报错😂

image-20220731223442414.png

完成以上步骤后我们就可以正式的来观察其生命周期是如何执行的,先在activityA的布局文件中添加一个按钮用来跳转到activityB中,最后返回activityA,生命周期如下图所示,这里就不在这展示其实现代码了,相信大家了解了后,可以亲自敲一敲加深印象。🔔

image-20220731224701184.png

思考一下,如果activityB是弹窗,那又会是怎么样的❓

通过设置Activity主题theme.xml文件,我们将Androidmanifest中标签下添加android:theme=“@style/Theme.AppCompat.Dialog”后发现其生命周期有所改变,如下图所示

image-20220801195123709.png

那么如果是ActivityB是透明的,此时生命周期又会怎样变化,大家去亲自试试看,通过改变activity主题方式观察观察,我就不再这演示了😄

3.Activity启动模式

接下来我们说说,activity有四种启动模式吧

  • Standard(标准模式):不管任务栈内是否存在 Activity B 的实例,当启动 Activity B 时,都会创建一个崭新的 Activity B 并位于任务栈顶(默认)⬇️

image-20220801093510484.png

  • SingleTask(栈内复用):如果任务栈内存在 Activity B的实例并且未位于栈顶,当启动 Activity B时,会将 Activity B上方的Activity全部出栈让其位于任务栈顶⬇️

image-20220801094004434.png

  • SingleTop(栈顶复用):如果任务栈内存在 Activity B 实例且位于栈顶时,当启动 Activity B 时,会复用之前创建的 Activity B 的实例⬇️

image-20220801150731048.png

  • SingleInstance(全局唯一):如果任务栈内不存在 Activity B 的实例,当启动 Activity B 时,会在创建一个新的任务栈,并且栈内只有 Activity B 一个实例⬇️

image-20220801154644278.png 简单介绍了一下activity的启动模式,注意在activity的启动模式是在Androidmanifest.xml文件中的标签中设置,除了Standard模式外,启动一个已存在栈内的activity都会去调用onNewIntent()方法来去处理当前的请求信息.

4.Activity状态保存与恢复

有时候我们常常会遇见activity被系统杀后台的现象,导致其所持有的数据丢失,因此我们就有必要去了解如何保证activity异常退出时,一些重要数据能够被保存下来。

我们利用的是onSaveInstanceState()和onRestoreInstanceState()两种方式,但Bundle对象并不适合保留大量数据,因为它需要在主线程上进行序列化处理并占用系统进程内存!!

 //系统在 onStop() 方法之后调用的onSaveInstanceState(),利用Bundle来保存数据
 override fun onSaveInstanceState(outState: Bundle?) {
     // 始终调用父类,以便它可以恢复视图层次结构
     super.onSaveInstanceState(outState)
 }
 //系统在 onStart() 方法之后调用的 onRestoreInstanceState(),利用Bundle来读取数据
 override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
     // 始终调用父类,以便它可以恢复视图层次结构
     super.onRestoreInstanceState(savedInstanceState)
 }
 ​

接下来我们利用activity生命周期的代码中增加以上函数,来观察一下这两个函数的调用吧

image-20220801194555661.png

可以从日志中看见,在activityA向activityB跳转的过程中,activityA在onStop()之后调用了onSaveInstanceState方法来保存数据,来防止activity被销毁!!

那么我们再来试试旋转屏幕,看看又会发生什么❓

image-20220801194508101.png 旋转屏幕后,activityB在销毁前保存了数据,之后重新创建,之后在onStart()方法后调用了onRestoreInStanceState()来获取了销毁前的数据。

最后

至此,我们就将activity的基础知识介绍完了,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

参考文章

Activity 使用详解 - 掘金 (juejin.cn)

Android技能树 — Activity小结 - 掘金 (juejin.cn)

了解 Activity 生命周期 | Android 开发者 | Android Developers (google.cn)