关于Activity,了解FragmentManager和FragmentTransaction的生命周期。

3
我正在尝试更好地理解FragmentManager和FragmentTransactions以正确开发我的应用程序。具体来说,涉及它们的生命周期,以及提交FragmentTransaction(add)的长期影响。我感到困惑的原因是我运行了一个示例Activity,该Activity在本文末尾列出。
我故意创建了一个静态的FragmentManager变量fragMan,并最初将其设置为null。然后,在onCreate()中检查了它是否为空值,当看到空值时,将fragMan变量设置为getFragmentManager()返回值。在配置更改期间,Log.d显示fragma不为空,但先前添加的碎片"CameraFragment"未在fragman中找到,而fragman.isDestroyed()返回true。这对我来说意味着Activity.getFragmentManager()返回FragmentManager的新实例,并且fragMan中的旧FragmentManager实例已被清除(?)
这就是混乱之处。
1) 在配置更改时,“CameraFragment”如何仍与Activity关联并在新的FragmentManager实例中找到?
2) 当我按下手机上的后退按钮退出Activity时,然后使用应用程序菜单重新启动示例Activity时,CameraFragment不再可见,并且onCreate()检查显示fragMan仍未空。我认为按下后退按钮会调用默认的finish()命令,从内存中清除Activity,重新启动它将产生与示例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个回答

2
Java中的静态变量会在Activity创建和销毁时保留 - 它们与类本身相关联,而不是类的特定实例。
请参阅官方文档: http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html 当用户返回主屏幕时,您的应用程序并不会结束,而是进入后台状态。如果强制停止应用程序并重新启动,则静态FragmentManager将为空。
关于CameraFragment,除非您设置了setRetainInstance(true),否则它将在方向更改时被销毁。
==== 编辑
以下是更详细的流程...
  1. 您第一次打开应用程序
  2. 创建Activity,例如A1,并创建相应的FragmentManager实例FM1
  3. 将FM1存储为静态变量
  4. 返回主屏幕
  5. 由于正常的Activity生命周期,Activity A1和FM1被销毁,尽管FM1的引用仍由静态变量持有。此时,FM1失去了它所包含的所有片段,isDestroyed()将返回true。
  6. 再次启动应用程序
  7. 创建新的Activity实例A2以及它的新FragmentManager实例FM2

嗨Don,谢谢你的回复。我知道静态变量与应用程序进程的存在有关,而不是与Activity(类)实例本身相关。关于主屏幕,我确实了解如果用户按下主页按钮,Activity不会被销毁,但是当我按下返回按钮时,在日志中看到了“onStop()”命令。主要问题在于对静态fragmentManager(不是CameraFragment实例)如何不为null感到困惑,但却返回true以isDestroyed(),并且找不到之前的CameraFragment。 - blkhatpersian
FragmentManager 是一个静态变量,正如你所指出的,它与应用程序进程相关联 - 这就是为什么当你返回到 Activity 时它不为空的原因。 - don
你详细的流程解释帮了我很多!我一直在尝试动态地将一个Fragment附加到一个Activity上,现在知道了最佳实践。静态fragmentManager显然只会浪费内存。谢谢Don。 - blkhatpersian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接