四大组件 ——Activity详解 | 青训营笔记

197 阅读6分钟

四大组件 ——Activity详解 | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的第1天。本系列内容后续还会继续更新其他四大组件的内容,欢迎大家批评指正、一起学习。

基本内容分为 老师上课的知识 + 课后自主学习 后的知识。因为本人也准备参加秋招,会结合一些高频面试题加入到笔记里面,不嫌弃的话大家也可以当做面经复习。

OK,下面开始正文!


一、本堂课重点内容

Activity 的启动模式与生命周期概念

二、详细知识点介绍

  1. Activity的应用于作用(Why)

    1. 前台交互
    2. 程序入口
    3. 布局容器
  2. Activity 的生命周期

    概念:在Android中会有一个Activity Stack,当一个新的 Activity 创建时,会被放在栈顶,这个Activity处于运行状态,当再有一个新的Activity创建后,之前的Activity会在新的下面(进入后台),生命周期是为了解决内存不够问题提出的。

    1. 四种状态

      1. 运行中(Running/Active) :位于栈顶,是可见的,可与用户交互的
      2. 暂停(Paused) :失去焦点,不能与用户交互,但依然可见,或者说正在停止(有新的Activity进入栈顶)。
      3. 停止(Stoped) :当一个Activity被另一个Activity完全覆盖,或者点击Home进入后台,这是就处于停止状态
      4. 销毁(Destroyed) :点击返回键或者系统内存不够。
    2. 生命周期

      1. OnCreate:Activity正在被创建,做一些初始化工作(SetContentView,findViewById,setOnClickListener等)

      2. OnStart:Activity正在被启动,由不可见变为可见,还无法与用户交互,当可以做一些数据初始化工作(开启线程去拉本地数据库数据,或从后台拉数据)

      3. OnResume:Activity已经可见,并出现在前台,该Activity位于返回栈栈顶,可以响应用户的操作,即可以与用户交互了。


        如果此时用户拉起另一个Activity B, Activity A会顺序经历如下几个生命周期

      4. OnPause:表示 A 正在停止,准备从前台返回至后台,此时可以做一些停止动画,数据存储等工作。值得注意的是,在onPause生命周期进行的工作不能太耗时,不然会影响 B 的显示。 (Activity A的onPause执行完后,Activity B的onResume才会执行

      5. OnStop:在 A 完全不可见时调用,紧随着onPause执行,表 A 即将停止,此时 A 已经不在前台,可以做一些稍微重量级的回收工作,但同样不能太耗时,(如果此时新打开的Activity B是对话框式的Activity,背景存在一定区域是透明的,则Activity A的onStop不会调用)。

      6. OnDestroy:表示 A 即将被销毁,在这里可以进行资源的回收、释放工作。一般是经过用户按下back键或者系统资源紧张时,将Activity A释放掉以获得更多的内存时调用。


      7. OnRestart:A 由onStop停止状态,转为运行状态时调用,表 A 正在被重新启动,下一个回调是onStart()。

      8. OnSaveInstanceState:Activity A在运行时,主动或被动地运行Activity B,这时A会执行OnSaveInstanceState()。在非正常关闭时回调,用于保存数据,不支持持久化数据。B完成后回来找A,此时有两种情况

        1. A没有被回收,直接执行OnResume(),跳过OnCreate()
        2. A被回收了,A就重新调用OnCreate()方法,不同于普通的调用,会带上参数SaveInstanceState。
      9. OnRestoreInstanceState:用于恢复数据。

        image-20220726162710639

    3. 启动模式

      先了解下 Activity 任务栈的运行模式

      任务栈(activity栈)

      • 任务其实就是activity的栈,由多个Activity组成。
      • 栈底是启动整个任务的Activity,栈顶是当前运行与用户交互的Activity,
      • 当一个Activity启动一个新的Activity时,新的Activity被压入栈,处于栈顶,前一个Activity依然保持在栈中。
      • 用户按下BACK键时,当前Activity出栈,前一个恢复为当前运行的Activity。
      • 栈中保存的是对象
      • 栈中的Activity永远不会重排,只会压入或弹出。
      • 任务重所有Activity是作为一个整体进行移动的,整个任务(Activity栈)可以移到前台,或退到后台

      下面是四种启动模式的简介

      1. 模式Standard

        默认的启动模式,每次启动Activity都会创建一个新的实例放入栈顶

        改Activity会运行在启动它的Activity栈中

        (Activity每次被启动都会重复创建该Activity的实例)

      1. 栈顶复用模式SingleTop

        不允许连续重复

        在栈顶:跳转的Activity 如果位于任务栈的栈顶则直接调用此Activity 的OnNewIntent方法

        不在栈顶:如果不位于栈顶则会重新创建该Activity的实例。

        应用:新闻详情页的推荐新闻

      1. 栈内复用模式SingleTask

        不允许同个栈内重复

        在栈里:启动时会判断当前任务栈中是否有此Activity,有的话则将其置为栈顶 ​ (上面如果有其他Activity则全部移除掉)

        不在栈里:没有就创建该Activity入栈。

        应用:App或浏览器的主页按钮

      1. 单实例模式SingleInstance

        整个安卓操作系统中只可以存在唯一的这样一个Activity实例(即它运行在自己独立的任务栈中且独占的任务栈中只会存在它一个实例。无论这个Activity被哪个应用调用,都会将这个页面所在的任务栈移到前台显示。)

      比如:拨号界面

      image-20220804171919459

      注意点

      1. 如何设置

        1. 静态设置 在manifest.xml中找到要设置的activity,在android:launchMode=“singleTask 或其他的模式”。

        2. 动态设置 在代码中,跳转时给intent设置flag

          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          
    4. 启动Activity的两种方式

      1. 正常启动一个Activity:startActivity();
      2. 启动一个带返回值的Activity:startActivityForResult(); 然后通过实现onActivityResult()回调方法来获得返回后的结果。 当这个后续的activity被关闭,它将发送一个intent给onActivityResult()方法。 onResume()只是恢复一个Activity,并不是启动一个Activity

三、实践练习例子

  1. 基本使用方法

    1. AndroidManifest.xml 文件中声明

      image-20220802230043919

    2. 声明 Activity_name.xml 布局文件

      image-20220802230028436

    3. 新建 Activity类 进行绑定

      image-20220802230009665

四、课后个人总结

  1. 学习一门语言或新事物的方法:本次课程老师还分享了自己学习的一套方法,主要分为三个阶段:

    1. What :是什么,对其有个大体的了解;
    2. Why :为什么存在,为什么这样设计,主要了解其作用,与同类技术有什么优劣点;
    3. How :怎么样学习,怎么使用。

    主要进行一个由浅到深的过程,不断的深入学习直至贯通。