Android中页面生命周期变化
一、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()
:绑定到宿主ActivityonCreate()
:初始化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只会销毁视图,保留实例状态