像 Application.ActivityLifecycleCallbacks 一样进入片段的生命周期
Hooking into fragment's lifecycle like Application.ActivityLifecycleCallbacks
在 Android 中,如果您有应用程序上下文,您可以注册一个 Application.ActivityLifecycleCallbacks
实例,每次 Activity 经历其生命周期回调之一时都会调用该实例。
我怎样才能对片段完成相同的操作?我认为 Fragments 没有这样的界面,也没有任何明确的地方可以添加它。
也许可以自定义一个 FragmentHostCallback
创建一个 FragmentController
但我如何才能将其插入整个应用程序?
用例是一个库,每次 Fragment 调用其生命周期回调时都需要通知它,我不想创建 BaseFragment。我只想从应用程序的 onCreate 调用,仅此而已(如果可能的话......)。
编辑:
我已经创建了 an issue in Android Open Source Project 关于这个。
好吧,activity 为 FragmentManager 调度它的回调。稍后片段管理器将调用分派给片段。 FragmentManager 中没有注册 FragmentLifeCycleCallback 的地方。但是,在片段初始化后的任何时候,您都可以从片段中的 mState 变量获取片段状态。
你只能在片段管理器中跟踪 backstack,如下所示:
final FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount());
}
});
希望这会有所帮助。
自 Android 支持库的 25.2.0 版本以来,class FragmentManager.FragmentLifecycleCallbacks
是静态的,所有人都可以访问。
我们现在可以使用 class 的实例并将其注册到 Activity
的 supportFragmentManager
中。
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);
}
}
可以这样创建class,单例优先
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
您将必须重写 Fragment 的生命周期方法,然后您可以根据需要在任何地方初始化此 class。希望这有帮助
在 Android 中,如果您有应用程序上下文,您可以注册一个 Application.ActivityLifecycleCallbacks
实例,每次 Activity 经历其生命周期回调之一时都会调用该实例。
我怎样才能对片段完成相同的操作?我认为 Fragments 没有这样的界面,也没有任何明确的地方可以添加它。
也许可以自定义一个 FragmentHostCallback
创建一个 FragmentController
但我如何才能将其插入整个应用程序?
用例是一个库,每次 Fragment 调用其生命周期回调时都需要通知它,我不想创建 BaseFragment。我只想从应用程序的 onCreate 调用,仅此而已(如果可能的话......)。
编辑:
我已经创建了 an issue in Android Open Source Project 关于这个。
好吧,activity 为 FragmentManager 调度它的回调。稍后片段管理器将调用分派给片段。 FragmentManager 中没有注册 FragmentLifeCycleCallback 的地方。但是,在片段初始化后的任何时候,您都可以从片段中的 mState 变量获取片段状态。 你只能在片段管理器中跟踪 backstack,如下所示:
final FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
Log.i("BACKSTACK","Count" +fragmentManager.getBackStackEntryCount());
}
});
希望这会有所帮助。
自 Android 支持库的 25.2.0 版本以来,class FragmentManager.FragmentLifecycleCallbacks
是静态的,所有人都可以访问。
我们现在可以使用 class 的实例并将其注册到 Activity
的 supportFragmentManager
中。
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);
}
}
可以这样创建class,单例优先
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
您将必须重写 Fragment 的生命周期方法,然后您可以根据需要在任何地方初始化此 class。希望这有帮助