Activity的启动模式
2016-05-27 08:25
471 查看
Activity的启动模式
1.standand:标准模式
2.SingleTop:单栈顶复用模式
3.SingleTask:单任务栈复用模式
4.SingleInstance:单实例模式
解释:
1.Activity 标准的就不用解释了。
2.这种模式下,如果新的Activity已经位于任务栈的栈顶,那么它不会被重新创建。所以不会执行onCreate,onStart方法。回调的onNewIntent方法,通过这个方法的参数拿到传递过来的的信息。如果新的Activity不是位于栈顶,那么此Activity还是会被重新创建的。
3.只要Activity在某个任务栈中已经存在,那么多次启动该Activity都不会被重新创建。此时也不会执行onCReate,onStart方法。会回调onNewIntent()方法。
3.1:任务栈S1中有Activity ABC,这个时候ActivityD以SingleTask模式启动。其所需要的任务栈为S2,因为S2和D的实例都不存在,所以系统会先创建任务栈S2,在创建D。
3.2:如果任务栈中有Activity ABCD,如果此时请求启动B。因为B已经存在于任务栈中,系统会把栈中B上面的实例都pop出去,B作为栈顶。此时任务栈的情况是AB。
4.这种模式继承了SingleTask的所有特点。并且还有一点,就是具有此种模式的Activity只能单独的位于某一个任务栈中。如A启动后,系统会为A先创建一个任务栈。其后再多次请求启动A,都不会重新创建该实例。
补充:
1.什么是任务栈?
答:什么是任务栈需要从一个参数讲起:TaskAffinity,可以翻译为任务相关性。这个参数标识了一个Activity所需要的任务栈的名字。默认情况下的所有Activity的TaskAffinity都为应用程序的包名。如果要自己设定,那就设置与包名不一样的。TaskAffinity属性主要和SingleTask启动模式或者allowTaskReParenting属性配对使用,在其他情况下没有意义。
例子:
Activity 模式 TaskAffinity
A Standard 默认
BC SingleTask 与默认不同为com.yao
现从A-->B-->C-->A -->B 再按两次返回键会回到桌面。
解释:A -->B 以为A是标准且TaskAffinity为默认,B不同,所以系统会为B另外创建一个任务栈名为com.yao。B-->C,BC的模式一样,所以C直接入栈com.yao中。
从C启动到A,A是标准模式,则A会直接进入到启动它的Activity的任务栈中。到此时有两个任务栈了,一个为任务栈默认,里面只有A,另一个为任务栈com.yao,里面有BCA
从com.yao中的A再次启动B,关键点在这,因为B为SingleTask模式,实例已经在com.yao中了,所以,系统不会再次创建B,而是直接将B上面的实例移除。所以任务栈com.yao最后只剩下B,此时按一次任务栈com.yao就空了,系统会回到默认任务栈,显示出A,再次返回就直接回到桌面了。
1.standand:标准模式
2.SingleTop:单栈顶复用模式
3.SingleTask:单任务栈复用模式
4.SingleInstance:单实例模式
解释:
1.Activity 标准的就不用解释了。
2.这种模式下,如果新的Activity已经位于任务栈的栈顶,那么它不会被重新创建。所以不会执行onCreate,onStart方法。回调的onNewIntent方法,通过这个方法的参数拿到传递过来的的信息。如果新的Activity不是位于栈顶,那么此Activity还是会被重新创建的。
3.只要Activity在某个任务栈中已经存在,那么多次启动该Activity都不会被重新创建。此时也不会执行onCReate,onStart方法。会回调onNewIntent()方法。
3.1:任务栈S1中有Activity ABC,这个时候ActivityD以SingleTask模式启动。其所需要的任务栈为S2,因为S2和D的实例都不存在,所以系统会先创建任务栈S2,在创建D。
3.2:如果任务栈中有Activity ABCD,如果此时请求启动B。因为B已经存在于任务栈中,系统会把栈中B上面的实例都pop出去,B作为栈顶。此时任务栈的情况是AB。
4.这种模式继承了SingleTask的所有特点。并且还有一点,就是具有此种模式的Activity只能单独的位于某一个任务栈中。如A启动后,系统会为A先创建一个任务栈。其后再多次请求启动A,都不会重新创建该实例。
补充:
1.什么是任务栈?
答:什么是任务栈需要从一个参数讲起:TaskAffinity,可以翻译为任务相关性。这个参数标识了一个Activity所需要的任务栈的名字。默认情况下的所有Activity的TaskAffinity都为应用程序的包名。如果要自己设定,那就设置与包名不一样的。TaskAffinity属性主要和SingleTask启动模式或者allowTaskReParenting属性配对使用,在其他情况下没有意义。
例子:
Activity 模式 TaskAffinity
A Standard 默认
BC SingleTask 与默认不同为com.yao
现从A-->B-->C-->A -->B 再按两次返回键会回到桌面。
解释:A -->B 以为A是标准且TaskAffinity为默认,B不同,所以系统会为B另外创建一个任务栈名为com.yao。B-->C,BC的模式一样,所以C直接入栈com.yao中。
从C启动到A,A是标准模式,则A会直接进入到启动它的Activity的任务栈中。到此时有两个任务栈了,一个为任务栈默认,里面只有A,另一个为任务栈com.yao,里面有BCA
从com.yao中的A再次启动B,关键点在这,因为B为SingleTask模式,实例已经在com.yao中了,所以,系统不会再次创建B,而是直接将B上面的实例移除。所以任务栈com.yao最后只剩下B,此时按一次任务栈com.yao就空了,系统会回到默认任务栈,显示出A,再次返回就直接回到桌面了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories