一、Activity切换的生命周期变化(A启动B)
1. 标准流程(B完全覆盖A)
完整生命周期路径:
-
Activity A:
-
onPause()
:失去焦点,仍部分可见 -
onStop()
:完全不可见(当B完全覆盖后)
-
-
Activity B:
-
onCreate()
:初始化基础组件 -
onStart()
:即将可见 -
onResume()
:获得焦点,完全交互状态
-
关键关联关系:
-
A必须先完成
onPause()
,B才能开始创建 -
B必须完成
onResume()
后,A才会执行onStop()
-
系统保证:A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop
2. 透明主题(B是半透明/对话框)
特殊变化:
-
A只执行到
onPause()
(因为仍部分可见) -
B正常执行完整生命周期:onCreate → onResume
-
当B关闭时:A立即执行
onResume()
(无需重建)
二、Fragment切换的生命周期变化(以replace为例)
1. 无回退栈(FragmentA → FragmentB)
完整生命周期路径:
-
FragmentA:
-
onPause()
→onStop()
:失去焦点和可见性 -
onDestroyView()
:视图被销毁 -
onDestroy()
→onDetach()
:完全销毁并解绑
-
-
FragmentB:
-
onAttach()
:绑定到宿主Activity -
onCreate()
:初始化 -
onCreateView()
→onViewCreated()
:创建视图 -
onStart()
→onResume()
:变为可见和可交互
-
2. 有回退栈(addToBackStack)
关键区别:
-
FragmentA只执行到
onDestroyView()
(实例保留在内存) -
当返回时:
三、Activity与Fragment生命周期的联动
1. Activity状态变化对Fragment的影响
具体规则:
-
Activity的
onPause()
触发 → 所有Fragment执行onPause()
-
Activity的
onStop()
触发 → 所有Fragment执行onStop()
-
Activity的
onDestroy()
触发 → 所有Fragment执行onDestroy()
→onDetach()
2. Fragment独立于Activity的生命周期
-
当Activity已运行:
无Activity生命周期变化
-
当Activity重建:
四、常见问题
Q: Activity A启动Activity B的生命周期变化顺序?
A:
-
A先执行
onPause()
(失去焦点但部分可见) -
B依次执行:
onCreate()
→onStart()
→onResume()
(完全可见) -
A执行
onStop()
(完全不可见) -
若B是透明主题:A不会执行
onStop()
Q: Fragment替换时的生命周期变化?
A:
无回退栈时:
-
旧Fragment:
onPause()
→onStop()
→onDestroyView()
→onDestroy()
→onDetach()
-
新Fragment:
onAttach()
→onCreate()
→onCreateView()
→onViewCreated()
→onStart()
→onResume()
有回退栈时:
-
旧Fragment:
onPause()
→onStop()
→onDestroyView()
(实例保留) -
新Fragment:完整初始化(同上)
-
返回时:新Fragment销毁 → 旧Fragment重建视图(
onCreateView()
→onResume()
)
Q: Activity生命周期如何影响Fragment?
答:
-
Activity的
onPause()
会触发所有Fragment的onPause()
-
Activity的
onStop()
会触发所有Fragment的onStop()
-
Activity的
onDestroy()
会触发所有Fragment的onDestroy()
和onDetach()
-
Fragment无法脱离Activity存在,其生命周期由宿主Activity同步触发
关键原则:
-
前台Activity总是优先响应生命周期变化
-
Fragment的生命周期回调总是发生在宿主Activity的对应回调之间
-
透明Activity会阻止底层Activity执行
onStop()
-
有回退栈的Fragment只会销毁视图,保留实例状态