“古人学问无遗力,少壮工夫老始成。”只用不遗余力方可获得成功!
在Android开发中我们经常会遇到写应用的时候,涉及多个activity组件之间的跳转。比如说某个资讯的页面中,点击下一篇资讯跳转相同的页面,只有页面的数据不一样。一般情况下我不会注意launchMode 这个属性,只会使用默认的,这样会产生大量重复的activity。那是因为之前不了解,所以特此研究学习。
- 如何指定launchMode
- 基本上我们可以直接指定一个launchMode属性在AndroidManifest.xml 文件中
<activity android:name=".views.MainActivity" android:screenOrientation="portrait" android:launchMode="singleTop"/>
- 基本上我们可以直接指定一个launchMode属性在AndroidManifest.xml 文件中
- standard 模式介绍
- 这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
- activity设置为这个模式的行为是一个新的活动,每一个意图发送,将总是被创建的工作分开。想象一下,如果有10的意图去写邮件,应该有10个活动的开展为每一个单独的意图。因此,有可能是一个无限数量的这种活动在一个设备启动。
- 版本区别:
- 5.0之前
- 这种activity将被创建,并放置在堆栈的顶部,在同一个task,发送一个Intent。一直在入栈,出栈的时候按照顺序出栈。不同的应用程序,它将被堆叠在同一个任务中。
- 如果我们换到另一个应用程序,然后再切换回Gallery,我们仍将看到顶上画廊的任务launchMode标准的地方。因此,如果我们需要做任何与Gallery相关的操作,我们必须完成当前activity的事情或者关闭当前的activity,才可以回到原来的地方。
- 这种activity将被创建,并放置在堆栈的顶部,在同一个task,发送一个Intent。一直在入栈,出栈的时候按照顺序出栈。不同的应用程序,它将被堆叠在同一个任务中。
- 5.0之后
- 如果这些活动都来自同一个应用程序,它能够像5.0之前一样,堆叠的任务
- 但是在某些情况下,我们发送的Intent 来自不同的intent,新的task将被创建,新创建的activity将被放置在下面的根activity中。
- 如果这些活动都来自同一个应用程序,它能够像5.0之前一样,堆叠的任务
- 应用场景举例:
- 这种activity的一个例子是一个组成电子邮件activity或社交网络的状态张贴activity。如果你考虑一个可以单独工作的活动,为一个单独的意图服务。
- 这种activity的一个例子是一个组成电子邮件activity或社交网络的状态张贴activity。如果你考虑一个可以单独工作的活动,为一个单独的意图服务。
- singleTop 模式介绍
- singleTop模式。它的作用几乎和standard一样。唯一不同的是,如果已经存在在栈顶在对方的任务一个同类型的活动实例,不会有任何新的activity创造,而是被发送到一个存在的activity实例通过onNewIntent() 方法的意图,即会重用该实例调用当前activity的onNewIntent() 方法。
- 在singleTop模式,对于新的Intent,你要负责onCreate() 和 onNewIntent() 来控制使它适用于所有的情况。
- 适用场景:浏览书签页面使用singleTop。虽然有可能是这一活动的多个实例,如果已经有一个在任务栈顶的活动将被重用和onnewintent()将被调用。这样,你只需要返回一次返回到浏览器,如果书签activity是开始多次。
- singleTop模式。它的作用几乎和standard一样。唯一不同的是,如果已经存在在栈顶在对方的任务一个同类型的活动实例,不会有任何新的activity创造,而是被发送到一个存在的activity实例通过onNewIntent() 方法的意图,即会重用该实例调用当前activity的onNewIntent() 方法。
- singleTask 模式介绍
- 这种模式和 standard singleTop完全不同。采用singleTask launchMode 的activity是允许在系统中只有一个实例(又名Singleton)。如果系统中有一个存在的活动实例,整个任务将实例将被移动到顶部,Intent将通过onnewintent()方法交付。否则,新的activity将被创建并放置在适当的任务中。
- 在同一个应用中
- 如果没有在系统中还存在singleTask活动实例,新一将要建立简单的放在栈顶在同一个任务。
- 但如果有一个存在的singleTask activity实例放在上面,会自动地破坏(以恰当的方式 生命周期触发)其他的activity,让该实例出现在栈顶。同时,一个Intent是通过的onnewintent()方法送到singleTask activity。
- 如果没有在系统中还存在singleTask活动实例,新一将要建立简单的放在栈顶在同一个任务。
- 在不同应用中
- 一旦一个 Intent 是从另一个应用程序发送,并且没有在系统中创建的任何活动实例,新的任务将创建一个新创建的活动作为一个根活动。除非有一个应用程序,是一个拥有调用singleTask activity存在的任务,创造了新的活动会放在上面。
- 如果有任何任务存在的活动实例,整个任务将被移动到顶部和每个单独的activity在singleTask activity上的将会被销毁按照正常的生命周期。如果按下后退按钮,用户必须在返回到调用方任务之前通过堆栈中的活动进行。即先关闭图中task#1 中的activity,再回到task#2.
- 一旦一个 Intent 是从另一个应用程序发送,并且没有在系统中创建的任何活动实例,新的任务将创建一个新创建的活动作为一个根活动。除非有一个应用程序,是一个拥有调用singleTask activity存在的任务,创造了新的活动会放在上面。
- 适用场景
- 这种模式的一个示例用例是任何一个入口点活动例如电子邮件客户端的收件箱页面或社交网络的时间轴。无论如何,你必须明智地使用这个模式,在这种模式下活动可能会被破坏。
- browseractivity使用singleTask。只有一个浏览器的活动的时间,它不成为一部分的任务,把它试图打开网页。虽然它可能会返回到任何最近推出的它,当你回击它实际上是固定在其自己的任务活动栈的底部。它将分享它的任务与活动,它推出像书签.
- 这种模式的一个示例用例是任何一个入口点活动例如电子邮件客户端的收件箱页面或社交网络的时间轴。无论如何,你必须明智地使用这个模式,在这种模式下活动可能会被破坏。
- 这种模式和 standard singleTop完全不同。采用singleTask launchMode 的activity是允许在系统中只有一个实例(又名Singleton)。如果系统中有一个存在的活动实例,整个任务将实例将被移动到顶部,Intent将通过onnewintent()方法交付。否则,新的activity将被创建并放置在适当的任务中。
- singleInstance 模式介绍
- 在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
- 应用场景示例
- alarmalert使用singleInstance。只有一个警报活动在一个时间,它总是自己的任务。它启动的任何东西(如果有的话)成为它自己的新任务的一部分、
- 这种模式很少被使用。一些真正的用例是一个用于启动或应用程序的活动,你是100%肯定只有一个活动。总之,我建议你不要使用这种模式,除非它是真的有必要。
- 在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。