栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

理解Android的四种启动模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

理解Android的四种启动模式

一:前言

四种模式分别为standard, singleTop, singleTask, singleInstance。自己应该明确一个概念先,single到底要single什么。每一个应用app都有一个包名,然后每一个应用都会有一个task,这个task和包名对应起来,如果要创建一个新task,名字就得不一样。

  • 一个应用会有一个包名,应用中默认有一个以包名为名字的task
  • task是一个概念,实现是stack栈。
  • task用来管理activity,一个activity转到另一个activity,就会把新activity压栈,遵循先进后出。
  • task中的activity可以跨应用,比如说app中跳转到微信,然后按返回键又可以回到自己那个应用。
二:如何改变启动模式
  1. 在manifest中对activity设置
  2. 更改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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/686115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号