探索Activity启动模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_sdn/article/details/84637632

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

猜你喜欢

转载自blog.csdn.net/M_sdn/article/details/84637632