相关的基本概念:
一、任务栈(Task)html
若干个Activity的集合的栈表示一个Task。
栈不只仅只包含自身程序的Activity,它也能够跨应用包含其余应用的Activity,这样有利于保障用户体验,维护用户操做体验上的完整性。
例如:微信ActivityA 分享文章到QQActivityB,两个activity是存在于不一样app中的,可是被系统放在一个任务中,分享后,用户按back键返回,能够返回到原来的微信Activity A中,这就确保了用户体验。
二、查看当前系统的任务栈
命令行中 --> adb shell dumpsys activity
三、Activity 的相关属性
android:taskAffinity:是否认义了该属性,对接下来讨论到的singleTask影响甚大,若是设置了Activity的taskAffinity属性值,Activity将在TaskName为指定值的独立Task中启动,不然,将在原来的默认Task中。
android:allowTaskReparenting:主要做用是activity的迁移,程序A已经启动了若干个Activity,其中包含Activity1(这个Activity1拥有该属性),当程序B也要启动它的时候,其可迁移到程序B内。
android:alwaysRetainTaskState:操做系统会在程序长时间不会动的时候,清除Task状态,若是开启这个,系统会继续保持直到再次打开,只对根Activity生效(ABC,A是栈底,C是栈顶,只能对A便可)。例如微信在后台,当咱们再次打开应用时,系统会判断是否已经存在以A为根Activity的栈,若是有,直接使用该栈,并显示栈顶的Activity。
android:clearTaskOnLaunch:用来标记是否在启动该Activity时,清除除根目录的其余Activity
android:exported:是否支持其它应用调用当前组件。默认值:包含有intent-filter 默认值为true(); 没有intent-filter默认值为false。
四种启动模式:
standard:每次激活Activity时(startActivity),都建立Activity实例,并放入任务栈;
singleTop:若是该Activity位于任务栈栈顶,则不须要建立,复用实例而且会调用该实例的onNewIntent()方法将Intent对象传递到这个实例中,其他状况都要建立Activity实例;(singleTop模式,只在当前任务栈中生效、startActivityForResult启动一个设置了singleTop的activity,singleTop模式将无效)
关于onNewIntent():
根据文档知,当Activity的启动模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP这个标记启动新的Activity而且Activity栈顶就是待启动的Activity的时候,会调用原Activity的这个方法;例子:QActivity为栈顶复用模式,当Qactivity位于栈顶时,再次打开,onResume() -->onPause() -->onNewIntent() -->onResume() 。当Qactivity不位于栈顶时,onNewIntent-->onRestart-->onStart-->onResume(也就是说只要栈顶不是Qactivity ,都会建立新的实例,是Qactivity则重用不新建)。
singleTask:使用好栈内复用模式对taskAffinity属性的理解很重要。
存在相同taskAffinity属性值的Task:不存在实例,则新建Activity实例。若是存在则把当前实例中复用实例, 这个 Activity 启动而且清除顶部的 Acitivity ,经过标识 CLEAR_TOP。
taskAffinity属性值不同的Task:在这个 Task 中新建这个 Activity 实例。
singleInstance:和singleTask差很少,惟一不一样的是singleInstance Activity实例的Task只能存放一个该模式的Activity实例,例如Qactivity加载Wactivity都会被放入其它的Task中,若是存在与Wactivity相同affinity的Task,则在该Task内建立Wactivity。若是不存在,则从新生成新的Task并入栈。
经常使用Intent Flags:
FLAG_ACTIVITY_NEW_TASK: 若是task中已经有了你要启动的activity的话,当前task会被带到前台(无论这个activity是否在前台,有可能activity上边还压有别的activity)。若是配合FLAG_ACTIVITY_NEW_MULTI_TASK,则不管什么状况都会建立新的Task,就成了相似 singleInstance 的状况了。若是配合 FLAG_ACTIVITY_CLEAR_TASK,则会先清空该栈,而后向栈中添加目标Activity,栈ID不变。
例如:Flag为FLAG_ACTIVITY_NEW_TASK,Qactivity(栈为LOL)启动Wactivity(栈为DOTA),接着启动Eactivity(栈为DOTA),Home回桌面。打开该应用,Qactivity启动Wactivity,Eactvity会出如今前台,由于它是整块栈启动(里面顺序不变)。
FLAG_ACTIVITY_SINGLE_TOP: 至关于launchMode中的singleTop。
FLAG_ACTIVITY_CLEAR_TOP: 与singleTask相似,但有极大区别,它会销毁目标Activity和它之上的全部Activity,从新建立目标Activity,并无执行onNewIntent()。
tips:
指定启动模式时,Flags的优先级大于launchMode,当二者都有时,以
Intent Flag有效。
注意事项:
一、
当目标的启动模式不为标准模式时,不要使用startActivityForResult去启动目标,容易出现你意想不到的结果。
例如:(大概意思,startActivityForResult至关于白设置,会返回一个取消的结果)
**if the activity you
* are launching uses the singleTask launch mode, it will not run in your
* task and thus you will immediately receive a cancel result
二、当Activity执行了onDestroy,没有执行finish,那么实例都仍是存在栈里的。但Activity被finish掉了,则它会是新建实例从新入栈,不会按启动模式想的那样。
转载注明来自:http://www.cnblogs.com/wujiancheng/