博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 四种launchMode及疑问
阅读量:5992 次
发布时间:2019-06-20

本文共 1306 字,大约阅读时间需要 4 分钟。

hot3.png

之前对于四种模式的理解仅限于理论和一两个简单的测试(singleTop和singleTask)

今天脑袋抽风想都实际测一下,晕,测到 singleInstance杯具了

请对四种模式熟悉的朋友直接跳到文章底部,帮忙看下singleInstance的问题,谢谢

未标明launchMode的Activity都是默认启动模式

1,standard

每次都会新建一个Activity实例

2,singleTask

栈空间简易示意:A -- B -- C

最后用startActivity(intent)从C跳到A后,由于栈空间已经存在A的实例,A上面的Activity B和C出栈(即onDestroy销毁),A置于栈顶

如果A中重写了onNewIntent(...)方法,会同时接到C跳A的intent数据

3,singTop

栈空间简易示意:A -- B -- C

最后用startActivity(intent)从C跳到A后,即使栈控件已经存在A的实例,Android系统也会重新创建一个A的实例并且置于栈顶,当然重写的onNewIntent(...)方法也不会接到intent数据, 变成:

4,singleInstance(代码跳转逻辑:A -- B -- C -- A -- B -- C .....)

1,起始Activity非singleInstance (实际跳转顺序:A -- B -- C -- A -- B -- C .....)

A,C位于同一栈中,taskId相同, B在另一个栈中,与他们taskId不同,此栈在B未被销毁前只能有B一个Activity(B在创建之后,onNewIntent(...)也可以接到其他Activity跳转的intent数据),整个过程中,B只创建了一次,A与C每次都创建一个实例

2,起始Activity为singleInstance(实际跳转顺序:A -- B -- C -- A -- C -- A -- C .....)

代码中第一种情况相同,但实际跳转顺序却不同,

第一次A -- B -- C 实际跳转完成之后,当从C回到A(A在创建之后,onNewIntent(...)也可以接到其他Activity跳转的intent数据)后,再从A跳B时,却跳到了C页面,依次循环,整个过程中,B只是在一开始创建时出现了一次,之后从A都是直接跳C,A当然是单实例的,但是C也只创建了一次,相当于是单实例

多次跳转按物理返回键时:

如果当前页面是A,则A销毁,出现C,接着C销毁,出现B,B销毁,应用程序结束

如果当前页面是C,则C销毁,出现B,接着B销毁,出现A,A销毁,应用程序结束

返回键的实际跳转情况属于正常,因为A的taskId, 与B,C不同,不在同一栈中

但singleInstance的第2中情况,第一次A--B--C--A跳完之后,为啥从A却进入了C并且是之前的实例C,并不是想象中的新创建一个Activity B的实例 ?

求指教哈,谢谢...

转载于:https://my.oschina.net/u/1177694/blog/705092

你可能感兴趣的文章
Java独立线程
查看>>
关于ftp用户的shell说明
查看>>
capistrano 代码发布简单使用
查看>>
Day-5
查看>>
(翻译)RabbitMQ官方教程——Hello World
查看>>
MySQL主从同步的原理:
查看>>
go实现的简易TCP的客户端和服务器
查看>>
活动目录域管理
查看>>
小心使用临时string对象的c_str()值
查看>>
lamp小项目实施题目及参考答案
查看>>
Curl发送header头信息
查看>>
mysql audit-访问日志记录
查看>>
Python 数据分析 数据挖掘 学习路径图
查看>>
Adobe Dreamweaver CS4“许可证已过期”解决方法
查看>>
log4j配置
查看>>
关于inodes占用100%的问题及解决方法
查看>>
001_java开发中配置环境变量的含义
查看>>
repair 的use_frm选项
查看>>
magento优惠券使用
查看>>
HTTP协议 状态码详解
查看>>