Activity启动模式

以下:内容摘自《Android开发艺术探索》,内容仅用于自我记录学习使用。

任务栈:当启动一个Activity时,系统会创建其实力并把它们一一放入任务栈中,当点击back键时Activity会一一回退,直到栈空为止,系统便会回收这个任务栈。

Activity的启动模式有四种:

1. standard: 标准模式
系统模式模式,每启动一次Activity系统都会重新创建一个新的实例。即该模式允许一个任务栈中有多实例,或者多个实例分属不同的任务栈。这种实例的生命周期符合典型情况下的Activity的生命周期。
这种模式下谁启动了Activity,Activity就会在启动它的那个Activity的任务栈里。即Activity A启动了B,则B会进入到A的任务栈中。
注:非Activity类型的Context时(如ApplicationContext)没有所谓的任务栈,所以使用这种Context启动Activitity会出错。解决方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,但这个方式启动的Activity是singleTask模式启动的。

2. singleTop: 栈顶复用模式
即新Activity位于栈顶时则不会被重新创建,同时会回调其onNewIntent方法,但不会执行onCreate,onStart方法。如果新Activity不位于栈顶,则会重新创建新Activity。

3. singleTask: 栈内复用模式
即只要新Activity在该任务栈内存在,都不会重新创建,和singTop相同也会回调其onNewIntent方法。在模式下,如果启动一个Activity A,系统首先会寻找是否存在A想要的任务栈,如不存在,则重新创建一个任务栈,否然后创建A的实例放入栈中。如存在该任务栈,系统会看A的实例是否存在该栈中,若存在则会把A调入栈顶,并调用onNewIntent方法。若不存在实例则会创建A的实例并压入栈中。这种模式默认具有clearTop特性,如在S1栈中,有ABC三个Activity, 其中A在栈底,C在镇定,若A以singTask模式启动,则会将BC全部出栈,最后栈中会变成只有A。

4. singleInstance: 单实例模式
这是singleTask的加强模式,即具有此模式的Activity是单独存在于一个任务栈中,即Activity A 是该模式时,若启动A,系统会为A创建一个新的任务栈,然后A独自在这个任务栈中,由于栈内复用特性,后续不会创建新的A实例。除非这个独特的任务栈被销毁。

指定启动模式的方法:

1. 通过AndroidMenifest.xml 配置指定

 <activity
            android:name="..."
            android:configChanges="orientation|keyboardHidden"
            android:launchMode="singleTask"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.NoTitleBar" />

2.通过Intent设置标志位指定

Intent intent = new Intent();
intent.setClass(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

FLAG_ACTIVITY_NEWTASK: 即singleTask 模式

FLAG_ACTIVITY_SINGLE_TOP: 即singleTop模式

FLAG_ACTIVITY_CLEAR_TOP: 即清理栈顶功能,会将启动Activity栈顶的Activity全部出栈, 一般和singleTask模式一起使用,在这种情况下,被启动的Activity实例如果已经存在,则系统调用其onNewIntent。如果被启动的Activity采用 standard模式启动,那么它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。

FLAG_ACTIVITY_EXCLUDE_FROM_REXENTS: 即该模式启动的Activity不会出资按在历史Activity的列表中,即用户无法通过历史列表回到具有该标志的Activity,相当于Activity xml中的android:excludeFromRecents=“true”

注:两种方式的区别:
1. 优先级: 第二种优先级高于第一种,即两种方式同时存在以第二种为准。
2. 第一种无法指定为FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法指定singleIntstance模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫吻鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值