Foreword
In daily development, it is often necessary to use Fragment. Fragment exists attached to Activity, so how to monitor the life cycle changes of Fragment in Activity?
Scheme
Since Fragment exists attached to Activity, can we register the life cycle callback of Fragment?
The answer is yes, we can realize the life cycle callback of Fragment by registering FragmentManager.FragmentLifecycleCallbacks
, which is located in android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks
, which is an abstract class.
Explore
Define the specific implementation of FragmentLifecycleCallbacks, rewrite each method, and print the log.
private FragmentManager.FragmentLifecycleCallbacks mFragmentLifecycleCallbacks = new FragmentManager.FragmentLifecycleCallbacks() { @Override public void onFragmentPreAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) { super.onFragmentPreAttached(fm, f, context); Log.i(TAG, "onFragmentPreAttached: " + f. getClass(). getSimpleName()); } @Override public void onFragmentActivityCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) { super.onFragmentActivityCreated(fm, f, savedInstanceState); Log.i(TAG, "onFragmentActivityCreated: " + f.getClass().getSimpleName()); } @Override public void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) { super.onFragmentAttached(fm, f, context); Log.i(TAG, "onFragmentAttached: " + f. getClass(). getSimpleName()); } @Override public void onFragmentPreCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) { super.onFragmentPreCreated(fm, f, savedInstanceState); Log.i(TAG, "onFragmentPreCreated: " + f. getClass(). getSimpleName()); } @Override public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) { super.onFragmentCreated(fm, f, savedInstanceState); Log.i(TAG, "onFragmentCreated: " + f.getClass().getSimpleName()); } @Override public void onFragmentViewCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull View v, @Nullable Bundle savedInstanceState) { super.onFragmentViewCreated(fm, f, v, savedInstanceState); Log.i(TAG, "onFragmentViewCreated: " + f.getClass().getSimpleName()); } @Override public void onFragmentStarted(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentStarted(fm, f); Log.i(TAG, "onFragmentStarted: " + f. getClass(). getSimpleName()); } @Override public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentResumed(fm, f); Log.i(TAG, "onFragmentResumed: " + f. getClass(). getSimpleName()); } @Override public void onFragmentPaused(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentPaused(fm, f); Log.i(TAG, "onFragmentPaused: " + f.getClass().getSimpleName()); } @Override public void onFragmentStopped(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentStopped(fm, f); Log.i(TAG, "onFragmentStopped: " + f. getClass(). getSimpleName()); } @Override public void onFragmentSaveInstanceState(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Bundle outState) { super.onFragmentSaveInstanceState(fm, f, outState); Log.i(TAG, "onFragmentSaveInstanceState: " + f.getClass().getSimpleName()); } @Override public void onFragmentViewDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentViewDestroyed(fm, f); Log.i(TAG, "onFragmentViewDestroyed: " + f.getClass().getSimpleName()); } @Override public void onFragmentDestroyed(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentDestroyed(fm, f); Log.i(TAG, "onFragmentDestroyed: " + f. getClass(). getSimpleName()); } @Override public void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) { super.onFragmentDetached(fm, f); Log.i(TAG, "onFragmentDetached: " + f.getClass().getSimpleName()); } };
Register listener when Activity is created
getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks,true);
Logout listener when Activity is destroyed
getSupportFragmentManager().unregisterFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks);
Actual combat
Here we enter the Activity and register the listener, we add two Fragments, and observe the output changes of the log.
DataReportActivity: onFragmentPreAttached: TitleFrag DataReportActivity: onFragmentAttached: TitleFrag DataReportActivity: onFragmentPreCreated: TitleFrag DataReportActivity: onFragmentCreated: TitleFrag DataReportActivity: onFragmentViewCreated: TitleFrag DataReportActivity: onFragmentActivityCreated: TitleFrag DataReportActivity: onFragmentPreAttached: DataReportFarg DataReportActivity: onFragmentAttached: DataReportFarg DataReportActivity: onFragmentPreCreated: DataReportFarg DataReportActivity: onFragmentCreated: DataReportFarg DataReportActivity: onFragmentViewCreated: DataReportFarg DataReportActivity: onFragmentActivityCreated: DataReportFarg DataReportActivity: onFragmentStarted: TitleFrag DataReportActivity: onFragmentStarted: DataReportFarg DataReportActivity: onFragmentResumed: TitleFrag DataReportActivity: onFragmentResumed: DataReportFarg
When we close the Activity, observe the output changes of the log
DataReportActivity: onFragmentPaused: TitleFrag DataReportActivity: onFragmentPaused: DataReportFarg DataReportActivity: onFragmentStopped: TitleFrag DataReportActivity: onFragmentStopped: DataReportFarg DataReportActivity: onFragmentDestroyed: TitleFrag DataReportActivity: onFragmentDetached: TitleFrag DataReportActivity: onFragmentViewDestroyed: DataReportFarg DataReportActivity: onFragmentDestroyed: DataReportFarg DataReportActivity: onFragmentDetached: DataReportFarg
By Carlos Lynn
Link: https://www.jianshu.com/p/fb3d95a54135
Source: Jianshu
Copyright belongs to the author. For commercial reprint, please contact the author for authorization, for non-commercial reprint, please indicate the source.