zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android Task详解

Android 详解 Task
2023-09-14 09:05:10 时间

什么是task
简单说task就是一些相关联的activity的集合,但activity之间不一定非得相关联。当我们按home键旁边那个方形键(recent-apps)时,屏幕上展示的就是一个个task。

task affinity
在manifest文件中,注册activity时如果不申明taskaffinity属性,默认就是app程序默认package名。默认情况下一个app中所有的activity都在一个task中。

<activity
android:taskAffinity=""
..
/>

默认情况下的affinity是app的包名

<manifest package="com.example"...>

launch modes
用来指示android系统用怎样的方式来启动activity

有俩种方式来定义launchMode:

在manifest中定义

使用Intent Flags

在manifest文件中定义

<activity android:launchMode = [“standard” | “singleTop” | “singleTask” | “singleInstance”] ../>

standard

默认的启动模式,入栈出栈操作。每一次创建一个新的activity

singletop

和standard和相似,但是有一点不同–系统会检查task栈,查看要启动的activity是否在栈顶,如果要启动的activity在栈顶,那么系统不会新创建要启动activity的实例,而是调用要启动activity的onNewIntent()方法

1-6IO-n4a4Lz4PJZ6uXd9CgA.png
singleTask
当一个activity注册时,必须要定义taskAffinity值,不然就算launchMode为singleTask,它被启动时,仍然不会新建一个task,而是在以前的task中启动。
我们能在该activity所处的栈中push其他activity的实例和其它task栈

singleInstance
和singleTask很相似,只有一个细微的差别—当一个activity的启动模式被定义为singleInstance时,在该activity所处的task栈中,不能push其他activity实例,也不能push其它task栈

当我们根据launchMOde启动一个activity时,android系统会查看taskAffinity的值。查看root activity是否有一样的taskAffinity值,如果taskAffnity值一样的,那么该activity被压入root Activity所在的task栈,如果不是,那么该activity就会压入一个全新的task栈。

使用intent flags来启动
FLAG_ACTIVITY_NEW_TASK 同launchMode中的singleTask
FLAG_ACTIVITY_SINGLE_TOP singleTop
FLAG_ACTIVITY_CLEAR_TOP 分俩种情况
1)所有的activity都在一个task中
这个flag会让系统清除要启动activity之上的activity,并让要启动的activity回到前台
2)activities在不同的task中
包含要启动的activity的task会被系统带回前台,并将要启动activity之上的activities清除。