Android ---Activity 的启动模式详解

关于activity 的启动模式还是很重要的,因为涉及到许多跳转问题。所以开发者需要对启动模式有一个良好的认识 ,那么activity的究竟有几种启动模式呢 首先我想唠叨下写博客中出现的问题。 就是进程 包括了栈 大家不要混淆。一个app启动系统会开辟一个进程给他 而里面的activity运行在进程里的栈里。

第一种 standard 

这种启动模式 是activity的最常用的模式 ,标准启动模式。之所以成为标准是他最普遍。没有特殊的地方。打开一个标准的activity,那么就会创建对应activity的实例入当前启动者所在的栈、不管之前有没有创建过。举个栗子:

当前 栈内 有一个 activity A, A 要打开   标准模式 activity B   B之前是否在Q 内存在实例都 会重新创建 B并入Q栈内。

第二种 singleTop 

singleTop 启动模式 是一个  复用栈顶的启动模式 ,分两种情况 。(1)若当前栈内的栈顶是该activity,那么复用这个实例不会重新创建。(2)若当前栈内有 activity,但是activity不在栈顶或者当前栈内没有activity实力。都会重新创建一个activity实例入栈。那么这两种情况具体什么意思? 举个栗子:

(1)当前Q栈的activity情况  ABC  ,C在栈顶。C的lunchmode 模式为singleTop。 这时要打开C 就不会重新创建一个C 而是复用当前已有的C 并将intent 传入调用C 的onnewIntent ()  打开C。打开之后栈内的情况是ABC 就没什么变化

 (2)当前栈内activity 情况ACB   B 在栈顶  C 的lunchmode 模式为singleTop。这时要启动C 会重新创建一个C之后栈内情况就是 ACBC 。 如果栈内activity 情况AB   B 在栈顶  C 的lunchmode 模式为singleTop 这时要启动C  就和刚才那个情况是一样的重新创建C实例并入栈 启动后 栈内的情况是 ABC

第三种 singleTask 

singleTask 是一种栈内复用模式 他的核心就是 在activity的要启动的 栈 内(这里我标红了是因为他会受taskAffinity 属性影响但是核心思想就是:)---->> 查找是否存在该activity的实例若存在那么就清除该activity上面的其他的activity 让该activity来到栈顶 若不存在那么重新创建。

那么 什么是 taskAffinity 他可以指定activity启动的栈 。如果有这个栈就会入这个栈。如果没有就会重新创建一个栈,这个属性对前两个启动模式没有影响只对singletask与singleinstance 有影响 

举几个栗子 :

(1) 没有指定taskAffinity 栈内情况 ADBC   ,D是启动模式为singleTask的  这时复用已经存在的D 不会重新创建 回调D 的onnewintent() ,  那么之后栈内的情况是 AD。

 (2)指定taskAffinity 栈内情况AB ,D 启动 这时汇创建一个对应的taskAffinity 然后创建一个新的D入新创建的栈   所以这时有两个栈 。 AB , D 

第四种 singleInstance 

singleinstance 是一个特殊的模式 表示activity在当前系统内只有一个实例 并且单独一个栈 而且这个栈里只有他自己

其他由他打开的ac 都会重新创建一个新的栈 。不会与他公用一个栈。   

猜你喜欢

转载自blog.csdn.net/ImTryCatchException/article/details/52605814