`

Android Activity的4种TaskMode

阅读更多
只是自己看。
1. 标准
2. SingleTop
3. SingleTask
4. SingleInstance

1.
不用说,标准方式,只有一个Task 启动一个activity则会放一个activity到Task(个人理解为栈)中
即使是启动同样的activity也会一直放入堆栈中。当用户返回时则一个activity一个的退回。
2. SingleTop.
同标准模式。只有一个Task,只是当栈顶的Activity和要启用的Acitivity相同时。则不会启动新的Acitivity。
也就是说不会生成新的Activitys实例. 如果要启用Activity在Task中但不在栈顶,那也会生成新的Acitivty.
3. SigngleTask.
比2更进一步。依然只有一个Task.
然后忘了汗啊。

引用:
singleTask模式和后面的singleInstance模式都是只创建一个实例的。

当intent到来,需要创建singleTask模式Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

只是注意因为要重用这个Activity,则这个Acitivty会在栈顶,那么之前的singleTask上面的Activity就会被移出栈。


4. SingleInstance.
这个Acitivty只会有一个实例,在一个单独的Task中只Task只有这一个Activity。
一个这样的Acitivty,如Google地图,在我们的程序中调用了它定位到成都。
当我们通过 Home把程序放入了后台。 那个当我们打开google地图时。这个Acitivity 还是在之前定位的位置。注意这不是通过SaveInstaceStatus保存的。这个Activity也没有重新Create.

注意:ActA,ActA2为标准模式,ActB为SingleInstance.
程序启动了ActA, 通过ActA启动了ActB若ActB是一个SingleInstace.
那个ActA和ActB会在不同的Task中。
若ActB又启用了ActA2.那么ActA2和ActA1在一个Task中。
这里我们在ActA2按返回会回到ActA1.而不是ActB.
可以理解为ActB是一个单独的栈中,而返回是回到上一个栈。



引用:
关于singleTask这个网上颇有争议,包括google api上的说明也让我看的是一头雾水,自己用实例亲测,终于算是搞清楚了

正解:1.singleTask 并不一定处于栈底

   2.singleTask 并不一定会是栈底的根元素 

    3.singleTask 并不一定会启动新的task  

     情况一:如果在本程序中启动singleTask的activity:假设ActivityA是程序的入口,是默认的模式(standard),ActivityB是singleTask 模式,由ActivityA启动,刚ActivityB不会位于栈底,不是根元素,不会启动新的task,此种情况ActivityB会和ActivityA在一个栈中,位于ActivityA上面

  情况二:如果ActivityB由另外一个程序启动:假设apkA是情况一中的应用,apkB是测试程序,在apkB中启动apkA中的ActivityB,刚ActivityB会位于栈底,是根元素,会启动新的task


注意:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记


详见:
http://marshal.easymorse.com/archives/2950
http://www.cnblogs.com/xiaoQLu/archive/2011/09/29/2195742.html

补充:
亲测,在返回时主栈退入结束后会回退到SingleInstace页面。
补充2:
再测SingleTask.
可以明确的确只会有一个实例。
上面的也的确是正解.
当我们在一个程序A中使用其它程序B的SingleTask ActB实例时,若该Activity并没有实例,则会生成在一个新实例并放入新的Task tb中(若此时启动B中新的标准Activity也会放入这个新的Task tb中). 通过返回会回到A程序。
若ActB已经开启,则ActB依然在原来的Task tb中。并不会放入到A程序中的栈。且tb会成为当前栈.按返回会跳到tb中的下一个Activty. 一直到这个Task中没有Activity实例。
最后回到A。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics