Android 在从后台还原应用程序时显示相同的片段

Android 在从后台还原应用程序时显示相同的片段,android,android-fragments,Android,Android Fragments,比如说,我有一个活动A,它有一个框架布局,一次可以容纳一个片段。假设当活动第一次启动时,它会将片段A加载到由ListView组成的FrameLayout中。当在片段A中选择一个项目时,它会启动片段B。单击片段B上的一个项目会将您带到片段C。我目前做这件事的方法是,简单地隐藏片段A,然后添加片段B,因为这样可以保留片段A的状态。我当然也将这个片段事务添加到backback中 所以现在片段A存在于backbackback上。假设现在我回到我的Android主屏幕并转到另一个应用程序。当我这么做时,A

比如说,我有一个
活动A
,它有一个框架布局,一次可以容纳一个片段。假设当活动第一次启动时,它会将
片段A
加载到由ListView组成的FrameLayout中。当在
片段A
中选择一个项目时,它会启动
片段B
。单击
片段B
上的一个项目会将您带到
片段C
。我目前做这件事的方法是,简单地隐藏
片段A
,然后添加
片段B
,因为这样可以保留
片段A的状态。我当然也将这个片段事务添加到backback中


所以现在
片段A
存在于backbackback上。假设现在我回到我的Android主屏幕并转到另一个应用程序。当我这么做时,Android系统决定销毁我的应用程序,因为系统需要更多内存。当我导航回我的应用程序时,我应该如何正确地恢复用户离开应用程序的相同片段。因此,如果用户在最小化应用程序时打开了
fragment C
,并且当他从最小化应用程序重新打开时
fragment A
加载。

您可以尝试覆盖
onSaveInstanceState()
onRestoreInstanceState()
方法(请参阅)

然后在创作的时候,

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
       if (savedInstanceState != null) {
        mCurrentFragment = savedInstanceState.getInt(LAST_FRAGMENT);
        }
       else { mCurrentFragment = mDefaultFragment }
       ...

       //then you need to load mCurrentFragment
这里,
mCurrentFragment
是所使用的最后一个片段的实例(名称或其他)。例如,您可以通过重写片段的
onPause()
方法来更新此值。因此,每个片段的
onPause()
必须将
mCurrentFragment
设置为一个新值,以标识片段本身

另一种方法是使用
SharedReference
。在每个片段的onPause()中,设置:

然后在您的活动onCreate中

static final String LAST_FRAGMENT = "userFragment";
static int mCurrentFragment;
static int mDefaultFragment = 0;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    mCurrentFragment = sp.getInt(LAST_FRAGMENT, mDefaultFragment);
    ...
    /* then you load desired fragment according to mCurrentFragment
    if (mCurrentFragment == 1), load fragment1 and so on */

我在这里使用了
int
s,但是您可以引用您的片段

我一定会尝试一下,然后再给你们回复。出于好奇,你们使用了这两种方法中的哪一种?savedInstanceState或SharedReference?前一个…因为我需要为我正在存储的相应代码片段存储一些参数。现在我们有了
PersistentBundle
。关于我如何在应用程序中有效使用它的任何线索。嘿…只是一个简单的建议…将数据保存在片段本身的
onSaveInstance
中,而不是将变量传递给主活动并将值保存在那里。
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
sp.edit().putInt(LAST_FRAGMENT, $int_identifying_your_fragment ).apply();
static final String LAST_FRAGMENT = "userFragment";
static int mCurrentFragment;
static int mDefaultFragment = 0;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    mCurrentFragment = sp.getInt(LAST_FRAGMENT, mDefaultFragment);
    ...
    /* then you load desired fragment according to mCurrentFragment
    if (mCurrentFragment == 1), load fragment1 and so on */