了解与Activity有关的FragmentManager和FragmentTransaction生命周期

时间:2014-02-20 20:27:51

标签: android android-layout android-fragments android-framework

我正在尝试更好地理解FragmentManager和FragmentTransactions以正确开发我的应用程序。具体是关于它们的生命周期,以及提交FragmentTransaction(add)的长期效果。我对此感到困惑的原因是我在帖子末尾列出了一个示例活动。

我故意创建一个名为fragMan的静态FragmentManager变量,并最初将其设置为null。然后在onCreate()中检查它是否为null,并且当看到null值时,fragMan变量被设置为getFragmentManager()返回值。在配置更改期间,Log.d显示fragma不为null,但在fragman中找不到先前添加的Fragment“CameraFragment”,并且fragman.isDestroyed()返回true。这对我来说意味着Activity.getFragmentManager()返回一个FragmentManager的新实例,并且fragMan中的旧FragmentManager实例已擦除其数据(?)

这就是混乱的来源。

1)如果在配置更改的活动中“CameraFragment”仍然关联,并且在中找到    FragmentManager的新实例?

2)当我按下手机上的后退按钮退出活动时,我重新启动了样本    使用“应用”菜单的活动。 CameraFragment不再可见了,而且    onCreate()检查发现fragMan仍然不是null。我以为按了后退按钮    调用默认的finish()命令,从内存中清除Activity并重新启动它    会产生与初始启动样本活动相同的结果吗?

感谢您提供的任何和所有帮助!

public class MainActivity extends Activity 
{

static FragmentManager fragMan = null;
FragmentTransaction fragTransaction;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);  
    if (fragMan != null)
    {

        Log.d("log", Boolean.toString(fragMan.isDestroyed()));
                    if(fragMan.findFragmentByTag("Camera Preview") == null)
                    {
                    Log.d("log", "Camera Preview not found.");
                    }
    }
    else
    {
        fragMan = getFragmentManager();
        fragTransaction = fragMan.beginTransaction();
        Fragment cameraFragment = new CameraFragment();
        ViewGroup root_view = (ViewGroup) findViewById(android.R.id.content);
        fragTransaction.add(root_view.getId(), cameraFragment, "Camera Preview");
        fragTransaction.commit();

    }

1 个答案:

答案 0 :(得分:3)

Java中的静态变量保留在Activity创建/销毁中 - 它们与类本身相关联,但不与类的特定实例相关联。

请参阅此处的官方文档: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

当用户返回主屏幕时,您的应用程序不会结束,它只会处于后台状态。如果您强制停止应用程序并重新启动它,那么静态FragmentManager将为null。

关于CameraFragment,除非你设置了setRetainInstance(true),否则它会在方向更改时被破坏。

====编辑

以下是有关正在发生的事情的详细信息......

  1. 您是第一次打开该应用程序
  2. 创建活动,例如实例A1,并创建相应的FragmentManager实例FM1
  3. 将FM1存储为静态变量
  4. 你回到家里
  5. 由于正常的Activity生命周期,活动A1和FM1被破坏,尽管FM1的引用仍由静态变量保持。此时,FM1丢失了它包含的所有片段,isDestroyed()将返回true。
  6. 再次启动应用
  7. 新的Activity实例A2与其新的FragmentManager实例FM2
  8. 一起创建