【安卓基础重点知识1】Activity的生命周期及启动模式

0 阅读4分钟

一、生命周期

1.整体流程

2.状态描述

Activity的生命周期共包含7种状态,分别为onCreate()、onStart()、onResume()、onPause()、onStop()、onDestory()、onRestart(),详细介绍如下:

  • onCreate()

    • 必须要写的方法,创建activity的时候触发
    • 必须调用setContentView(R.layout.***)定义页面布局
    • 通常做一些初始化设置,例如加载界面布局资源(setContentView)、数据初始化(findviewbyid)
  • onStart()

    • Activity正在被启动
    • Activity可见,但是没有出现在前台,可以理解为activity已经出来了,但是用户还不能与之交互
  • onResume()

    • 已经可见,并且出现在前台,可以用户可以与之互动,例如activity上有Button,用户可以点击了
  • onPause()

    • 可见,但Activity失去焦点,并处于“已暂停”状态,接着很快执行onStop
    • 场景:被其他Activity覆盖或者锁屏
    • 一般情况:Activity的生命周期为onPause->onStop->onRestart->onStart->onResume
    • 极端情况:本activity跳转至其他Activity后快速回到当前Activity,当前Activity的生命周期:onPause->onResume,这个快速回到要很快
  • onStop()

    • Activity即将停止,对用户不可见,可做一些回收工作,但不能太耗时
    • 场景:Activity被销毁,新的Activity被启动;现有的Activity正在进入“已恢复”状态,并覆盖了已停止的Activity
  • onDestory()

    • 销毁Activity前调用,是Activity接收的最后一个回调
    • 作用:可以做一些回收工作,进行资源释放。通常情况下是为了确保在销毁Activity或包含该Activity的进程时,释放该Activity的所有资源
  • onRestart()

    • 表示Activity被重新启动,当Activity从不可见变为可见状态时,该方法被调用
    • 场景:用户按Home键回到桌面,当用户再次回到该Activity时,当前ACtivity走onRestart->onStart->onResume
状态可见场景/作用工作
1onCreate()创建Activity初始化设置
2onStart()Activity与用户交互前
3onResume()用户可以与Activity交互
4onPause()Activity被覆盖或者锁屏
5onStop()- Activity被销毁,新的Activity启动
  • 先用Activity正在进入“已恢复”状态,并覆盖了已停止的Activity | 回收工作(但不能太耗时) | | 6 | onDestory() | | 销毁Activity前 | 回收工作 | | 7 | onRestart() | | Activity重新启动 | |

3.代码测试

3.1 onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()

  • 代码展示

    •   public class ActivityNormal extends AppCompatActivity {
            
            //方便在工作台查看日志
            private static final String TAG = "JinYu";
      
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                EdgeToEdge.enable(this);
                setContentView(R.layout.activity_normal);
                ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                    Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                    v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                    return insets;
                });
                Log.d(TAG, "Executing onCreate()");
            }
      
            @Override
            protected void onStart() {
                super.onStart();
                Log.d(TAG, "Executing onStart()");
            }
      
            @Override
            protected void onStop() {
                super.onStop();
                Log.d(TAG, "Executing onStop()");
            }
      
            @Override
            protected void onDestroy() {
                super.onDestroy();
                Log.d(TAG, "Executing onDestroy()");
            }
      
            @Override
            protected void onPause() {
                super.onPause();
                Log.d(TAG, "Executing onPause()");
            }
      
            @Override
            protected void onResume() {
                super.onResume();
                Log.d(TAG, "Executing onResume()");
            }
      
            @Override
            protected void onRestart() {
                super.onRestart();
                Log.d(TAG, "Executing onRestart()");
            }
        }
      
  • 结果展示

    •   打开APP时,工作台显示
    •   关闭APP时,工作台显示

3.2 onCreate()->onStart()->onResume()->onPause()->onStop()->onRestart()->onStart()->....->onDestory()

  • 代码展示

    •   编写两个Activity,每个Activity页面中添加一个Button,代码与前文展示类似,不同点在于,增加了Button的事件监听
    •   public class StartActivity extends AppCompatActivity implements View.OnClickListener {
            private static final String TAG = "JinYu";
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                EdgeToEdge.enable(this);
                setContentView(R.layout.activity_start);
                ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                    Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                    v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                    return insets;
                });
                Log.d(TAG, "StartActivity onCreate()");
                //第一个页面的Button
                findViewById(R.id.btn_next).setOnClickListener(this);
            }
            
            ...
            
            @Override
            public void onClick(View v) {
                startActivity(new Intent(this, EndActivity.class));
            }
        }
      
    •   public class EndActivity extends AppCompatActivity implements View.OnClickListener {
            private static final String TAG = "JinYu";
            @SuppressLint("MissingInflatedId")
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                EdgeToEdge.enable(this);
                setContentView(R.layout.activity_end);
                ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
                    Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
                    v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
                    return insets;
                });
                Log.d(TAG, "EndActivity onCreate()");
                //第二个页面的Button
                findViewById(R.id.btn_back).setOnClickListener(this);
            }
            
            ...
            
            @Override
            public void onClick(View v) {
                finish();
            }
        }
      
  • 结果展示(看StartActivity的状态展示)

    •   点击第一个页面的next按钮,控制台信息展示
    •   点击第二个页面的back按钮,控制台信息展示

3.3 onCreate()->onStart()->onResume()->onPause()->onResume()->onPause()->onStop()->onDestory()

  3.2从EndActivity返回,如果操作迅速的话,可以看到这个流程,结果展示如下

二、启动模式

  1. 定义

共包含4种启动模式:standard(默认)、singleTop、singleTask、singleInstance

  • Standard

    •   来一个Activity,就压入任务栈
  • singleTop

    •   栈顶Activity复用,如果栈顶Activity为目标Activity,则不需要再压入任务栈
    •   场景:适合开启渠道多,多应用开启调用的Activity,可以避免Activity重复创建,多数通过动态设置实现
  • singleTask

    •   栈内复用Activity,任务栈内有目标Activity,则将该Activity上方的所有Activity弹出、
    •   场景:程序主界面、耗费系统资源的Activity
  • singleInstance

    •   为目标Activity创建一个Task,将Activity放入Task中,并让Activity获得焦点,如果已创建过,则不需要创建
  1. 使用方法

  • 方法一:在AndroidMainfest.xml中定义
<activity
    android:name=".StartActivity"
    android:exported="true"
    android:launchMode="standard">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • 方法二:设置Intent标记
//1.standard
Intent intent = new Intent(this, EndActivity.class);
startActivity(intent);
//2.singleTop
Intent intent = new Intent(this, EndActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
//3.singleTask
Intent intent = new Intent(this, EndActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
//4.singleInstance
Intent intent = new Intent(this, EndActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

ps:该文章有部分截图是引用了网上其他博主的,但是当时写的时候忘记记录了,如需添加引用可联系我,我再加上