一.先了解栈的定义(置放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。某一情景下持续迅速点一下,启动了2个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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。