一、生命周期
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
| 状态 | 可见 | 场景/作用 | 工作 | |
|---|---|---|---|---|
| 1 | onCreate() | 创建Activity | 初始化设置 | |
| 2 | onStart() | √ | Activity与用户交互前 | |
| 3 | onResume() | √ | 用户可以与Activity交互 | |
| 4 | onPause() | √ | Activity被覆盖或者锁屏 | |
| 5 | onStop() | - 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返回,如果操作迅速的话,可以看到这个流程,结果展示如下
二、启动模式
-
定义
共包含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获得焦点,如果已创建过,则不需要创建
-
使用方法
- 方法一:在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:该文章有部分截图是引用了网上其他博主的,但是当时写的时候忘记记录了,如需添加引用可联系我,我再加上