探索Activity启动模式

LifecycleActivity记为A,LifecycleActivity2记为B

一, Standard

略.

二, SingleTop

打开App,启动第一个Activity(A1),看到taskId == 2215

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2215
D/PRETTY_LOGGER: │ numActivities == 1
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

启动A2 

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2215
D/PRETTY_LOGGER: │ numActivities == 2
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

启动B(singleTop) 

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2215
D/PRETTY_LOGGER: │ numActivities == 3
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity2
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

再次启动B,B没有创新新实例,而是回调了onNewIntent方法

D/PRETTY_LOGGER: │ Instrumentation.callActivityOnNewIntent  (Instrumentation.java:1215)
D/PRETTY_LOGGER: │    LifecycleActivity2.onNewIntent  (LifecycleActivity2.kt:48)

在B中,启动A,记为A3

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2215
D/PRETTY_LOGGER: │ numActivities == 4
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A3中,启动B,实例数增加1,说明不再顶部的B没有得到复用.

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2215
D/PRETTY_LOGGER: │ numActivities == 5
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity2
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

 

总结:singleTop,是栈内复用. 

如果某activity为singleTop,

如果它位于栈顶,则回调onNewIntent(),而不新建实例;

如果不位于栈顶,则新建Activity.

三, SingleTask

打开App,启动第一个Activity(A1),看到taskId == 2212

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2212
D/PRETTY_LOGGER: │ numActivities == 1
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A1中,启动第二个Activity(A2) ,看到taskId不变,activity实例数为2

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2212
D/PRETTY_LOGGER: │ numActivities == 2
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A2中,启动第三个Activity(B),看到taskId仍不变.activity实例数为3

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2212
D/PRETTY_LOGGER: │ numActivities == 3
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity2
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

 在B中,尝试启动B,看到B回调了onNewIntent方法

D/PRETTY_LOGGER: │ Instrumentation.callActivityOnNewIntent  (Instrumentation.java:1215)
D/PRETTY_LOGGER: │    LifecycleActivity2.onNewIntent  (LifecycleActivity2.kt:48)

在B中,启动A,记为A3看到taskId仍不变,activity实例数增加1

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2212
D/PRETTY_LOGGER: │ numActivities == 4
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A3中启动B,此时A3出栈,B出现在栈顶.说明B(singleTask)在栈内复用了,栈内B之上的Activity都出栈.

然后,后续aciivity依次出栈.

总结:singleTask,栈内复用.

如果某Activity为singleTask

如果它位于栈顶,则不创建新实例,它在栈顶被复用;

如果位于栈中,则其上部所有Activity都出栈,该Activity置于栈顶,此为栈内复用.

四, SingleInstance

打开App,启动第一个Activity(A1),看到taskId == 2208

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2208
D/PRETTY_LOGGER: │ numActivities == 1
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A1中,启动第二个Activity(A2) ,看到taskId不变,仍为2208

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2208
D/PRETTY_LOGGER: │ numActivities == 2
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

在A2中,启动第三个Activity(B),看到taskId == 2209,已经发生变化

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2209
D/PRETTY_LOGGER: │ numActivities == 1
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity2
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity2

我们在B中,再次启动B,看到B回调了onNewIntent方法,而且numActivities仍为1,说明没有创建新实例.

D/PRETTY_LOGGER: │ Instrumentation.callActivityOnNewIntent (Instrumentation.java:1215)
D/PRETTY_LOGGER: │ LifecycleActivity2.onNewIntent  (LifecycleActivity2.kt:48)

然后,在B中,启动A,看到回到了任务栈A中,activity的实例数增加1,此时的Activity数表示taskId为2208的activity数.

D/PRETTY_LOGGER: │ taskCount == 1
D/PRETTY_LOGGER: │ taskId == 2208
D/PRETTY_LOGGER: │ numActivities == 3
D/PRETTY_LOGGER: │ topActivity == .activity.LifecycleActivity
D/PRETTY_LOGGER: │ baseActivity == .activity.LifecycleActivity

然后,点击返回按钮.发现,taskId(2208)的activity依次出栈,最后task(2209)的activity出栈.(图略)

总结:singleInstance,创建新的任务栈,而且该Activity独占这个任务栈.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值