像Application.ActivityLifecycleCallbacks一样钩入Fragment的生命周期

42
在Android中,如果你有应用程序上下文,你可以注册一个Application.ActivityLifecycleCallbacks实例,每当Activity通过其生命周期回调之一时,该实例将被调用。
那么如何为Fragments完成同样的操作呢?我认为Fragments没有这样的接口,也没有任何明确的地方可以添加它。
也许可以通过自定义FragmentHostCallback来创建一个FragmentController,但是如何将其插入整个应用程序中呢?
使用案例是一个需要在每次Fragment调用其生命周期回调时得到通知的库,我不想创建一个BaseFragment。我只想从应用程序的onCreate中调用它(如果可能的话...)。
编辑:
我已经在Android开源项目中创建了一个问题

你有没有查看过 https://github.com/trello/navi? - ericn
3个回答

36
自从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版本之前的解决方案? - Sergey Shustikov
据我所知,没有这样的功能。您可以使用“BaseFragment”方法进行模拟,但与此相比非常有限。我见过其他人使用更神秘的方式,例如使用线程监听事件,但我没有测试过,也不建议使用。现在只需要更新支持库即可。 - Olinasc

4

活动(Activity)会调用Fragment管理器(FragmentManager)的回调函数(callbacks),之后Fragment管理器会将这些调用分发给Fragment。没有地方可以在FragmentManager中注册FragmentLifeCycleCallback。不过,在Fragment初始化后的任何时候,您都可以从Fragment的mState变量中获取Fragment的状态。您可以按如下方式仅在FragmentManager中跟踪返回堆栈(backstack):

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

希望这能帮到您。

0
您可以创建一个类,像这样,单例模式会更好。
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的生命周期方法,然后可以在任何地方初始化此类。希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接