fragment生命周期

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

  • FragmentAonPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
  • FragmentBonAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()

add() / hide() / show() 示例

  • 如果你使用 add()hide()show() 进行 Fragment 切换,Fragment 并不会被销毁,而是只是进入不可见状态。

例如:从 FragmentA 切换到 FragmentB

  • FragmentAonPause() -> onStop() (不会销毁视图)
  • FragmentBonAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
  • 如果你再切换回 FragmentA,它会调用:onStart() -> onResume()

2.Fragment 跳转到另一个 Activity

当你从一个 Fragment 进行页面跳转,启动新的 Activity 时,当前 Fragment 会进入暂停和停止阶段,但通常不会被销毁。

例如,从 FragmentA 启动 ActivityB

  • FragmentAonPause() -> onStop()(仍然保留视图,等待用户返回)

当用户从 ActivityB 返回时:

  • FragmentAonStart() -> onResume()

按下返回键回到之前的 Fragment:

如果你在 FragmentTransaction 中将操作加入回退栈(addToBackStack()),当你按下返回键时,前一个 Fragment 会被重新显示,而当前 Fragment 则被销毁或隐藏,具体取决于之前的切换方式。

例如:从 FragmentB 返回到 FragmentA

  • FragmentBonPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()
  • FragmentAonStart() -> 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()

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值