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之间的加载关系。
添加属性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出栈,有些东西说不清楚,我感觉你们还是自己写个例子试试,因为还有情况我并没有测试,需要你们自己测试理解一下。
以上只是我做的测试得出的结论,如果有不对,欢迎留言。
首先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中activity的四种加载模式
- Android四种Activity的加载模式
- Android 以singleInstance模式加载的Activity怎么接收以putExtra方式传递过来参数
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- Android中区分Activity的四种加载模式
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- Android的七巧板Activity之二 Activity的加载模式 推荐
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- Android的七巧板Activity之二 Activity的加载模式
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- android中activity的四种加载模式
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- Android四种Activity的加载模式
- android中activity的四种加载模式