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

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

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

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

本文转载自:https://www.gylmap.com

栈内复用模式, 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

秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(1)

大家都在看

  • qq被冻结怎么办(qq被冻结需要手持身份证)

    IT之家7月15日消息 7月15日,微博上大量用户反馈自己的腾讯QQ号被冻结,无法登录,显示该帐号涉嫌业务违规操作(如批量登录等)被暂时冻结,请前往安全中心查询或进行资金管理。 I…

    2022年5月4日 专栏投稿
  • 杯子怎么洗(新买的塑料水杯怎么消毒)

    刚买回来的新杯子总有一股或多或少的异味,而且新的杯子也不干净卫生。可别以为随便用水清洗一下就能使杯子干净卫生无异味了,来看看新买杯子的清洗技巧,不管你买的是什么类型的杯子按照这些技…

    2022年4月25日
  • 服装怎么销售(卖女装的销售技巧)

    服装实体店竞争激烈,很多服装老板都在抱怨店里面业绩不好,其实除了货的原因,很大一部分是因为我们的导购销售能力不行,优秀的服装导购销售能够成大单,提高连带率,这样才能让店铺业绩提高。…

    2022年4月12日
  • 女士石英表哪个牌子好,三款最适合女性的高颜值手表推荐

    腕表之家 精品推荐]购买腕表的目的是什么?看时间?装饰?被其精密的结构所折服?不管怎么说,装饰已经成为了腕表最重要的功能之一,所以购买腕表时美观也是考量一个腕表的关键指标之一,并不…

    2022年6月27日
  • 怎么吃柠檬(一天吃多少个柠檬)

    天热买水果,柠檬是首选,分享3种好吃法,补充维生素,提高抵抗力 柠檬的维生素含量特别丰富,味道也十分酸爽,是很适合炎热夏季食用的水果,以前不懂柠檬的吃法,总觉得它酸得难以下口,而现…

    2022年4月3日 专栏投稿
  • 阳虚怎么办(阳虚的人怎么调理)

    患者咨询:廖医生你好,我今年40岁,像我这个年纪按道理说是壮年,平时工作压力大而且用脑太多,经常写材料,昼夜冥想。 喝过枸杞大枣桑椹人参黄精覆盆子,泡的水,感觉没啥用。 最近脚发凉…

    2022年4月16日
  • 移动卡怎么注销(不注销移动卡影响大吗)

    去移动服务厅注销电话号码,排了一个多小时队终于轮到我,然而没注销却回来了,这是怎么回事? 我有三张中国移动电话卡,两张本地卡,一张异地。现在只想保留两个电话号码,所以要去移动服务厅…

    2022年4月30日 专栏投稿
  • 在家怎么能赚钱,适合家庭主妇的十种工作

    1.其实最适合女性的工作,是家庭主妇,培养孩子,辅助丈夫。 一内一外,分工明确,家庭幸福,国家兴旺。 可惜现在没用的男人太多了,能提供家庭主妇资源的男人不多。 逼得许多女性朋友出来…

    2022年5月19日
  • 怎么招代理(想做代理商去哪找项目)

    全媒体广告项目代理商招募 我相信在朋友圈中,这样的广告大家都见过吧?没错,我们做的就是强制性植入商家广告!什么叫强制性?就是说不需要跟对方是好友,不需要对方搜索就能够把商家广告发布…

    2022年4月28日
  • 揭牌仪式主持词(机关单位揭牌仪式主持词)

    公司xx部揭牌仪式主持词 尊敬的各位领导、各位来宾、女士们、先生们: 大家上午好,值此xx集团公司成立xx周年纪念日,我们欢聚一堂,在这里隆重举行xx集团公司xx部揭牌仪式,请允许…

    2022年6月10日
品牌推广 在线咨询
返回顶部