重新启动活动后,如何还原活动的片段?

时间:2019-05-24 21:01:00

标签: java android android-fragments android-activity android-lifecycle

我正在测试以下情况:由于内存不足,系统终止了应用程序进程后,用户进入了我的应用程序。我看到了意外的行为,并希望得到一些帮助。

在我的应用中,我有一个活动,叫它ActivityA,它立即创建一个片段Fragment A,并进行片段替换。 FragmentA显示包含两个项目的ListView。如果用户单击第一项,则创建第二个片段Fragment B并替换FragmentA。否则,将创建另一个FragmentA并替换原始的FragmentA。我正在尝试创建文件目录树。 FragmentA用于目录,FragmentB用于文件。

可以说用户单击了文件。这是测试中用户切换到另一个应用程序的阶段,由于内存不足,系统终止了我的应用程序进程。然后,用户返回我的应用程序,期望一切都保持原样。但是,实际发生的是显示Fragment A(父目录)而不是Fragment B(文件)。当用户单击后退按钮时,将显示Fragment B(文件)。我做错了什么导致系统以这种方式还原Backstack?

这是一个示例程序,可以进一步显示我的应用程序在做什么:

// ActivityA.java
public class ActivityA extends AppCompatActivity implements onItemClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        FragmentA fragA = new FragmentA();
        FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction();
        fragmentTransation.replace(R.id.basic_frame, fragA);
        fragmentTransaction.commit();
    }

    @Override
    public void onItemClick(AdapterView<?> aView, View v, int position, long id)
    {
        if (position == 0)
        {
            FragmentB fragB = new FragmentB();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragB);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
        else
        {
            FragmentB fragA = new FragmentA();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragA);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

调用> ghc --version The Glorious Glasgow Haskell Compilation System, version 8.6.3 时,如果super.onCreate()不为空,则片段会自动恢复其当前状态。

因此,如果您希望通过添加初始片段来进行一次设置,则应该始终用savedInstanceState进行检查:

if (savedInstanceState == null)