您的位置:首页 > 移动开发 > Android开发

android ---Activity加载模式

2016-12-16 16:52 260 查看
如果对这边看不太懂的话,建议先看看我之前写过的博客http://blog.csdn.net/ksj_j/article/details/53674770

首先Activity是由Task栈来管理的,Task的概念不好说,可以理解为类似Activity栈。官方API也没有关于Task的,我们只能通过getTaskId()这个方法来获取当前Task的id。我们只要知道他是一种栈就可以了,而且可以不止一个。Activity的加载模式,就负责管理实例化,加载Activity的方式,并可以控制Activity与Task之间的加载关系。

<activity
android:launchMode="standard"
android:name=".MainActivity"
android:label="@string/app_name" >


添加属性launchMode,可以修改加载模式

Activity启动方式分为4种,standard(默认模式),singleTop,singleTask,singleInstance

standard:一般模式

singleTop:栈顶单例模式

singleTask:栈内单例模式

singleInstance:全局单例模式





->表示按钮跳转

standard:举个栗子:Activity:A(standard),B(standard),C(standard)    

                                                         A->B,B->A,A->C,C->C    此时栈为:ABACC

singleTop:举个栗子:Activity:A(standard),B(standard),C(singleTop)     

                                                         A->B,B->C,C->C,    此时栈为:ABC

singleTask:举个栗子:Activity:A(standard),B(standard),C(singleTask)    

                                                         A->B,B->C,C->B,B->C,
4000
此时栈为:ABC

singleInstance:举个栗子:Activity:A(standard),B(standard),C(singleInstance) 

                                                         A->B,B->C,C->B,     此时栈为:栈1:AB  栈2:C

现在我来解释一下为什么会出现这种情况:

standard:由于存储Activity是栈,所以一个个Activity进栈,所以栈为ABACC,这和应该没什么问题吧

singleTop:栈顶单例,当在栈顶的时候只能存在一个同样的Activity,由于是栈顶单例,所C->C的时候就没有生成新的Activity,而是执行了onNewIntent,所以栈列为ABC

singleTask:栈内单例模式,此时写全应该是ABCBC,由于C是singleTask,将CBC变成C,它会将上一次出现的到这次的全部销毁,也就是两个C之间的全部会执行onDestroy方法,进来的C在执行onRestart方法而不是执行onCreate,所以就变成ABC

singleInstance:singleInstance会自己使用一个私有的Task栈,其他Activity不可以进栈,就是在此时有两个栈,每个栈都有一个id,如果一直按返回键,出栈顺序应该是BAC,但是C一定是最后出来,因为C不在AB栈中,所以不会和他们一起出来,如果有两个singleInstance,此时谁距离栈顶越远越后出来,假设上面那个案例A也是singleInstance,分析一下栈,栈1:B 
栈2:A  栈3:C     首先原来序列是ABCB,肯定B先出栈,然后是距离更近的C出栈,最后是距离最远的A出栈,有些东西说不清楚,我感觉你们还是自己写个例子试试,因为还有情况我并没有测试,需要你们自己测试理解一下。

以上只是我做的测试得出的结论,如果有不对,欢迎留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android