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独占这个任务栈.