以下Demo验证,基于Android28
一、标准的生命周期
下面来研究下几种特殊情况
2个Activity切换
- 启动StartActivity
D/StartActivity: onCreate
D/StartActivity: onStart
D/StartActivity: onResume
D/StartActivity: onPostResume
- StartActivity启动SecondActivity
D/StartActivity: onPause
D/SecondActivity: onCreate
D/SecondActivity: onStart
D/SecondActivity: onResume
D/SecondActivity: onPostResume
D/StartActivity: onStop
D/StartActivity: onSaveInstanceState
- SecondActivity返回到StartActivity
D/SecondActivity: onPause
D/StartActivity: onRestart
D/StartActivity: onStart
D/StartActivity: onResume
D/StartActivity: onPostResume
D/SecondActivity: onStop
D/SecondActivity: onDestroy
StartActivity onPause() => SecondActivity onCreate() => SecondActivity onResume() => StartActivity onStop() => (StartActivity如果没有调用finish(),则不一定会调用onDestroy(),由系统决定)
我们知道onStop()是在页面完全不可见时执行,所以一定是在第二个页面完全加载完即onResume()执行完,再执行。
调用finish()方法
- 在默认启动的Activity中调用
- onCreate()调用
D/StartActivity: onCreate
D/StartActivity: onDestroy
- onStart()调用
D/StartActivity: onCreate
D/StartActivity: onStart
D/StartActivity: onStop
D/StartActivity: onDestroy
- onResume()调用
D/StartActivity: onCreate
D/StartActivity: onStart
D/StartActivity: onResume
D/StartActivity: onPostResume
D/StartActivity: onPause
D/StartActivity: onStop
D/StartActivity: onDestroy
可见,生命周期是成对出现的。 2. 在SecondActivity中调用
- onCreate()调用
D/StartActivity: onPause
D/SecondActivity: onCreate
D/StartActivity: onResume
D/StartActivity: onPostResume
D/SecondActivity: onDestroy
- onStart()调用
D/StartActivity: onPause
D/SecondActivity: onCreate
D/SecondActivity: onStart
D/StartActivity: onResume
D/StartActivity: onPostResume
D/SecondActivity: onStop
D/SecondActivity: onDestroy
- onResume()调用
D/StartActivity: onPause
D/SecondActivity: onCreate
D/SecondActivity: onStart
D/SecondActivity: onResume
D/SecondActivity: onPostResume
D/SecondActivity: onPause
D/StartActivity: onResume
D/StartActivity: onPostResume
D/SecondActivity: onStop
D/SecondActivity: onDestroy
可见,也完全符合Activity切换及成对出现的生命周期逻辑。
launchMode的影响
1. 启动SingleTaskActivity(SingleTaskActivity在当前栈顶)
D/SingleTaskActivity Life: onCreate
D/SingleTaskActivity Life: RunningTaskInfo id=55 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleTaskActivity}
D/SingleTaskActivity Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/SingleTaskActivity Life: onStart
D/SingleTaskActivity Life: onResume
2. 打开SingleInstanceActivity(创建新的栈,并入栈)
D/SingleTaskActivity Life: onPause
D/SingleInstanceActivity Life: onCreate
D/SingleInstanceActivity Life: RunningTaskInfo id=56 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity}
D/SingleInstanceActivity Life: RunningTaskInfo id=55 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleTaskActivity}
D/SingleInstanceActivity Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/SingleInstanceActivity Life: onStart
D/SingleInstanceActivity Life: onResume
D/SingleTaskActivity Life: onStop
3. 打开默认StartActivity(和SingleTaskActivity共用栈,StartActivity为栈顶)
D/SingleInstanceActivity Life: onPause
D/StartActivity Life: onCreate
D/StartActivity Life: RunningTaskInfo id=55 activities=2 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.StartActivity}
D/StartActivity Life: RunningTaskInfo id=56 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity}
D/StartActivity Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/StartActivity Life: onStart
D/StartActivity Life: onResume
D/SingleInstanceActivity Life: onStop
4. 打开SIngleInstanceActivity2(再创建新的栈,并入栈)
D/StartActivity Life: onPause
D/SingleInstanceActivity2 Life: onCreate
D/SingleInstanceActivity2 Life: RunningTaskInfo id=57 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity2}
D/SingleInstanceActivity2 Life: RunningTaskInfo id=55 activities=2 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.StartActivity}
D/SingleInstanceActivity2 Life: RunningTaskInfo id=56 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity}
D/SingleInstanceActivity2 Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/SingleInstanceActivity2 Life: onStart
D/SingleInstanceActivity2 Life: onResume
D/StartActivity Life: onStop
5. 再次打开已存在的SingleTaskActivity(因为SingleTaskActivity和StartActivity在同一个栈,且SingleTaskActivity在栈底。
所以清除栈顶StartActivity,即执行了onDestroy。再执行SingleTaskActivity的onNetIntent)
D/StartActivity Life: onDestroy
D/SingleInstanceActivity2 Life: onPause
D/SingleTaskActivity Life: onRestart
D/SingleTaskActivity Life: onStart
D/SingleTaskActivity Life: onNewIntent
D/SingleTaskActivity Life: RunningTaskInfo id=55 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleTaskActivity}
D/SingleTaskActivity Life: RunningTaskInfo id=57 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity2}
D/SingleTaskActivity Life: RunningTaskInfo id=56 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity}
D/SingleTaskActivity Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/SingleTaskActivity Life: onResume
D/SingleInstanceActivity2 Life: onStop
6. 再次打开已存在的SingleInstanceActivity(因为已经是独立的栈,不会再创建栈,且只执行了onNetInent)
D/SingleTaskActivity Life: onPause
D/SingleInstanceActivity Life: onRestart
D/SingleInstanceActivity Life: onStart
D/SingleInstanceActivity Life: onNewIntent
D/SingleInstanceActivity Life: RunningTaskInfo id=56 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity}
D/SingleInstanceActivity Life: RunningTaskInfo id=55 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleTaskActivity}
D/SingleInstanceActivity Life: RunningTaskInfo id=57 activities=1 topActivity=ComponentInfo{com.example.outman.interviewtest/com.example.outman.interviewtest.launchmode.SingleInstanceActivity2}
D/SingleInstanceActivity Life: RunningTaskInfo id=2 activities=1 topActivity=ComponentInfo{com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity}
D/SingleInstanceActivity Life: onResume
D/SingleTaskActivity Life: onStop
总结:
- 默认所有新创建的Activity都在同一个栈中,每个SingleInstance的Activity会创建新的栈。
- 打开已存在的SingleTask或SingleInstance的Activity,不会创建新的栈,且不会执行onCreate,只会执行onNetIntent