Hooking into fragment's lifecycle like Applica

2019-01-31 20:46发布

In Android, if you have the Application context you can register an Application.ActivityLifecycleCallbacks instance that will be called everytime an Activity goes through one of its lifecycle callbacks.

How can I accomplish the same for fragments? I think there is no such interface for Fragments nor any clear place where I would add that.

Maybe customizing a FragmentHostCallback creating a FragmentController but how can I plug that for the whole application?

The use case is a library that needs to be notified everytime a Fragment calls its lifecycle callbacks and I don't want to create a BaseFragment. I want to be called only from Application's onCreate and that's it (if possible...).

EDIT:

I've created an issue in Android Open Source Project about this.

3条回答
相关推荐>>
2楼-- · 2019-01-31 21:03

Since version 25.2.0 of Android support library, the class FragmentManager.FragmentLifecycleCallbacks is static and accessible to all.

We can now use an instance of that class and register it in the supportFragmentManager of the Activity.

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);
       }
}
查看更多
疯言疯语
3楼-- · 2019-01-31 21:03

you can create a class like this, Singleton would be preferred

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

You will have to override lifecycle methods of Fragments, then you can initialize this class anywhere as you may please. Hope this helps

查看更多
你好瞎i
4楼-- · 2019-01-31 21:05

Well the activity dispatches its callbacks for the FragmentManager. Later the fragment manager dispatch the calls to the Fragment. There is no place to register the FragmentLifeCycleCallback in the FragmentManager. However at anytime after the fragment is initialized u can get the Fragment state from mState variable in the Fragment. you can only track the backstack in the fragment manager as below :

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

hope this will help.

查看更多
登录 后发表回答