fragment生命周期
onAttach()始终在任何Lifecycle 状态更改之前调用,所以onAttach()在onCreate()之前调用。
onAttach()
:
Fragment
被附加到Activity
时调用。在这个阶段,Fragment
可以获取Activity
的上下文。
onCreate()
:
- 在
Fragment
创建时调用。通常用于初始化一些非 UI 相关的逻辑,比如创建 ViewModel 或准备数据。 - 初始化与Fragment视图无关的变量
onCreateView()
:
- 为
Fragment
创建并返回其关联的视图。在此阶段,可以通过LayoutInflater
创建和配置Fragment
的 UI。
onViewCreated()
:
- 当
Fragment
的视图被创建后调用。在这个方法中,你可以执行与视图相关的逻辑,比如设置监听器、初始化数据等。 - 初始化视图内各个控件
onStart()
:
- 当
Fragment
对用户可见时调用。此时,Fragment
的 UI 还在后台,未完全显示。
onResume()
:
- 当
Fragment
完全对用户可见并可以交互时调用。这是Fragment
活跃状态的开始。
可以对Lifecycle进行监听 然后做一些操作
@Override
public void onAttach(@NonNull @NotNull Context context) {
super.onAttach(context);
//requireActivity() 返回的是宿主activity
requireActivity().getLifecycle().addObserver(new LifecycleEventObserver() {
@Override
public void onStateChanged(@NonNull @NotNull LifecycleOwner source, @NonNull @NotNull Lifecycle.Event event){
if (event.getTargetState() == Lifecycle.State.CREATED){
//在这里任你飞翔
requireActivity().getLifecycle().removeObserver(this); //这里是删除观察者
}
}
});
}
使用FragmentTransaction-生命周期与页面跳转
1.当你使用 FragmentTransaction
在同一个 Activity
中切换 Fragment
时,生命周期的表现取决于你是使用 replace
还是 add
/ hide
/ show
。
replace()
示例:
- 当你使用
replace()
切换Fragment
时,旧的Fragment
会完全被销毁,新Fragment
会按照全新的生命周期开始。
例如:从 FragmentA
切换到 FragmentB
:
FragmentA
:onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
FragmentB
:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
add()
/ hide()
/ show()
示例:
- 如果你使用
add()
、hide()
和show()
进行Fragment
切换,Fragment
并不会被销毁,而是只是进入不可见状态。
例如:从 FragmentA
切换到 FragmentB
:
FragmentA
:onPause() -> onStop()
(不会销毁视图)FragmentB
:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
- 如果你再切换回
FragmentA
,它会调用:onStart() -> onResume()
2.Fragment 跳转到另一个 Activity:
当你从一个 Fragment
进行页面跳转,启动新的 Activity
时,当前 Fragment
会进入暂停和停止阶段,但通常不会被销毁。
例如,从 FragmentA
启动 ActivityB
:
FragmentA
:onPause() -> onStop()
(仍然保留视图,等待用户返回)
当用户从 ActivityB
返回时:
FragmentA
:onStart() -> onResume()
按下返回键回到之前的 Fragment:
如果你在 FragmentTransaction
中将操作加入回退栈(addToBackStack()
),当你按下返回键时,前一个 Fragment
会被重新显示,而当前 Fragment
则被销毁或隐藏,具体取决于之前的切换方式。
例如:从 FragmentB
返回到 FragmentA
:
FragmentB
:onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
FragmentA
:onStart() -> onResume()
使用Jetpack 的 Navigation
组件-生命周期与页面跳转
Navigation
通过导航图 (NavGraph
) 和 NavController
来管理 Fragment
的跳转和状态。
1.从一个 Fragment 导航到另一个 Fragment
假设从 FragmentA
导航到 FragmentB
。
FragmentA
-> FragmentB
的生命周期:
-
FragmentA
的生命周期变化:onPause()
: 当FragmentA
开始从前台离开(但仍然可见),会调用此方法。onStop()
: 当FragmentB
成功展示后,FragmentA
将进入后台,此时FragmentA
不再可见。
使用
Navigation
组件时,FragmentA
通常不会被销毁(即onDestroyView()
和onDestroy()
不会立即被调用),而是保留在内存中。如果返回到FragmentA
,它会直接从onStart()
和onResume()
恢复。 -
FragmentB
的生命周期变化:onAttach()
:FragmentB
被添加到Activity
上时调用。onCreate()
: 在FragmentB
初始化时调用。onCreateView()
: 为FragmentB
创建视图。onViewCreated()
: 当视图创建完成后,执行与 UI 相关的逻辑。onStart()
:FragmentB
开始进入前台并对用户可见。onResume()
:FragmentB
完全对用户可见并开始交互。
2.当从 FragmentB
返回到 FragmentA
(假设 FragmentA
已加入回退栈)时:
FragmentB
的生命周期变化:onPause()
: 当FragmentB
开始离开前台时调用。onStop()
: 当FragmentA
成功展示后,FragmentB
进入后台。onDestroyView()
: 当FragmentB
的视图被销毁时调用。FragmentB
通常会调用onDestroyView()
,但在某些情况下它的实例可能保留在内存中,直到系统需要回收内存。onDestroy()
和onDetach()
: 当FragmentB
完全从Activity
中移除时调用。
FragmentA
的生命周期变化:onStart()
: 当返回到FragmentA
后,它的视图开始可见。onResume()
: 当FragmentA
完全恢复到前台并开始交互。- 如果
Fragment
被回收(如系统内存紧张),当再次导航回该Fragment
时,Fragment
会重新创建,调用onCreate()
和onCreateView()
等方法。
自动管理回退栈:Jetpack Navigation 自动处理导航和回退,不需要手动调用 addToBackStack()
和 popBackStack()
。