Android任务栈: 在Android中, 任务是一个栈式的容器,它用来存放多个Activity。任务栈又称后退栈。 1、默认情况下,所有Activity所需要的任务栈的名字为应用的包名,当然也可以指定包名。 1、任务栈使用后进先出的方式来管理这些Activity。 2、新启动一个应用程序,系统就会为之创建一个任务栈,用来存放在此应用程序中使用Activity的顺序。 3、默认情况下,Activity A启动Activity B时,A从前台转到后台,处于Stop的状态;B创建,位于前台,并且处于任务栈的栈顶。当用户按下返回键时,B销毁,A重新位于任务栈的栈顶,处于前台。
Activity的启动模式: 1、standard:标准模式,也是系统默认的启动方式。 特点:每次启动一个Activity都会重新创建一个新的实例(不管这个实例是否已经存在), 并且将该实例放在当前任务栈中。

Log打印:

2、singleTop:栈顶复用模式 特点:在此模式下启动Activity分为两种情况 情况一:所要启动的Activity已经存在且位于当前任务栈的栈顶,那么此时不会再去创建Activity,而该Activity的onNewIntent方法会被回调。

Log打印:
由此可以看出,再次启动SecondActivity时,并没有重新创建SecondActivity的实例,而是回调了SecondActivity的onNewIntent方法。
情况二:所要启动的Activity已经存在但没有位于栈顶,那么该Activity依然会被创建,且该Activity原来的实例依然存在于当前任务栈。
Log打印:
当再次启动FirstActivity时,虽然FirstActivity已经存在于任务栈中但由于FirstActivity没有位于栈顶所以依然会创建FirstActivity的实例。
3、singleTask:栈内复用模式 特点:在这种模式下,所要启动的Activity存在与任务栈中,不管该Activity是否位于栈顶,都不会重新创建该Activity的实例,而会回调该Activity的onNewIntent方法。 但要注意一点,如果该Activity存在于任务栈但没有位于栈顶,启动该Activity时会将该Activity上面的Activity移除任务栈,即singleTask模式默认具有clearTop的效果。
Log打印:
分析Log,用红线标出的地方是重新启动FirstActivity时,回调了onNewIntent方法,并且接着在蓝线标出的地方将SecondActivity移除了栈。 4、 singleInstance:单例模式 特点:具有此种模式的Activity只能单独的位于一个任务栈中。 系统不会向声明成"singleInstance"的Activity所在的任务当中再添加其它Activity。 比如:FirstActivity的启动模式为singleInstance,A应用的任务栈中创建了FirstActivity,则系统会给FirstActivity单独开一个任务栈,这个任务栈中只会有FirstActivity,当B应用也启动了FirstActivity,系统则会将FirstActivity放入之前的任务栈中。所以该启动模式多用于需要与程序分离的界面。

指定Activity启动模式的方法: 1、通过在AndroidMenifest中为Activity指定启动模式 为Activity设置该属性: android:launchMode="singleInstance" 2、通过在Intent中设置标志位来指定启动模式 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
二者的区别:优先级不同,第二种方式的优先级高于第一种,当同时为Activity使用两种方式设置启动模式时,第一种无效。

taskAffinity属性: affinity可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity,所以,这些Activity都更加倾向于运行在相同的任务当中。当然了,你也可以去改变每个Activity的affinity值,通过<activity>元素的taskAffinity属性就可以实现了。 该属性用于以下两个场景: 1、当启动Activity时,如果在Intent中加入了FLAG_ACTIVITY_NEW_TASK flag或 该Activity在manifest文件中声明的启动模式是"singleTask"时 (启动模式为standard或者singleTop时,即使设置了 taskAffinity属性,也不会有效果,该Activity依然运行在当前任务栈中。当启动模式为singleInstance时不管有没有设置taskAffinity属性都会为该Activity创建新的任务栈),系统就会尝试为该Activity创建一个新的任务栈。 系统会去检测要启动的这个Activity的affinity是否与当前已有的任务栈的affinity相匹配,如果可以匹配则直接将该activity放入匹配的任务栈中;如果没有相匹配的任务栈,则系统会为该Activity重新创建一个任务栈,且任务栈的名称为taskAffinity属性的值。 当然,同一个应用程序中默认的affinity是相同的,所以如果不手动设置taskAffinity属性,即使Activity的启动方式为singleTask,系统也不会重新创建新的任务栈。 2、当把Activity的allowTaskReparenting属性设置成true时,Activity就拥有了一个转移所在任务的能力。具体点来说,就是一个Activity现在是处于某个任务当中的,但是它与另外一个任务具有相同的affinity值,那么当另外这个任务切换到前台的时候,该Activity就可以转移到现在的这个任务当中。

使用Intent启动Activity时通过设置Flag来定义Activity的启动模式:
1、 FLAG_ACTIVITY_NEW_TASK 在通过Intent方式启动Activity时,加入了该Flag,则就为Activity指定了singleTask的启动模式。二者效果相同。
2、 FLAG_ACTIVITY_SINGLE_TOP 在通过Intent方式启动Activity时,加入了该Flag,则就为Activity指定了 singleTop 的启动模式。二者效果相同。
3、 FLAG_ACTIVITY_CLEAR_TOP 设置了这个flag,如果要启动的Activity在当前任务中已经存在了,就不会再次创建这个Activity的实例,而是会把这个Activity之上的所有Activity全部关闭掉。
























更多相关文章

  1. Android开发学习:ImageView的scaletype属性
  2. Android应用开发——TextView控件属性列表
  3. Android 内功心法(1.3)——android常用设计模式之观察者模式

随机推荐

  1. Android上成功实现了蓝牙的一些Profile
  2. 【Android】19.3 ContentProvider及安卓
  3. Android 自动化测试―robotium(一)环境
  4. 详解Android应用开发中Intent的作用及使
  5. Android 中文 API ——对话框 AlertDialo
  6. Android(安卓)服务两种启动方式的区别
  7. Android 中自定义View的应用 (自绘TextVi
  8. Android(安卓)、资源分目录存放
  9. ArcGIS for Android(安卓)Runtime100 基
  10. Android-x86-6.0定制之路 - 辛酸路开始