码迷,mamicode.com
首页 > 移动开发 > 详细

【Android API】Tasks and Back Stack

时间:2015-08-04 17:19:11      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

Back Stack

1.当前activity启动另一个新的activity时,新的activity进入栈顶,之前的activity状态变为stopped,但是它的user interface被系统保存。当点击back按钮时,当前activity出栈被销毁,之前的activity进行resume。
2.当所有的activity都出栈后,back stack为空,task被销毁。
3.当点击home按钮时,当前task会被转移至后台保存,task中所有activity处于stopped状态。当从applicaton launcher再次启动该应用时,会继续此task。
4.当task过多时,可能会被系统销毁。
5.由于back stack栈不会被重排,因此当一个特殊的activity被从不同activity中启动时,会被多次实例化时,那么它们在back stack栈中会独立的存在,而不会被替换。
6.当一个activity所在的task被移至后台或者有新的activity启动时,如果内存不足,此activity可能被系统destory。此时,切换至此task,或点击back按钮返回至此activity时,系统必须recreate这个activity,将会造成此activity内的数据丢失。为避免此现象,应该在activity中继承 onSaveInstanceState()这一回调方法来主动保存activity。
7.通过Intent的flag指定的activity mode比在manifest中指定的mode优先级更高。

Defining launch modes

Using the manifest file

1."standard"
   系统将在此activity启动的task中创建一个新的activity的实例,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。
2."singleTop"
     如果此activity当前处于task中back stack的栈顶,那么再次实例化该activity时,系统不会新建实例,而是会将intent指向已存在的实例。
     同样,此activity可以被实例化多次,每个实例可以隶属于不同的task,每个task可以拥有多个该activity的实例。只是当其已经存在于某个task的栈顶时,不会在此task中新建该activity的实例。
     一个activity实例化完成之后,即可以通过点击back按钮回到上一个activity的实例。但是当一个已存在的实例处理intent时,在onNewIntent()中的新的intent到达之前,不能点击back按钮回到此activity之前的实例。
3."singleTask"
     系统会新建一个task来存储该activity的实例,并将其作为root activity。但是如果这个activity的实例已经存在于其他task中,那么系统会将intent转到那个task中的那个实例。
     尽管此activity在一个新的task中,在此activity中点击back按钮,还是会回到这个activity之前的acitiviy中。
     如果此activity的实例已经存在于某一个task中,那么整个task都会被调至前台运行,并且此activity的实例处于栈顶位置。
4."singleInstance"
    与singleTask不同的是,保存此activity的task不会再保存其他activity实例。这种类型的activity的实例永远各自独占一个task。

Using Intent flags

1.FLAG_ACTIVITY_NEW_TASK     与singleTask作用一致
2.FLAG_ACTIVITY_SINGLE_TOP     与singleTop作用一致
     FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_NEW_TASK 经常一起使用,用来定位到其他task中已经存在的该activity的实例,并且将将其置于能够接受intent的位置。
         下图中的需求需要 FLAG_ACTIVITY_CLEAR_TOP 与 FLAG_ACTIVITY_SINGLE_TOP 搭配使用,因为activity默认的mode是standard,那么只使用FLAG_ACTIVITY_CLEAR_TOP时,虽然将A 置于栈顶,但是是新建了一个A的实例替换掉了原来的A的实例。加上FLAG_ACTIVITY_SINGLE_TOP 则仍沿用原来的实例。
技术分享
技术分享

Handling affinities

     当没有设置某activity的android:taskAffinity="string"时,此activity会继承application的affinity。
   affinity在以下两种情况下起作用:
      2. android:allowTaskReparenting 
     决定一个activity是否可以从它start的task移动到它具有affinity的task中。
     根据定义,一个root activity总是处于相同affinity的task中。由于mode设定为singleTask和singleInstance的activity只能作为root activity而存在,因此re-parenting只对mode类型为 standard和singleTop的activity有效。

Starting a task

     singleTask 和 singleInstance 只能用于带有ACTION_MAIN和CATEGORY_LAUNCHER filter的activity

版权声明:本文为博主原创文章,未经博主允许不得转载。

【Android API】Tasks and Back Stack

标签:

原文地址:http://blog.csdn.net/geeklei/article/details/47278517

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!