监听 Fragment 的生命周期变化之MyFragmentLifecycleCallbacks 继承自 FragmentManager.FragmentLifecycleCallbacks

监听 Fragment 的生命周期变化之MyFragmentLifecycleCallbacks 继承自 FragmentManager.FragmentLifecycleCallbacks


/**
 * <p>
 * Title: 来监听 Fragment 的生命周期变化
 * </p>
 * <p>
 * Description: [来监听 Fragment 的生命周期变化]
 * </p>
 *
 * 详细注释说明:
 * onFragmentPreAttached: 这个方法在 Fragment 实例附加到 Activity 之前被调用。通常用于初始化一些数据或资源,准备状态等。
 * onFragmentAttached: 这个方法在 Fragment 实例附加到 Activity 之后被调用,可以在这里执行一些特定的逻辑,比如开始加载数据。
 * onFragmentViewCreated: 这个方法在 Fragment 的视图被创建后调用,通常用于处理视图相关的任务,例如绑定视图组件,初始化适配器等。
 * onFragmentStarted: 这个方法在 Fragment 可见时被调用,适合用于启动某些需要在 Fragment 可见时进行的操作,如播放视频、开始动画等。
 * onFragmentStopped: 这个方法在 Fragment 不再可见时调用,适合停止一些不需要在 Fragment 不可见时继续执行的操作。
 * onFragmentDestroyed: 这个方法在 Fragment 被销毁时调用,适用于释放资源、取消未完成的任务等清理工作。
 *
 * @author xxx
 * MyFragmentLifecycleCallbacks 继承自 FragmentManager.FragmentLifecycleCallbacks
 * 这个类用来监听 Fragment 的生命周期变化
 */
public class MyFragmentLifecycleCallbacks extends FragmentManager.FragmentLifecycleCallbacks {
    // 使用 volatile 确保多线程下的安全性
    private static volatile MyFragmentLifecycleCallbacks instance;

    // 使用线程安全的列表保存 Fragment
    private List<Fragment> fragments;

    // 私有构造函数
    private MyFragmentLifecycleCallbacks() {
        fragments = new CopyOnWriteArrayList<>();
    }

    // 双重检查锁定的单例获取方法
    public static MyFragmentLifecycleCallbacks getInstance() {
        MyFragmentLifecycleCallbacks localInstance = instance;
        if (localInstance == null) {
            synchronized (MyFragmentLifecycleCallbacks.class) {
                localInstance = instance;
                if (localInstance == null) {
                    instance = new MyFragmentLifecycleCallbacks();
                }
            }
        }
        return instance;
    }
    /**
     * 当 Fragment 被创建时调用
     * @param fm FragmentManager 实例
     * @param f 被创建的 Fragment 实例
     */
    @Override
    public void onFragmentPreAttached(FragmentManager fm, Fragment f, @NonNull Context context) {
        super.onFragmentPreAttached(fm, f, context);
        // 在 Fragment 实例附加到 Activity 之前执行的操作
        // 这里可以做一些初始化工作,例如准备数据
        System.out.println("Fragment is about to be attached: " + f);
    }

    /**
     * 当 Fragment 附加到 Activity 时调用
     * @param fm FragmentManager 实例
     * @param f 被附加的 Fragment 实例
     */
    @Override
    public void onFragmentAttached(FragmentManager fm, Fragment f,@NonNull Context context) {
        super.onFragmentAttached(fm, f, context);
        // Fragment 已经附加到 Activity,可以在这里执行一些工作
        System.out.println("Fragment attached: " + f);
    }

    /**
     * 当 Fragment 的视图被创建时调用
     * @param fm FragmentManager 实例
     * @param f 被创建视图的 Fragment 实例
     * @param view Fragment 的视图
     */
    @Override
    public void onFragmentViewCreated(FragmentManager fm, Fragment f, View view, Bundle savedInstanceState) {
        super.onFragmentViewCreated(fm, f, view, savedInstanceState);
        // Fragment 的视图已经创建,这里可以执行与视图相关的操作
        System.out.println("Fragment view created: " + f);
    }

    /**
     * 当 Fragment 被显示时调用
     * @param fm FragmentManager 实例
     * @param f 被显示的 Fragment 实例
     */
    @Override
    public void onFragmentStarted(FragmentManager fm, Fragment f) {
        super.onFragmentStarted(fm, f);
        // Fragment 已经开始可见,可以在这里启动某些操作,例如动画
        System.out.println("Fragment started: " + f);
    }
    @Override
    public void onFragmentResumed(FragmentManager fm, Fragment f) {
        super.onFragmentResumed(fm, f);
        System.out.println("Fragment resumed: " + f.getClass().getSimpleName());
    }

    @Override
    public void onFragmentPaused(FragmentManager fm, Fragment f) {
        super.onFragmentPaused(fm, f);
        System.out.println("Fragment paused: " + f.getClass().getSimpleName());
    }

    /**
     * 当 Fragment 变得不可见时调用
     * @param fm FragmentManager 实例
     * @param f 不再可见的 Fragment 实例
     */
    @Override
    public void onFragmentStopped(FragmentManager fm, Fragment f) {
        super.onFragmentStopped(fm, f);
        // Fragment 已经停止显示,可以在这里停止某些操作,例如动画
        System.out.println("Fragment stopped: " + f);
    }

    /**
     * 当 Fragment 被销毁时调用
     * @param fm FragmentManager 实例
     * @param f 被销毁的 Fragment 实例
     */
    @Override
    public void onFragmentDestroyed(FragmentManager fm, Fragment f) {
        super.onFragmentDestroyed(fm, f);
        // Fragment 即将被销毁,可以在这里执行清理工作
        System.out.println("Fragment destroyed: " + f);
    }

    // 添加 Fragment 方法
    private void addFragment(Fragment fragment) {
        if (fragment != null) {
            fragments.add(fragment);
        }
    }

    // 移除 Fragment 方法
    private void removeFragment(Fragment fragment) {
        if (fragment != null) {
            fragments.remove(fragment);
        }
    }

    // 获取当前 Fragment 列表
    public List<Fragment> getFragments() {
        return fragments;
    }

    // 获取当前 Fragment 数量
    public int getFragmentCount() {
        return fragments.size();
    }
}

各个方法对应页面情况的说明:

  1. onFragmentPreAttached

    页面情况:当一个 Fragment 即将被附加到 Activity 之前,这个方法被调用。比如在应用启动时,或者当用户进行导航导致新的 Fragment 要显示在界面上之前。此时 Fragment 的实例已经存在,但还没有与 Activity 建立正式的关联。可以在这里进行一些初始化数据的准备工作,或者设置一些初始状态变量,为后续的附加过程做好准备。
  2. onFragmentAttached:页面情况:当 Fragment 成功附加到 Activity 时触发。此时 Fragment 已经成为 Activity 视图层次结构的一部分,可以开始与 Activity 进行交互,或者进行一些依赖于 Activity 上下文的操作。比如可以在这里获取 Activity 传递过来的参数,或者初始化一些与 Activity 相关的资源。

  3. onFragmentViewCreated

    页面情况:当 Fragment 的视图被创建完成后调用。这意味着 Fragment 的布局文件已经被实例化,并且可以通过视图 ID 访问到各个视图组件。在这个阶段,可以进行视图相关的初始化工作,如绑定视图组件到数据、设置点击监听器、初始化适配器等。通常是在 Fragment 的生命周期中进行视图操作的最早时机之一。
  4. onFragmentStarted

    页面情况:当 Fragment 变得可见时触发。这可能发生在用户导航到包含该 Fragment 的界面,或者 Fragment 从不可见状态变为可见状态。可以在这里启动一些需要在 Fragment 可见时进行的操作,比如播放视频、开始动画、启动数据加载等。
  5. onFragmentResumed

    页面情况:当 Fragment 恢复时调用,通常是在用户从其他 Fragment 或 Activity 返回到这个 Fragment 时发生。在这个阶段,Fragment 处于活动状态并且可以接收用户输入。可以在这里重新启动一些在暂停时暂停的操作,如继续播放视频、恢复动画、恢复数据加载等。
  6. onFragmentPaused

    页面情况:当 Fragment 失去焦点或进入后台时触发。比如用户切换到另一个应用或者导航到另一个 Fragment。在这个阶段,可以暂停一些不需要在后台运行的操作,如暂停视频播放、停止动画、暂停数据加载等,以节省资源。
  7. onFragmentStopped

    页面情况:当 Fragment 不再可见时调用。这可能是因为用户导航到其他界面,或者 Fragment 被其他 Fragment 覆盖。可以在这里停止一些不需要在 Fragment 不可见时继续执行的操作,如停止动画、暂停数据加载等。
  8. onFragmentDestroyed

    页面情况:当 Fragment 即将被销毁时触发。这可能发生在 Activity 被销毁、配置更改(如屏幕旋转)导致 Fragment 重建,或者 Fragment 被从 FragmentManager 中移除。可以在这里执行清理工作,如释放资源、取消未完成的任务、移除监听器等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值