您的位置:首页 > 移动开发 > Android开发

【Android】安卓四大组件之Activity(三)

2022-01-18 22:10 1196 查看

| # 【Android】安卓四大组件之Activity(三) | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ## 前言 | | | | 在之前的activity介绍中我们理解了activity中的

页面跳转
信息传递
生命周期
,在这一章节,我们对activity的
启动模式
进行学习 | | | | ## 1、了解任务栈 | | | |
栈(stack)
是非常常见的数据结构,就是有着
后进先出
的特性。 | | | | 那么
任务栈
其实就是将我们的每一个activity当作一个元素进栈 | | | | 一个最好懂的例子——拼夕夕APP,从“每日领现金”页面,点击跳转到“签到领红包”页面,再点击跳转到“帮忙砍一刀”页面,那么其中的任务栈就是如图 | | | | | | | | activity的不同启动模式,会导致activity在任务栈中的状态不一样,下面我会来一一介绍 | | | | 首先需要知道的是,如何设置启动模式? | | | | ## 2、如何设置启动模式? | | | | 我们只需要在manifest.xml中的activity中进行
android:launchMode=""
的设置就可以了,例如我这里使用standard模式: | | | |
xml | | <activity android:name=".study.test.CameraActivity" 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> | |
| | | | launchMode一共有如下几种,我们来一一介绍 | | | | | | | | ## 3、standard启动模式 | | | | 最常见的模式,也是
默认
的启动模式。activity在这种启动模式下就和刚刚举的拼夕夕的例子一样,每一个新的activity都是
任务栈中的新栈顶
,而按下BACK键当前activity被销毁,任务栈中该
activity执行出栈操作
,被销毁! | | | | 使用场景:绝大多场景
默认使用
| | | | 例子:(点击跳转到新生成的当前的activity,一共点击了3次,按下返回键4次回到主屏幕) | | | | | | | | ## 4、singleTop启动模式 | | | | 看名字就知道,top,其实就是当前这个启动了带有这个启动模式的activity,那么就是在栈顶
了,如果**当前activity在栈顶,无法被新的自己这个activity启动** | | | | 使用场景:浏览器的
书签
应用推送
... | | | | - 书签点击一次和点击多次,都是跳转到标记的地方,只会跳转一次 | | | | - 同理,应用推送为了减少开销,每次点击不同的推送,都是确保仅开了一个进程存储在任务栈顶 | | | | 例子:(已知点击新生成自己,未进行跳转,点击一次back就返回主屏幕) | | | | ![qemu-system-x86_64_U4Y1zDVa1y](https://gitee.com/Awoodwhale/blogimg/raw/master/img/20220118201810qemu-system-x86_64_U4Y1zDVa1y.gif) | | | | ## 5、singleTask启动模式 | | | |
singleTask
就是单一任务 | | | | 具体例子: | | | | - activity A是
standard
| | | | - activity B是
singleTask
| | | | - 如果从A跳转到B之后,我们点击了很多个A或者其他activity,一旦跳转到B,B的
上层栈空间全部被清除
,B成为
新栈顶
。 | | - 这时再点击跳转到B自己,不会
创建新的B
,因为
B已经在栈顶
了 | | | | 使用场景:当使用的activity
占据的资源较大
的时候,就使用
singleTask
模式 | | | | ## 6、singleInstance启动模式 | | | |
singleInstance
是单例模式,创建的这个activity独占一个任务栈,并且每次跳回到这个activity都是让这个独占的任务栈放置在最前面,另一个任务栈在后面。如果调用非
singleInstance
的activity,那么独占的那个任务栈就会被置后。 | | | |
singleInstance
只会实例化一次,每次调用仅仅是让这个独占的任务栈提前。调用了其他的就会让这个任务栈置后。 | | | | 使用场景:这个系统中只有唯一实例,比如说Launcher。或者词典类APP的取词功能,因为我们在每个界面都可以使用取词功能。 | | | | ## 7、启动模式总结 | | | | | 用例 | 启动模式 | 多个实例? | 注释 | | | | :----------------------------------- | :----------------- | :--------- | :----------------------------------------------------------- | | | | 大多数 Activity 的正常启动 | “
standard
” | 是 | 默认。系统始终会在目标任务中创建新的 Activity 实例,并向其传送 Intent。 | | | | 大多数 Activity 的正常启动 | “
singleTop
” | 视情况而定 | 如果目标任务的顶部已存在 Activity 实例,则系统会通过调用该实例的
onNewIntent()
方法向其传送 Intent,而非创建新的 Activity 实例。 | | | | 专用启动*(不建议在一般情况下使用)* | “
singleTask
” | 否 | 系统会在新任务的根位置创建 Activity 并向其传送 Intent。不过,如果已存在 Activity 实例,则系统会调用该实例的
onNewIntent()
方法(而非创建新的 Activity 实例),向其传送 Intent。 | | | | 专用启动*(不建议在一般情况下使用)* | “
singleInstance
” | 否 | 与“
singleTask"`”相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务中的唯一 Activity。 | |

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: