下文整理自:
http://blog.csdn.net/pcwings/article/details/5895197
----------------------------------------
一、何为加载模式
在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
二、加载模式有哪些以及如何配置
1、在android里面,activity有四种加载模式:standard,singleTop,singleTask,singleInstance 。详细介绍在后面。
2、配置方法
直接修改AndroidManifest.xml文件,如要给一个名为Act1的activity指定其加载模式为singleTask,只需添加以下语句:
<activity android:name="Act1"android:launchMode="singleTask">
</activity>
三、四种加载模式介绍
1、standard :
系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为Act1,执行语句:
startActivity(new Intent(Act1.this,Act1.class));
后Act1将跳转到另外一个Act1,也就是现在的栈里面有 Act1 的两个实例。按返回键后你会发现仍然是在Act1(第一个)里面。
2、singleTop:
singleTop 跟standard 模式比较类似。唯一的区别就是,当跳转的对象是位于栈顶的activity(应该可以理解为用户眼前所 看到的activity)时,程序将不会生成一个新的activity实例,而是直接跳到现存于栈顶的那个activity实例。拿上面的例子来说,当Act1 为singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。这个貌似用得比较少。
3、singleTask:
singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。我觉得这种模式相当有用,在以后的多activity开发中, 经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为singleTask
模式,这种问题将不复存在。
特别注意两点:观点取自同行 “Work In Java”
a. 其实 signTask的Activity 和 FLAG_ACTIVITY_CLEAR_TOP 这个intent的设置要实现的效果差不多。
==================================================================================
For example, consider a task consisting of the activities: A, B, C, D. If D calls startActivity() with an Intent that resolves to the component of activity B, then C and D will be finished and B receive the given Intent, resulting in the stack now being: A,
B.
。。。。
==================================================================================
唯一的不一样是,FLAG_ACTIVITY_CLEAR_TOP 会re-create activity(if B NOT set to FLAG_ACTIVITY_SINGLE_TOP,如果B 设置了FLAG_ACTIVITY_SINGLE_TOP 属性那么效果就完全一样了), signTask 不会。只会保留一个instance
b.一般不要将除开始页面的其他页面设置为 singleTask 模式 的原因是有两点:
1. 当跳转的Activity设置为singleTask的时候,会把在这个task里的这个Activity之上的所有activity finish掉。
2. 其他的activity call startActivty方法调用singleTaskactivity 的 intent会直接被忽略掉。因为singleTask 的activity始终只会有一个instance 当有其他的activity调用他时候,只会调用自己的newIntent方法。
以下的来源于android 官网:
"singleTask"
=========================================================================================
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method,
rather than creating a new instance. Only one instance of the activity can exist at a time.
=========================================================================================
4、singleInstance:
看网上的解释好像都比较复杂。刚开始也没怎么明白这种模式,只知道它用的也不多。后来仔细看了网上的解释,稍微有些懂了。就按我的理解解释下。设置为singleInstance 模式的 activity 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。拿一个例子来说明吧:
现在有以下三个activity: Act1、Act2、Act3,其中Acti2 为singleInstance 模式。它们之间的跳转关系为: Act1 -- Act2 -- Act3 ,现在在Act3中按下返回键,由于Act2位于一个独立的task中,它不属于Act3的上下文activity,所以此时将直接返回到Act1。这就是singleInstance模式,不知道解释清楚了没。。
四、结语
一般的书籍都没有谈过activity的这四种加载模式,但是感觉了解一下这方面的知识还是挺有用的,也许在以后的开发中就会用到,特别是对于 singleTask 模式,它能有效地改善你的软件的用户体验,让软件的操作更加人性化些。额,就至此为此吧。
注:一般将第一个Activity设置成 SingleTask这种model之后 ,你的app就不必设置 “退出”功能了,只要处理好 back按键就可以了,当退到第一个Activity的时候,自然就退到桌面了!不过,这样做似乎性能没有得到很好的优化。
20120113新发现,如果把第一个Activity设置成SingleTask之后,无论在哪个页面,按Home键,然后再次进入app,发现都是从第一个页面开始。这是不好的,因此上面的小结是没有多少实际用途的!
一、何为加载模式
在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。
二、加载模式有哪些以及如何配置
1、在android里面,activity有四种加载模式:standard,singleTop,singleTask,singleInstance 。详细介绍在后面。
2、配置方法
直接修改AndroidManifest.xml文件,如要给一个名为Act1的activity指定其加载模式为singleTask,只需添加以下语句:
<activity android:name="Act1"android:launchMode="singleTask">
</activity>
三、四种加载模式介绍
1、standard :
系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为Act1,执行语句:
startActivity(new Intent(Act1.this,Act1.class));
后Act1将跳转到另外一个Act1,也就是现在的栈里面有 Act1 的两个实例。按返回键后你会发现仍然是在Act1(第一个)里面。
2、singleTop:
singleTop 跟standard 模式比较类似。唯一的区别就是,当跳转的对象是位于栈顶的activity(应该可以理解为用户眼前所 看到的activity)时,程序将不会生成一个新的activity实例,而是直接跳到现存于栈顶的那个activity实例。拿上面的例子来说,当Act1 为singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。这个貌似用得比较少。
3、singleTask:
singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。我觉得这种模式相当有用,在以后的多activity开发中, 经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为singleTask
模式,这种问题将不复存在。
特别注意两点:观点取自同行 “Work In Java”
a. 其实 signTask的Activity 和 FLAG_ACTIVITY_CLEAR_TOP 这个intent的设置要实现的效果差不多。
==================================================================================
For example, consider a task consisting of the activities: A, B, C, D. If D calls startActivity() with an Intent that resolves to the component of activity B, then C and D will be finished and B receive the given Intent, resulting in the stack now being: A,
B.
。。。。
==================================================================================
唯一的不一样是,FLAG_ACTIVITY_CLEAR_TOP 会re-create activity(if B NOT set to FLAG_ACTIVITY_SINGLE_TOP,如果B 设置了FLAG_ACTIVITY_SINGLE_TOP 属性那么效果就完全一样了), signTask 不会。只会保留一个instance
b.一般不要将除开始页面的其他页面设置为 singleTask 模式 的原因是有两点:
1. 当跳转的Activity设置为singleTask的时候,会把在这个task里的这个Activity之上的所有activity finish掉。
2. 其他的activity call startActivty方法调用singleTaskactivity 的 intent会直接被忽略掉。因为singleTask 的activity始终只会有一个instance 当有其他的activity调用他时候,只会调用自己的newIntent方法。
以下的来源于android 官网:
"singleTask"
=========================================================================================
The system creates a new task and instantiates the activity at the root of the new task. However, if an instance of the activity already exists in a separate task, the system routes the intent to the existing instance through a call to its onNewIntent() method,
rather than creating a new instance. Only one instance of the activity can exist at a time.
=========================================================================================
4、singleInstance:
看网上的解释好像都比较复杂。刚开始也没怎么明白这种模式,只知道它用的也不多。后来仔细看了网上的解释,稍微有些懂了。就按我的理解解释下。设置为singleInstance 模式的 activity 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。拿一个例子来说明吧:
现在有以下三个activity: Act1、Act2、Act3,其中Acti2 为singleInstance 模式。它们之间的跳转关系为: Act1 -- Act2 -- Act3 ,现在在Act3中按下返回键,由于Act2位于一个独立的task中,它不属于Act3的上下文activity,所以此时将直接返回到Act1。这就是singleInstance模式,不知道解释清楚了没。。
四、结语
一般的书籍都没有谈过activity的这四种加载模式,但是感觉了解一下这方面的知识还是挺有用的,也许在以后的开发中就会用到,特别是对于 singleTask 模式,它能有效地改善你的软件的用户体验,让软件的操作更加人性化些。额,就至此为此吧。
注:一般将第一个Activity设置成 SingleTask这种model之后 ,你的app就不必设置 “退出”功能了,只要处理好 back按键就可以了,当退到第一个Activity的时候,自然就退到桌面了!不过,这样做似乎性能没有得到很好的优化。
20120113新发现,如果把第一个Activity设置成SingleTask之后,无论在哪个页面,按Home键,然后再次进入app,发现都是从第一个页面开始。这是不好的,因此上面的小结是没有多少实际用途的!
分享到:
相关推荐
区分Activity的四种加载模式。在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。
Android系统中Activity的四种加载模式.pdf
主要介绍了Android编程之四种Activity加载模式,简要分析了Android编程中涉及的Activity的四种加载模式,具有一定参考借鉴价值,需要的朋友可以参考下
Activity加载模式demo
ActivityTask是怎么进行设计的,以及Activity四种加载模式。
Android Activity 加载模式 测试
在Android中Activity的生命周期莫过于Activity的创建到消亡的过程了。本篇博客就会介绍Activity生命周期中的不同阶段,通过实例的形式来窥探一下Activity的生命周期。搞明白Activity的生命周期是至关重要的,因为...
加载一个Activity肯定不会像加载一般的类那样,因为activity作为系统的组件有自己的生命周期,有系统的很多回调控制,所以自定义一个DexClassLoader类加载器来加载插件中的Activity肯定是不可以的。 首先不得不了解...
疯狂android讲义第四章4.3节源代码,Activity的生命周期和加载模式
(3)Hook技术动态加载APK文件中的Activity 二、Android 动态加载dex文件 1.反射方式加载(较麻烦,不介绍),需要反射出具体的方法等 2.接口编程的方式加载(以下重点介绍),只需要反射出具体的类即可,转换成接口...
Android笔记之四种launchMode例程,Activity有四种加载模式: standard singleTop singleTask singleInstance
当使用Intent跳转至某个目标Activity,需要根据目标Activity的加载模式来加载。 Activity一共有以下四种launchMode: 1.standard:默认,每次使用Intent跳转到目标Activity时都创建一个新的实例。坏处是每次进入都要...
本篇文章主要介绍了android activity的四种状态,详细的介绍了四种状态,包括Running状态、Paused状态、Stopped状态、Killed状态,有兴趣的可以了解一下。
本资源介绍了一种在Android项目中创新性地使用JavaScript与Activity进行交互的方法。这种方法打破了传统的Android UI设计模式,提供了一种更加灵活且高效的开发方式。通过将JavaScript与原生Android代码相结合,...
Android以Java为编程语言,从接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在 foreground(前景)模式,背景运行...
支持多进程模式,插件可以运行在单独的DL进程中(代码在lab分支) 支持插件中的so库(代码在dev分支) DL支持的功能 plugin无需安装即可由宿主调起。 支持用R访问plugin资源 plugin支持Activity和Fragment...
Android 的MVVM模式:View 在 大多情况下是指 Activity,也因为很多操作需要用到Context,Activity也充当 Controller 的角色,很多人喜欢把逻辑写在Activity中也是这个原因。在我眼里,MVVM模式解读应该是 ...
Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在 foreground(前景)模式,背景运行...