活动的生命周期

返回栈

Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack )。系统总是会显示处于栈顶的活动给用户

活动状态

  1. 运行状态当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是处于 运行状态的活动,因为这会带来非常差的用户体验。
  2. 暂停状态当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。不在栈顶了,还怎么会可见呢?这是因为并不是每一个活动都会占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间的部分区域,你很快就会在后面看到这种活动。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的情况下,系统才会去考虑回收这种活动。
  3. 停止状态当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统仍然会为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的活动有可能会被系统回收
  4. 销毁状态当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。

生存期

  • onCreate()这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。
  • onStart()这个方法在活动由不可见变为可见的时候调用
  • onResume()这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态
  • onPause()这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用
  • onStop()这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行
  • onDestroy()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态
  • onRestart()这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了

MainActivity.java类

typescript 复制代码
package com.example.lifecycletest;
​
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;
import android.widget.Button;
​
public class MainActivity extends AppCompatActivity {
    public static final String TAG = "MainActivity";
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        @SuppressLint({"MissingInflatedId", "LocalSuppress"}) Button startNormalAct = (Button) findViewById(R.id.start_normal_activity);
        @SuppressLint({"MissingInflatedId", "LocalSuppress"}) Button startDialogAct = (Button) findViewById(R.id.start_dialog_activity);
        startNormalAct.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                startActivity(intent);
            }
        });
        startDialogAct.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, DialogActivity.class);
                startActivity(intent);
            }
        });
    }
​
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }
​
    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }
​
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
​
    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }
​
    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }
​
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart");
    }
}
​
​

活动被回收了调用数据

利用onSaveInstanceState()回调方法进行回调

相关推荐
檀越剑指大厂1 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako2 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel2 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥5 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走5 小时前
创建自定义语音录制View
android·前端
用户2018792831675 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831675 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker7 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong7 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil8 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin