Android Fragment交易在后台

int*_*thy 1 android android-fragments

我正在开发带有片段的应用程序。它具有一个JavaScript接口,该接口在Main Activity中调用,并且具有片段替换逻辑。当应用程序在前台时,一切正常,但是当应用程序在后台时,片段事务替换不起作用。当我返回到我的应用程序时,我仍然看到旧的片段,而看不到新的片段。

@JavascriptInterface
public void beginCall(String toast) {
    FragmentTransaction fTrans;
    taskFragment = TaskFragment.newInstance(toast,"");
    fTrans =    getSupportFragmentManager().beginTransaction();
    fTrans.replace(R.id.frgmCont, taskFragment);
    fTrans.commit();
}
Run Code Online (Sandbox Code Playgroud)

怎么了?为什么片段事务在后台不起作用?

int*_*thy 5

一段时间后,我找到了答案:在onStop之后无法执行片段事务,它将导致java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作。我没有得到该异常,因为JavascriptInterface是在单独的线程中执行的。当我强迫我的代码在主线程中运行时,出现了该错误。因此,我需要使用一些活动生命周期方法来实现不同的逻辑,或者切换到多个活动逻辑。希望我的回答对任何人有帮助。


lil*_*erg 5

某些用例或架构可能需要在应用程序处于后台时触发片段事务。

我们创建了以下扩展函数:

fun FragmentTransaction.commitWhenStarted(lifecycle: Lifecycle) {
   lifecycle.addObserver(object : LifecycleObserver {
      @OnLifecycleEvent(value = Lifecycle.Event.ON_START)
      fun onStart() {
        lifecycle.removeObserver(this)
        commit()
      }
   })
}
Run Code Online (Sandbox Code Playgroud)

就像任何其他版本的 commit、commitNow、commitAllowingStateLoss 一样使用它。如果活动状态至少已经启动,则将直接调用观察者并执行片段事务。如果事务在 childFragmentManager 上执行,则可以从 Activity 或 Fragment 获取生命周期

transaction.commitWhenStarted(lifecycle)
Run Code Online (Sandbox Code Playgroud)