android activity启动流程(全网最全Android开发笔记)

一.先理解栈的概念(放置Activity实例的容器)

1.Task(线性表)

任务栈Task,用来放置Activity实例的容器,先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序

2.app启动时,系统会为它默认创建一个对应的Task,用来放置根Activity

ps: Activity之间可以相互启动,当前应用的Activity可以去启动其他应用的Activity(相机),那么就是说栈的功能可以把其它app的activity加入到自己app的栈里.

所以Task可以理解为负责管理所有用到的Activity实例的栈,但是.android5.0之后 跨进程调用activity,这个activity会被放入到一个新的栈中。

二.启动模式(只能根据压栈和出栈操作更改Activity的顺序,所以是启动模式是以哪种姿势入栈)

通过在AndroidManifest文件中的属性andorid:launchMode来设置或者通过Intent的flag来设置

1.standard(常规姿势入栈)

默认模式。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。应用场景:绝大多数Activity。

2.singleTop(栈顶复用姿势入栈)==FLAG_ACTIVITY_SINGLE_TOP

栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。避免栈顶的activity被重复的创建。应用场景:在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就可以用singleTop,否则每次点击都会新建一个Activity。某个场景下连续快速点击,启动了两个Activity。如果这个时候待启动的Activity使用 singleTop模式也是可以避免这个Bug的。

3.singleTask(栈内复用姿势入栈)==FLAG_ACTIVITY_CLEAR_TOP

栈内复用模式, activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空这个activity任务栈上面所有的activity(CLEAR_TOP回到栈顶)。应用场景:大多数App的主页。对于大部分应用,当我们在主界面点击回退按钮的时候都是退出应用,那么当我们第一次进入主界面之后,主界面位于栈底,以后不管我们打开了多少个Activity,只要我们再次回到主界面,都应该使用将主界面Activity上所有的Activity移除的方式来让主界面Activity处于栈顶,而不是往栈顶新加一个主界面Activity的实例,通过这种方式能够保证退出应用时所有的Activity都能报销毁。

4.singleInstance(不入栈)

单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。建议谨慎使用。

5.FLAG_ACTIVITY_NO_HISTORY

Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。

三.FLAG_ACTIVITY_NEW_TASK

这个属性原则是:设置此状态,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,同一个应用程序中的activity的亲和性一样),如果有,则直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity。

1.getTaskId();获取当前activity所处的栈

2.同一个应用程序中的activity的亲和性一样(taskAffinity),也就是说 Actviitya intent时setFalg(
Intent.FLAG_ACTIVITY_NEW_TASK)到Activityb 但是Actviitya和Activityb 还是一个栈

在不同的应用中跳转才会创建新的Task。

3.在Activity上下文之外启动Activity需要给Intent设置FLAG_ACTIVITY_NEW_TASK标志,不然会报异常。

四 FLAG_ACTIVITY_CLEAR_TASK(必须和FLAG_ACTIVITY_NEW_TASK一起使用)

清空栈内activity,只留下这个activity

版权声明:本文图片和内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送联系客服 举报,一经查实,本站将立刻删除,请注明出处:https://www.4kpp.com/8573.html

(0)
漫空客漫空客
上一篇 2023年4月23日
下一篇 2023年4月23日

相关推荐

  • 画蛇添足告诉我们什么道理(画蛇添足告诉我们什么道理10字)

    今天小编给各位分享画蛇添足告诉我们什么道理(画蛇添足告诉我们什么道理10字),如果能碰巧解决你现在面临的问题,别忘了关注小站,我们一起开始吧! 画蛇添足,启发五个字。 “画蛇添足”…

    投稿 2023年4月23日
    1010
  • 英文版篮球历史

    The game of basketball was originated from a peach basket and a round ball more than one h…

    投稿 2023年4月22日
    920
  • 不锈钢内胆电饭锅(不锈钢锅)

    今天给大家分享一下不锈钢电饭煲的知识,也来讲解一下不锈钢锅。如果你碰巧解决了你现在面临的问题,别忘了关注这个网站,现在就开始! 哪里可以买到不锈钢电饭煲内胆? 不锈钢内胆电饭煲可以…

    投稿 2023年4月23日
    2750
  • [山泽仪式石](山泽前辈)

    今天给大家分享一下【山泽礼石】的知识,也是给山泽前辈们讲解的。如果你碰巧解决了你现在面临的问题,别忘了关注这个网站,现在就开始! 哇,山泽的祭祀石在哪里?5.2山泽是怎么得到仪式石…

    投稿 2023年4月23日
    1440
  • 周易算命看面相(周易算命看面相准不准)

    今天就给大家介绍一下周易算命面,以及周易算命面的相应知识点。希望对你有帮助,也别忘了收藏这个站点。 周易算命仅限于看手相吗? 算命除了看手相,还可以看生日,也就是四柱占卜和占卜。 …

    投稿 2023年4月23日
    1520
  • 安居乐业的解释(成语故事之旅 | 安居乐业)

    安居乐业的解释(成语故事之旅 | 安居乐业) 这一路上,会遇到哪些有趣的成语故事呢?每天一站,即刻出发! 前方到站:安居乐业。 典故 春秋时有一位著名的思想家、哲学家,姓李,名耳,…

    2023年4月23日
    1200
  • 淘宝打不开(手机淘宝打不开)

    一些使用mac电脑的小伙伴反应说使用 Safari Chrome 打开京东、淘宝、天猫等网站时会出现提示证书不被信任,不能够建立安全链接而不能打开上述网站的问题。这是 Global…

    投稿 2023年4月23日
    2480
  • ht是什么(ht是什么软件的缩写)

    先说一下,我对于区块链的各种币也是外行,只是说一点个人想法。本文绝非推荐任何形式的数字货币,请务必谨慎参考!!! 2017年的时候比特币也大热,当时有不少“比特币取代法币”论,也就…

    2023年4月23日
    1570
  • 历的组词(历的组词…)

    今天小编给各位分享历的组词(历的组词…),如果能碰巧解决你现在面临的问题,别忘了关注小站,我们一起开始吧! 日历可以组合的单词有哪些? 历史,公历,经历,农历,经历,皇…

    投稿 2023年4月23日
    1040
  • 布雷顿森林体系的主要内容(布雷顿森林体系的主要内容和缺陷是什么)

    今天我就和大家分享一下布雷顿森林体系主要内容的知识,也解释一下布雷顿森林体系的主要内容和缺陷是什么。如果你碰巧解决了你现在面临的问题,别忘了关注这个网站,现在就开始! 布雷顿森林体…

    投稿 2023年4月23日
    1080

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注