Android之四大组件之一-Activity(三)
2016-07-01 14:09
691 查看
Activity四种加载模式
**为什么要为Activity指定加载模式?
Android对Activity的管理,采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建了一个Task,然后启动这个应用的入口Activity,Android的Task是一个有点麻烦的概念,因为Android并没有为Task提供API,因此开发者无法真正访问Task,只能调用Activity的
getTaskId()方法来获取它所在的Task的ID,事实上,我们可以把Task理解成Activity栈,Task以栈的样式来管理Activity,先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。
那么Activity的加载模式,就负责管理实例化,加载Activity的方式,并可以控制Activity与Task之间的加载关系。
配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性持支如下4个属性值:
1)standard 默认
不管Activity实例是否存在,
都会创建一个新的实例装入Task。
(每次通过这种模式来启动目标Activity时,
android总会为目标Activity创建一个新的实例,
并将该Activity添加到目前的Task栈中,
这种模式不会启动新的Task,新的Activity将被添加到原有的Task中)
例子:10个应用程序都要调用浏览器的应用,
那么你需要创建10个浏览器对象的Activity的对象吗?
2)singleTop 栈顶单例 --->微薄刷新
被跳转的Activity位于Task顶部时:
不会创建新的实例,直接复用已有的Activity实例
被跳转的Activity不是位于顶部时:
创建一个新的实例,同standard模式相似
3)singleTask 栈内单例:在同一个Task内只有一个实例
采用这种模式分三种情况:
a)如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。
b)如果将要启动的目标Activity已经位于Task栈顶,此时同singleTop模式
a)如果将要启动的目标Activity没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。
4)singleInstance 全局单例模式
采用这种模式启动目标Activity时,可分为如下两种情况:
a)如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,在创建目标Activity的实例,
并将它加入新的Task的栈顶。
b)如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,
系统会把该Activity所在的Task转到前台,从而使用该Activity显示出来。
需要指出:采用单例模式加载Activity总是位于Task栈顶,
采用单例模式加载Activity所在Task只包含该Activity
**为什么要为Activity指定加载模式?
Android对Activity的管理,采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建了一个Task,然后启动这个应用的入口Activity,Android的Task是一个有点麻烦的概念,因为Android并没有为Task提供API,因此开发者无法真正访问Task,只能调用Activity的
getTaskId()方法来获取它所在的Task的ID,事实上,我们可以把Task理解成Activity栈,Task以栈的样式来管理Activity,先启动的Activity被放在Task栈底,后启动的Activity被放在Task栈顶。
那么Activity的加载模式,就负责管理实例化,加载Activity的方式,并可以控制Activity与Task之间的加载关系。
配置Activity时可指定android:launchMode属性,该属性用于配置该Activity的加载模式,该属性持支如下4个属性值:
1)standard 默认
不管Activity实例是否存在,
都会创建一个新的实例装入Task。
(每次通过这种模式来启动目标Activity时,
android总会为目标Activity创建一个新的实例,
并将该Activity添加到目前的Task栈中,
这种模式不会启动新的Task,新的Activity将被添加到原有的Task中)
例子:10个应用程序都要调用浏览器的应用,
那么你需要创建10个浏览器对象的Activity的对象吗?
2)singleTop 栈顶单例 --->微薄刷新
被跳转的Activity位于Task顶部时:
不会创建新的实例,直接复用已有的Activity实例
被跳转的Activity不是位于顶部时:
创建一个新的实例,同standard模式相似
3)singleTask 栈内单例:在同一个Task内只有一个实例
采用这种模式分三种情况:
a)如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。
b)如果将要启动的目标Activity已经位于Task栈顶,此时同singleTop模式
a)如果将要启动的目标Activity没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。
4)singleInstance 全局单例模式
采用这种模式启动目标Activity时,可分为如下两种情况:
a)如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,在创建目标Activity的实例,
并将它加入新的Task的栈顶。
b)如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,
系统会把该Activity所在的Task转到前台,从而使用该Activity显示出来。
需要指出:采用单例模式加载Activity总是位于Task栈顶,
采用单例模式加载Activity所在Task只包含该Activity
相关文章推荐
- C++基于栈实现铁轨问题
- 浅析C语言中堆和栈的区别
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- java数据结构之java实现栈
- 浅析栈区和堆区内存分配的区别
- 用Java代码实现栈数据结构的基本方法归纳
- 用PHP解决的一个栈的面试题
- 浅谈C#中堆和栈的区别(附上图解)
- C#使用Object类实现栈的方法详解
- JavaScript数据结构与算法之栈详解
- C语言之栈和堆(Stack && Heap)的优缺点及其使用区别
- Python实现栈的方法
- JavaScript数组的栈方法与队列方法详解
- JavaScript数据结构与算法之栈与队列
- JavaScipt中栈的实现方法
- Java中堆和栈的区别详解