05 |「Activity 生命周期、状态、启动模式」

前言

Activity 生命周期及状态

一、Activity的页面任务栈

1、简介

  • 明确

    • 一个 Activity 页面,会经历从开始到结束,从开始到结束会经历哪些生命周期?
      • Activity 可以理解为一个活动,举办一场活动是有开始到结束的;
      • 对于页面也是有,页面开始创建、页面正式创建出来、页面与用户正在交互、最后退出页面;
    • 页面在各个阶段都会调用对应的生命周期函数;
  • Acitivity 之间进行跳可以实现存在多种页面的形式;

  • 多个页面在系统中是如何进行存储的;

2、栈与 Activity

1)栈结构
  • 栈是用来存储数据的容器;
  • 特点: 先进先出;
2)栈结构和Activity页面之间有什么关系?
  • 在添加 Activity 页面时,在系统内部也有一个栈结构(Activity 任务栈,Task),在多个页面时,系统会把页面放到任务栈中;
  • Activity 有没有退出任务栈决定 Activity 是否被销毁,从任务栈中退出就意味着该 Activity 被销毁了;
3)添加和退出 Activity 时,Activity 任务栈的变化
  • 添加页面
  • 退出页面

二、生命周期

1、简介

  • Activity的生命周期直接影响到与用户的交互,生命周期很重要!
  • 生命周期是一个 Activity 在其整个生命周期中可以处于的状态集,从它被创建到被销毁以及系统回收其资源;
  • 用户在应用程序中的 Activity 之间导航(进入和离开)时,Activity 会在其生命周期的不同状态间切换;

2、回调函数

  • 通过函数指针调用的函数;
  • 将函数的指针作为参数传递给另一个函数,此指针被用为调用它所指向的函数时,这就是回调函数;
  • 回调函数的调用不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应;
  • Activity 生命周期中每个阶段都有相应的回调方法,当 Activity 更改状态时,将调用关联的回调方法;

3、状态

1)目的
  • 需要知道在哪些场景回到哪些生命周期;实现特殊功能选择在哪个生命周期进行实现;
  • 了解 Activity 生命周期回调方法,Activity 更改及生命周期更改如何影响程序的运行;
2)生命状态周期图
3)生命周期函数
  • 状态

    • Activity launched:Activity 启动状态
    • Activity running:Activity 运行状态
    • Activity shut down:Activity 被关闭状态
  • 回调函数

    • onCreate()

      • 当 Activity 第一次创建时会被调用,这是生命周期的第一个方法;
      • 做初始化工作,例如,调用 setContentView 加载界面布局资源、初始化数据、布局
    • onStart()

      • 表示 Activity 正在被启动,即将开始,此时 Activity 已经出现,但是还没有出现在前台,无法与用户进行交互;可以理解为 Activity 已经显示出来,但是我们还看不到;此时 Activity 在后台
    • onResume()

      • 与用户开始交互,当前 Activity 位于 Activity 栈顶(此时界面完全可见,用户可以进行交互);
      • Activity 已经可见,出现在前台并开始活动
    • onPause()

      • Activity 失去焦点或已暂停,Activity 界面部分可见;用于由一个Activity转到另一个Activity;由一个Activity转到另一个Activity ;退出当前 Activity;
      • Activity 正在停止,仍可见,正常情况下,紧接着 onStop 就会被调用;
    • onStop()

      • 表示 Acitivity 即将停止,不可见,位于后台;
      • 可以做稍微重量级的回收工作,同样不能太耗时
    • onRestart()

      • 重启已停止的 Activity
    • onDestroy()

      • 销毁 Activity,释放该 Activity 的所有资源;
    • onSaveInstanceState()

      • 在非正常关闭(系统回收界面)时回调,用于保存数据,不支持持久化数据;
    • onRestoreInstanceStat()

      • 用于恢复数据;
    • 页面部分遮挡

    • 页面全遮挡

界面马上可见/消失需要保存数据:onStart()、onResume()、onPause()、onStop()

4)生命周期的几种普通情况:
  1. 针对一个特定的 Activity,第一次启动,回调函数执行为:onCreate -> onstart -> onresume
  2. 用户打开一个新的 Activity 时,上述 Activity 执行的回调函数为:onPause -> onStop
  3. 再次回到原 Activity 时,回调函数执行为:onRestart -> onstart -> onresume
  4. 按 back 键回退,执行的回调函数为:onpause -> onstop -> ondestory
  5. 按 Home 键切换到桌面后又回到该 Activity,执行的回调函数为:onPause -> onstop -> onrestart -> onstart -> onresume

4、单个 Activity 生命周期执行过程

package com.example.lifetime;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = "MyActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(LOG_TAG, "----------");
        Log.d(LOG_TAG, "onCreate");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
    }
    @Override
    public void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
    }
    @Override
    public void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume");
    }
    @Override
    public void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
    }
}

1)启动 Activity

2)退回到桌面(处于不可见状态)

3)退回到桌面后重新导航回到 Activity

4)退出(后退)Activity

5)退出后重新回到 Activity

5、Acitivity 跳转过程中的生命周期执行过程

  • 第一个 Activity:A_Activity;第二个 Activity:B_Activity;
  • 在第一个 Activity 中点击按钮跳转到第二个 Activity;
// 第一个 Activity - XML
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是 A_Activity"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.33" />

    <Button
        android:id="@+id/btnStartBAty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动 B_Activity"
        android:onClick="startBActivity"
        tools:layout_editor_absoluteX="161dp"
        tools:layout_editor_absoluteY="356dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

// 第一个 Activity - 程序
package com.example.lifetime;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = "MyActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(LOG_TAG, "----------");
        Log.d(LOG_TAG, "A onCreate");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "A onStart");
    }
    @Override
    public void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "A onPause");
    }
    @Override
    public void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "A onRestart");
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "A onResume");
    }
    @Override
    public void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "A onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "A onDestroy");
    }

    public void startBActivity(View view) {
        startActivity(new Intent(this, SecondActivity.class));
    }
}
// 第二个 Activity - XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是 B_Activity"
        tools:layout_editor_absoluteX="162dp"
        tools:layout_editor_absoluteY="284dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
// 第二个 Activity - 程序
package com.example.lifetime;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.text.BreakIterator;

public class SecondActivity extends AppCompatActivity {

    private static final String LOG_TAG = "MyActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d(LOG_TAG, "-------");
        Log.d(LOG_TAG, "B onCreate");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "B onStart");
    }

    @Override

    public void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "B onPause");
    }
    @Override
    public void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "B onRestart()");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "B onResume");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "B onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "B onDestroy");
    }

    public void returnReply(View view) {
        Log.d(LOG_TAG, "B End SecondActivity");
        finish();
    }
}
  • 在 B_Activity 呈现出来之前 A_Activity 还可呈现,只执行 OnPause() 暂停,只有在 B_Activity 完全呈现出现后 A_Activity 才会执行 onStop()

三、启动模式

  • 每一个 Activity 是一个实例;
  • 任务栈: 一个堆栈,启动每一个 Activity,依次放到栈中;
  • 场景:进入一层一层的页面,到达一个大图页面,在大图页面添加回到首页的功能;

1、标准启动模式(默认)

  • 允许重复相同的页面:每启动一个页面会在任务栈中启动一个新的页面,不管栈中页面是否重复;
  • 配置:在 mainifest.xml 文件;不配置默认为 standard 模式;

2、SingleTop

  • 不允许连续重复相同的页面
  • Activity_A 设置为 singleTop 模式时,同一任务栈中,如果此 Activity_A 处于栈顶,则只能创建一个当前实例,不能创建新的当前实例;
  • 如果此时 Activity_A 不处于栈顶,创建,会创建一个新的 Activity_A 实例;

3、SingleTask

  • 不允许同个任务栈内重复相同的页面;
  • 在有多个页面的栈中,启动首页页面,会将上面的页面全部清掉;
  • 同一任务栈,启动一个新的 Activity 任务栈中会弹出上一个 Activity

4、SingleInstance

  • 整个系统不允许重复相同的页面;
  • 每一个 Activity 实例只存在于一个独立的任务栈中,一个任务栈只包含一个 Activity
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个写代码的修车工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值