监听 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();
}
}
各个方法对应页面情况的说明:
-
页面情况:当一个 Fragment 即将被附加到 Activity 之前,这个方法被调用。比如在应用启动时,或者当用户进行导航导致新的 Fragment 要显示在界面上之前。此时 Fragment 的实例已经存在,但还没有与 Activity 建立正式的关联。可以在这里进行一些初始化数据的准备工作,或者设置一些初始状态变量,为后续的附加过程做好准备。onFragmentPreAttached
: -
onFragmentAttached
:页面情况:当 Fragment 成功附加到 Activity 时触发。此时 Fragment 已经成为 Activity 视图层次结构的一部分,可以开始与 Activity 进行交互,或者进行一些依赖于 Activity 上下文的操作。比如可以在这里获取 Activity 传递过来的参数,或者初始化一些与 Activity 相关的资源。 -
页面情况:当 Fragment 的视图被创建完成后调用。这意味着 Fragment 的布局文件已经被实例化,并且可以通过视图 ID 访问到各个视图组件。在这个阶段,可以进行视图相关的初始化工作,如绑定视图组件到数据、设置点击监听器、初始化适配器等。通常是在 Fragment 的生命周期中进行视图操作的最早时机之一。onFragmentViewCreated
: -
页面情况:当 Fragment 变得可见时触发。这可能发生在用户导航到包含该 Fragment 的界面,或者 Fragment 从不可见状态变为可见状态。可以在这里启动一些需要在 Fragment 可见时进行的操作,比如播放视频、开始动画、启动数据加载等。onFragmentStarted
: -
页面情况:当 Fragment 恢复时调用,通常是在用户从其他 Fragment 或 Activity 返回到这个 Fragment 时发生。在这个阶段,Fragment 处于活动状态并且可以接收用户输入。可以在这里重新启动一些在暂停时暂停的操作,如继续播放视频、恢复动画、恢复数据加载等。onFragmentResumed
: -
页面情况:当 Fragment 失去焦点或进入后台时触发。比如用户切换到另一个应用或者导航到另一个 Fragment。在这个阶段,可以暂停一些不需要在后台运行的操作,如暂停视频播放、停止动画、暂停数据加载等,以节省资源。onFragmentPaused
: -
页面情况:当 Fragment 不再可见时调用。这可能是因为用户导航到其他界面,或者 Fragment 被其他 Fragment 覆盖。可以在这里停止一些不需要在 Fragment 不可见时继续执行的操作,如停止动画、暂停数据加载等。onFragmentStopped
: -
页面情况:当 Fragment 即将被销毁时触发。这可能发生在 Activity 被销毁、配置更改(如屏幕旋转)导致 Fragment 重建,或者 Fragment 被从 FragmentManager 中移除。可以在这里执行清理工作,如释放资源、取消未完成的任务、移除监听器等。onFragmentDestroyed
: