【android】Activity启动模式

本文参考自:

①《Android开发艺术探索》

②Android Developers: https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack


Android Activity启动模式共有4种:standard(默认模式)、singleTop、singleTask和singleInstance。

启动模式设置

启动模式设置有两种方法,一种是在清单文件中设置,另一种是在Intent中设置标志位来指定activity启动模式。

1、在清单文件中设置:

<activity android:name=".login.LoginActivity"
            android:launchMode="singleTop" />

2、在Intent中设置标志位

Intent intent = new Intent(mContext, StuffDetailActivity.class);
            intent.putExtra("STUFFID", stuffId);
            intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);

如果在非activity的上下文中开启activity,就必须添加标志位,否则会提示以下异常。

Calling startActivity from outside of an activity context requeies the FLAG_ACTIVITY_NEW_TASK flag.

启动模式介绍

0、任务栈

(1)任务栈是一个栈结构,具有先进后出的特性,每个Activity都存放在任务栈中。

(2)每创建或者退出一个acitivity,都会在修改任务栈的内容。

(3)只有栈顶的activity才能和用户进行交互。

(4)当所有activity都出栈时,任务栈才能被销毁

(5)任务栈分为前台任务栈和后台任务栈,前台任务栈是当前页面中所显示的Activity所在的任务栈,其余任务栈为后台任务栈。


1、standard:

标准模式,也是默认模式,Activity设置了该模式后,每次启动一个activity都会创建一个新的实例,并添加到当前任务栈中,一个任务栈可以有多个相同实例,每个实例也可以属于不同的任务栈。该启动模式符合常规的activity生命周期。


如图,当以standard模式,再次启动MainActivity时,就会创建一个新的MainActivity实例。

2、singleTop

栈顶复用模式。

①如果新Activity已经位于任务栈栈顶,则不会重新创建Activity,同时onNewIntent方法会被回调,通过该方法,可以获取到请求该activity中的数据,同时onCreate、onStart方法不会被调用。

②如果activity实例已存在,但是不是位于栈顶,则该activity还是会被重新创建。

如上图,当B位于栈顶时,则不再创建新的Bactivity。


如上图,AActivity不位于栈顶,启动AActivity,则重新创建新的A。


如上图,启动AActivity,会在该重新创建AActivity。

3、SingleTask

栈内复用。在该模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时onNewIntent方法会被回调。

①如果A Activity请求启动,先寻找是否存在A想要的任务栈,如果不存在创建一个新的任务栈,并将A入栈。

②如果存在A所需要的任务栈,要判断A在栈中是否存在,如果存在,则将A调到栈顶并调用onNewIntent方法,如果实例不存在,则创建A并放置栈中。


4、SIngleInstance

单实例模式。具有singleTask的所有特性,并且该Activity只能存在于单独的一个任务栈中,后续的所有请求均不会创建新的Activity,除非这个任务栈被系统销毁。


任务相关性(TaskAffinity)

任务相关性是一个参数,该参数标识了Activity所需任务栈的名称(也就是singleTask中,提及到的Activity所需任务栈),默认情况下,所需的任务栈的名称为项目的包名。该标识主要用于多个应用之间的Activity创建,比如A应用需要创建B应用中的b Acitivity,然后按Home键回到桌面, 点击B应用,这是启动的是A应用中,任务栈的BAcitivity。


Acitivity标志位

标志位可以用于intent中,Activity的启动模式。

FALG_ACTIVITY_NEW_TASK:指定启动模式为SingleTask

FALG_ACTIVITY_SINGLE_TOP:指定启动模式为singleTop

FALG_ACTIVITY_CLEAR_TOP:同一任务栈中所有位于该Acitivity上的Activity都要出栈。





猜你喜欢

转载自blog.csdn.net/J675620982/article/details/80380968