==========启停活动页面==========
一、Activity的启动和结束
1、从当前页面跳到新页面,跳转代码
startActivity(new Intent(源页面.this, 目标页面.this));
从A跳到B,A就是源页面,B是目标页面
2、从当前页面回到上一个页面,相当于关闭当前页面,返回代码
finish(); // 结束当前的活动页面
3、注意A、B页面都要在清单文件中注册
二、Activity的生命周期
1、生命周期

2、什么是生命周期
定义:一个事物由生到死,状态转换的过程
有来就会有去,痛苦来了会走,生气来了也会走
3、生命周期,activity的启动到结束,中间有很多可执行的操作

4、生命周期方法说明
(1)onCreate:创建活动。把页面布局加载进内存(所以经常用findViewById),进入了初始状态
(2)onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态
(3)onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等等(在这里开启动画)
(4)onPause:暂停活动。页面进入暂停状态,无法与用户正常交互
(5)onStop:停止活动。页面将不在屏幕上显示
(6)onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除
(7)onRestart:重启活动。重新加载内存中的页面数据
(8)onNewIntent:重用已有的活动实例
5、onNewIntent说明
如果一个Activity已经启动过,并且存在当前应用的Activity任务栈中,启动模式为singleTask、singleInstance或singleTop(此时已在任务栈顶端),那么在此启动或回到这个Activity的时候,不会创建新的实例,也就是不会执行onCreate方法,而是执行onNewIntent方法
三、各状态之间的切换过程
1、打开新页面的方法调用顺序为
onCreate --> onStart --> onResume
2、关闭旧页面的方法调用顺序为
onPause --> onStop --> onDestory

3、日志
打开页面
2025-12-12 16:21:52.912 11916-11916 sam com.example.chapter04 D ActStartActivity onCreate
2025-12-12 16:21:53.192 11916-11916 sam com.example.chapter04 D ActStartActivity onStart
2025-12-12 16:21:53.215 11916-11916 sam com.example.chapter04 D ActStartActivity onResume
跳转
2025-12-12 16:22:17.936 11916-11916 sam com.example.chapter04 D ActStartActivity onPause
2025-12-12 16:22:18.853 11916-11916 sam com.example.chapter04 D ActStartActivity onStop
返回页面
2025-12-12 16:22:22.030 11916-11916 sam com.example.chapter04 D ActStartActivity onRestart
2025-12-12 16:22:22.030 11916-11916 sam com.example.chapter04 D ActStartActivity onStart
2025-12-12 16:22:22.032 11916-11916 sam com.example.chapter04 D ActStartActivity onResume
关闭页面
2025-12-12 16:22:25.081 11916-11916 sam com.example.chapter04 D ActStartActivity onPause
2025-12-12 16:22:26.329 11916-11916 sam com.example.chapter04 D ActStartActivity onStop
2025-12-12 16:22:26.330 11916-11916 sam com.example.chapter04 D ActStartActivity onDestroy
四、Activity的启动模式
1、Activity启动后是放入任务栈(task stack)里头的
2、某App先后打开两个活动,此时活动栈的变动情况如下

打开第一个Activity,从第一个Activity跳转到第二个Activity
3、依次结束已打开的两个活动,此时活动栈的变动情况如下

在第二个Activity按返回键,返回第一个Activity,再按返回键,退出App
4、默认启动模式standard
该模式可以被设定,不在mainifest设定时候,Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task栈中

5、栈顶复用模式singleTop
在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity

6、栈内复用模式singleTask
与singleTop模式相似,只不过singleTop模式只是针对栈顶的元素,而signleTask模式下,如果task栈内,存在目标Activity实例,则将task内的对应Activity实例之上的所有Activity弹出栈,并将对应Activity置于栈顶,获得焦点

singleTask应用场景
程序主界面:我们肯定不希望主界面被创建多次,而且在主界面退出的时候退出整个App是最好的效果
耗费系统资源的Activity:对于那些及其耗费系统资源的Activity,我们可以考虑将其设为singleTask模式,减少资源耗费
7、全局唯一模式singleInstance
在该模式下,我们会为目标Activity创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例
如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒

8、在清单文件中设置启动模式
android:launchMode
9、在代码中动态设置启动模式
Intent.FLAG_ACTIVITY_NEW_TASK:开辟一个新的任务栈(对应singleInstance)
Intent.FLAG_ACTIVITY_SINGLE_TOP:当栈顶为待跳转的活动实例时,则重用栈顶的实例(对应singleTop)
Intent.FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity已存在(无论是否在栈顶),系统会销毁它及其上的所有Activity,然后重新创建目标Activity
Intent.FLAG_ACTIVITY_CLEAR_TASK:在启动新Activity时清空目标任务(Task)栈中所有现有的Activity实例
Intent.FLAG_ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例
10、例子:登录成功后不再返回登录页面
很多App第一次打开都要求用户登录,登录成功再次进入App首页,如果这时按下返回键,发现并没有回到上一个登录页面,而是直接退出App了,这又是为什么呢?
用户登录成功后,App便记下用户的登录信息,接下来默认该用户是登录状态,自然不必重新输入用户名和密码了。既然默认用户已经登录,就不需要回到登录页面。不光登录页面,登录之前的其他页面包括获取验证码,找回密码等页面都不应该回去。每次登录成功之后,整个App就焕然一新仿佛忘记了有登录页面这回事
// 设置启动标志,跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
参考资料:
https://cloud.tencent.com/developer/article/2118649
https://developer.android.google.cn/guide/components/activities/activity-lifecycle?hl=zh-cn
400

被折叠的 条评论
为什么被折叠?



