理解Android的四种启动模式
一:前言
四种模式分别为standard, singleTop, singleTask, singleInstance。自己应该明确一个概念先,single到底要single什么。每一个应用app都有一个包名,然后每一个应用都会有一个task,这个task和包名对应起来,如果要创建一个新task,名字就得不一样。
- 一个应用会有一个包名,应用中默认有一个以包名为名字的task
- task是一个概念,实现是stack栈。
- task用来管理activity,一个activity转到另一个activity,就会把新activity压栈,遵循先进后出。
- task中的activity可以跨应用,比如说app中跳转到微信,然后按返回键又可以回到自己那个应用。
二:如何改变启动模式
- 在manifest中对activity设置
- 更改Intent启动activity时的flag
三:直接从singleTop开始
三个activity,activity1可以跳转到activity2,activity2可以跳转到activity3.
1:第一种情况,栈顶已有实例
栈底---------------------------------------》栈顶
acitivity1 activity2 acitivity3 这时候以singleTop模式启动activity3,重用旧实例, 备注:顺便调用activity3的onNewIntent()方法 栈底---------------------------------------》栈顶
acitivity1 activity2 acitivity3
2:第二种情况,栈顶没有实例
栈底---------------------------------------》栈顶
acitivity1 acitivity3 activity2 这时候以singleTop模式启动activity3,创建新实例 栈底---------------------------------------》栈顶
acitivity1 acitivity3 activity2 activity3(new)
四:很简单的singleTask
注意要在manifest中设置
android:launchMode="singleTask"
(我发现设不设置intent的flag都没用,关键是设置这个,只设置flag没有用)
1:第一种情况,在manifest中没有设置了taskAffinity
当前task没有这个activity的实例就创建一个,放在栈顶;若是有实例,就把那个实例上面的activity全部出栈(销毁),并调用要启动的activity实例的:onRestart, onStart, onResume
栈底---------------------------------------》栈顶
acitivity1 acitivity3 activity2 这时候以singleTast模式启动activity3,但没有taskAffinit
会把已有的activity3上面的activity,即activity2出栈,销毁
并调用已有的activity3的onRestart,onStart, onResume 栈底---------------------------------------》栈顶
acitivity1 acitivity3 (old)
即singleTask确保在当前task实例唯一
2:第二种情况,在manifest中设置了taskAffinity
2.1:这个task已被创建
栈底---------------------------------------》栈顶 task1:
acitivity1 acitivity3 activity2 task2:
acitivity1 acitivity3 activity2 以singleTask模式启动activity3,指定task2,表现和第一种情况一样
把上面的activity都出栈
task1:
acitivity1 acitivity3 activity2 task2:
acitivity1 acitivity3(old)
2.2:这个task未被创建
栈底---------------------------------------》栈顶 task1:
acitivity1 acitivity3 activity2 以singleTask模式启动activity3,指定task2
会创建task2,并创建新实例放进去 task1:
acitivity1 acitivity3 activity2 task2:
activity3(new)
ps:之后activity3启动的其他activity,除非新指定task,否则都在activity3所在的栈中了,即所谓嫁鸡随鸡嫁狗随狗
singleTask名字误导很大,我觉得名字为singleAtTask更贴切。
五:更简单的singleInstance
启动模式为singleInstance的activity,在整个手机中,只能有一个实例,再次调用的时候,会找到这个实例并把它调到前台。
比如说activity1已singleInstance模式启动,那就把它调到前台(已存在的话)。
- activity1属于一个唯一的task,这个task只有它一个
- activity1启动其他activity,若这个activity指明taskAffinit(即使不是singleTask模式),就在指明的task中创建,若没有指明taskAffinit,就默认找应用包名的task。这边逻辑和singleTask很像了。
参考资料:https://blog.csdn.net/zhangjg_blog/article/details/10923643
https://www.kancloud.cn/alex_wsc/android_art/1828110
理解Android的四种启动模式的更多相关文章
- Android Activity 四种启动模式
task和back stack(任务和回退栈) 任务启动,task被加入到回退栈的栈顶,返回的时候回退栈的栈顶任务会被弹出,并被销毁,栈中的前一任务恢复运行,当activity销毁是,系统不会保留ac ...
- android:Activity四种启动模式简单介绍
Activity启动模式 能够依据实际的需求为Activity设置相应的启动模式,从而能够避免创建大量反复的Activity等问题 Activity有四种载入模式 1.standard(默认启动模式, ...
- android launchmode(四种启动模式)应用场景及实例
模式介绍 [1] standard 模式 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中. [2] singleTop 模式 如果在任务的栈顶正好存在该Activ ...
- android activity四种启动模式
1.standard <activity android:name=".MainActivity" android:launchMode="standard&quo ...
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...
- Android中Activity的四种启动模式
要了解Android的启动模式先要了解一下Activity的管理方式: 1.Activity的管理机制 Android的管理主要是通过Activity栈来进行的.当一个Activity启动时,系统根据 ...
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- Android 关于Activity的四种启动模式的简单介绍
Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standar ...
- Android之Activity系列总结(三)--Activity的四种启动模式
一.返回栈简介 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈,也叫任务栈)中. 首先介绍一下任务栈: (1)程序打开时 ...
随机推荐
- 8.深入TiDB:解析Hash Join实现原理
本文基于 TiDB release-5.1进行分析,需要用到 Go 1.16以后的版本 我的博客地址:https://www.luozhiyun.com/archives/631 所谓 Hash Jo ...
- 数据库之JDBC
1.简单认识一下JDBC 1).JDBC是什么? java database connection java数据库连接 作用:就是为了java连接mysql数据库嘛 要详细的,就面向百度编 ...
- stm32串行设备接口SPI控制max31865
本人是刚入行的嵌入式,之前也没有多少项目经验,故在公司的这几个月里,可谓是如履薄冰,对于公司不同项目使用的不同的设备之多,数据手册之繁杂,让我不禁望洋兴叹,故而不愿意放弃周末这大好的自我提升时间,努力 ...
- 艺恩网内地总票房排名Top100信息及其豆瓣评分详情爬取
前两天用python2写的一个小爬虫 主要实现了从http://www.cbooo.cn/Alltimedomestic这么个网页中爬取每一部电影的票房信息等,以及在豆瓣上该电影的评分信息 代码如下 ...
- Android 小知识
1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environmen ...
- 监控Linux服务器网站状态的SHELL脚本
1,监控httpd状态码的shell脚本代码. #!/bin/sh #site: www.jquerycn.cn # website[0]=www.jquerycn.cn/chuzu/' #网站1 m ...
- List.Sum…统计信息(Power Query 之 M 语言)
数据源: 任意数据源,一列数值,一列非数值(文本) 目标: 对数值列进行求和等计算,对非数值列进行计数等计算 操作过程: 选取待计算的列>[转换]>[统计信息]>选取 M公式: ...
- 数组队列如何手撕?解密ArrayBlockingQueue的实现内幕!
队列 聊起队列,你一定会联想到一个与队列相似的数据结构:栈. 为了更好的理解什么是队列,我们将它和栈来比较一下: 队列的特点是:先进先出,如下图,1先进,1就先出. 图1:队列的图解 栈的特点是:先进 ...
- 用 Go 实现一个 LRU cache
前言 早在几年前写过关于 LRU cache 的文章: https://crossoverjie.top/2018/04/07/algorithm/LRU-cache/ 当时是用 Java 实现的,最 ...
- 洛谷 11 月月赛 I Div.2 A [Kubic] Addition 题解
Content 你有一个长度为 \(n\) 的序列 \(a\).你可以执行 \(n-1\) 次操作,每次操作中你可以选择一个位置 \(i\),并删除 \(a_i\) 和 \(a_{i+1}\),再在原 ...