【问题标题】:Hooking into fragment's lifecycle like Application.ActivityLifecycleCallbacks挂钩到片段的生命周期,如 Application.ActivityLifecycleCallbacks
【发布时间】:2015-12-19 19:06:28
【问题描述】:

在 Android 中,如果您有 Application 上下文,则可以注册一个 Application.ActivityLifecycleCallbacks 实例,该实例将在每次 Activity 经历其生命周期回调之一时被调用。

我怎样才能为片段完成相同的操作?我认为 Fragments 没有这样的界面,也没有任何明确的地方可以添加它。

也许自定义一个 FragmentHostCallback 创建一个 FragmentController 但我怎样才能为整个应用程序插入它?

用例是一个库,每次 Fragment 调用其生命周期回调并且我不想创建 BaseFragment 时都需要通知它。我只想从应用程序的 onCreate 中被调用,仅此而已(如果可能的话......)。

编辑:

我已经为此创建了an issue in Android Open Source Project

【问题讨论】:

标签: android android-fragments fragment


【解决方案1】:

自 Android 支持库 25.2.0 版本以来,FragmentManager.FragmentLifecycleCallbacks 类是静态的并且可供所有人访问。

我们现在可以使用该类的实例并将其注册到ActivitysupportFragmentManager

public class ExampleActivity extends AppCompatActivity {

     public void onCreate(Bundle savedInstaceState) {

           // initialization code
          getSupportFragmentManager()
            .registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
                @Override
                public void onFragmentPreAttached(FragmentManager fm, Fragment f, Context context) {
                    super.onFragmentPreAttached(fm, f, context);
                }

                @Override
                public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) {
                    super.onFragmentAttached(fm, f, context);
                }

                @Override
                public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
                    super.onFragmentCreated(fm, f, savedInstanceState);
                }

                @Override
                public void onFragmentActivityCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
                    super.onFragmentActivityCreated(fm, f, savedInstanceState);
                }

                @Override
                public void onFragmentViewCreated(FragmentManager fm, Fragment f, View v, Bundle savedInstanceState) {
                    super.onFragmentViewCreated(fm, f, v, savedInstanceState);
                }

                @Override
                public void onFragmentStarted(FragmentManager fm, Fragment f) {
                    super.onFragmentStarted(fm, f);
                }

                @Override
                public void onFragmentResumed(FragmentManager fm, Fragment f) {
                    super.onFragmentResumed(fm, f);
                }

                @Override
                public void onFragmentPaused(FragmentManager fm, Fragment f) {
                    super.onFragmentPaused(fm, f);
                }

                @Override
                public void onFragmentStopped(FragmentManager fm, Fragment f) {
                    super.onFragmentStopped(fm, f);
                }

                @Override
                public void onFragmentSaveInstanceState(FragmentManager fm, Fragment f, Bundle outState) {
                    super.onFragmentSaveInstanceState(fm, f, outState);
                }

                @Override
                public void onFragmentViewDestroyed(FragmentManager fm, Fragment f) {
                    super.onFragmentViewDestroyed(fm, f);
                }

                @Override
                public void onFragmentDestroyed(FragmentManager fm, Fragment f) {
                    super.onFragmentDestroyed(fm, f);
                }

                @Override
                public void onFragmentDetached(FragmentManager fm, Fragment f) {
                    super.onFragmentDetached(fm, f);
                }
            }, true);
       }
}

【讨论】:

  • 25.2.0 之前的版本有什么解决方案吗?
  • 我不知道。您可以使用BaseFragment 方法对其进行模拟,与此相比,这种方法非常有限。我见过其他人有更多“神秘”的方式,比如让线程监听事件,但还没有测试过,也不推荐它。现在只需要更新支持库
【解决方案2】:

该活动为 FragmentManager 调度其回调。稍后,片段管理器将调用分派给片段。 FragmentManager中没有注册FragmentLifeCycleCallback的地方。但是,在片段初始化后的任何时候,您都可以从片段中的 mState 变量中获取片段状态。 您只能在片段管理器中跟踪 backstack,如下所示:

        final FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount());
        }
    });

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    你可以创建一个这样的类,单例是首选

    import android.app.Activity;
    import android.app.Application;
    import android.app.Fragment;
    import android.app.FragmentManager;
    import android.os.Build;
    import android.os.Bundle;
    
    @RequiresApi(api = Build.VERSION_CODES.O)
    public class PerfLifecycleCallbacks extends FragmentManager.FragmentLifecycleCallbacks
    implements Application.ActivityLifecycleCallbacks
    

    你必须重写 Fragments 的生命周期方法,然后你可以在任何地方初始化这个类。希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      相关资源
      最近更新 更多