转自http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html
参见:http://mypyg.iteye.com/blog/919643
http://marshal.easymorse.com/archives/2950
http://blog.csdn.net/infsafe/article/details/5666964
Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。以下逐一举例说明他们的区别:
standard:Activity的默认加载方法,即使某个Activity在Task栈中已经存在,另一个activity通过Intent跳转到该activity,同样会新创建一个实例压入栈中。例如:现在栈的情况为:A B C D,在D这个Activity中通过Intent跳转到D,那么现在的栈情况为: A B C D D 。此时如果栈顶的D通过Intent跳转到B,则栈情况为:A B C D D B。此时如果依次按返回键,D D C B A将会依次弹出栈而显示在界面上。
singleTop:如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。
singleTask:如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
关于singleTask这个网上颇有争议,包括google api上的说明也让我看的是一头雾水,自己用实例亲测,终于算是搞清楚了
正解:1.singleTask 并不一定处于栈底
2.singleTask 并一定会是栈底的根元素
3.singleTask 并不一定会启动新的task
情况一:如果在本程序中启动singleTask的activity:假设ActivityA是程序的入口,是默认的模式(standard),ActivityB是singleTask 模式,由ActivityA启动,刚ActivityB不会位于栈底,不是根元素,不会启动新的task,此种情况ActivityB会和ActivityA在一个栈中,位于ActivityA上面
情况二:如果ActivityB由另外一个程序启动:假设apkA是情况一中的应用,apkB是测试程序,在apkB中启动apkA中的ActivityB,刚ActivityB会位于栈底,是根元素,会启动新的task
注意:singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记
singleInstance:将Activity压入一个新建的任务栈中。例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。
好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。
PS:intent-filter中 <action android:name="android.intent.action.MAIN" />和 <category android:name="android.intent.category.LAUNCHER" />两个过滤条件缺一不可才会在程序列表中添加一个图标,图标下的显示文字是android:label设定的字符串。
最后附上自己的测试程序:http://files.cnblogs.com/xiaoQLu/launchModeTest.zip
分享到:
相关推荐
### Android Activity 的四种启动模式与 Intent.setFlags()详解 #### 一、Android Activity 四种启动模式 在 Android 应用开发中,Activity 是构成应用的基本单元之一,它负责显示用户界面并处理用户交互。为了更...
总结来说,Android启动模式是决定组件实例化和管理的重要机制,理解并恰当使用它们,能够有效提升应用的性能和用户体验。开发者应根据应用的具体需求,合理选择和配置启动模式,以实现最佳的设计和功能。
总结起来,理解并合理运用Android的启动模式,可以有效地控制Activity的生命周期,提高应用的性能和用户体验。开发者应根据应用的需求,选择合适的启动模式,确保应用在多任务环境中的行为符合预期。在设计应用架构...
在Android应用开发中,Activity是用户界面的基本组件,它的启动模式是开发者必须了解的重要概念。本文将深入探讨Android中Activity的四种启动模式:标准模式(Standard)、单实例模式(SingleInstance)、单任务模式...
总结起来,要在Android上实现开机自启动和后台运行,你需要创建一个服务,一个广播接收器,并处理好权限问题。同时,考虑到Android系统的电源管理特性,你可能还需要采用适当的策略来保证服务在后台的持续运行。请...
综上所述,了解Activity的不同启动模式和生命周期状态对于开发高质量的Android应用至关重要。同时,掌握如何正确地退出Activity以及整个Application也是提高应用稳定性和用户体验的关键因素之一。
#### 在Delphi XE5中实现Android启动图片的方法 为了在Delphi XE5中实现Android应用的启动图片,开发者需要遵循以下步骤: 1. **创建样式文件**:首先需要创建一个`Styles.xml`文件,并将其放置在项目的`res\...
### 高通MSM8994 Android启动流程解析 #### 概述 高通MSM8994是一款高性能的移动平台处理器,其启动流程是理解整个Android系统如何从硬件层面逐步启动到用户界面的关键。MSM8994包含多个子系统,包括应用处理子...
总结来说,理解并掌握Activity的启动模式对于优化Android应用的用户体验和内存管理至关重要。每个模式都有其特定的使用场景和优势,开发者需要根据应用的需求选择合适的启动模式,以确保应用的正常运行和用户交互的...
总结,Android 8.0平台实现双Wi-Fi模块STA+AP模式涉及到Android系统多个层次的定制和优化,包括驱动、HAL、框架服务以及用户体验。这一技术的实现需要深入理解Android网络系统,并具备扎实的Wi-Fi开发和调试能力。
总结来说,Android系统的启动过程是一个多层面、多步骤的复杂流程,涵盖了硬件初始化、系统服务启动、Zygote进程模型的建立以及最终用户界面的呈现。理解这一过程对于开发者优化应用性能、排查系统问题以及提升用户...
总结来说,实现Android夜间模式切换并加入颜色渐变效果主要涉及以下几个步骤: 1. 创建日间和夜间主题的XML文件。 2. 在`AndroidManifest.xml`中设置默认主题。 3. 在`Application`或`Activity`中处理主题切换逻辑...
- [Android启动过程详解](http://blog.csdn.net/basonjiang_sz/category/648399.aspx) Android从Linux系统启动的过程大致分为以下几个步骤: 1. `init`进程启动 2. Native服务启动 3. `SystemServer`启动 4. 应用...
总结来说,理解并灵活运用Activity启动模式和窗口导航是提升Android应用体验的关键。TestViewPager和TestFragmentPager项目可能提供了实践这些概念的实际代码示例,通过学习和研究这些代码,开发者可以更好地掌握...
总结,Android View的3D旋转是通过Matrix和Animation等工具实现的,可以为用户界面增加动态和立体感。理解并掌握这些技术,开发者可以创建出更多创新且引人入胜的交互式UI。在实际项目中,根据需求选择合适的方法,...
总结来说,Android外观模式是提高代码可读性和可维护性的重要工具,通过创建一个统一的接口来简化对复杂系统的访问。"Android外观模式demo"为我们提供了一个直观的例子,展示了如何在实际项目中应用这一模式。通过...
配置AudioTrack时,需要指定音频流类型、采样率、通道数等参数,并通过获取最小缓冲区大小、创建AudioTrack对象、读取PCM数据和启动/停止播放等步骤来实现音频播放功能。 总之,Android音频框架是一个复杂而精细的...
总结起来,避免BroadcastReceiver多次启动相同Activity的关键在于正确处理广播接收和Activity的启动逻辑,通过上述策略可以有效地优化广播接收行为,提高应用的性能和用户体验。在实际开发中,应结合具体场景选择...
### Android O HIDL总结 #### 一、HIDL概述 HIDL(Hardware Interface Definition Language)是一种硬件接口定义语言,用于定义Android Framework与Android HAL(Hardware Abstraction Layer)之间的接口。在...
为了解决这些问题,Android提供了四种不同的启动模式来控制Activity的创建和生命周期管理,即:`standard`、`singleTop`、`singleTask`、`singleInstance`。这些模式可以帮助开发者更高效地管理应用程序中的Activity...