Activity生命周期几种特殊场景

1,156 阅读3分钟

以下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()方法

  1. 在默认启动的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