尽管付出了很多努力,为什么我的活动重新启动

时间:2013-11-06 11:55:42

标签: android android-activity android-2.3-gingerbread

这不是一个问题,我怎么能避免我的活动重启和重新开始说配置改变等等。这是一个问题,为什么,尽管我付出了很多努力,我的活动仍然重新启动。可能的原因是什么?

这是我的情景。

我的应用程序是一个带有标签的文本编辑应用程序,所以我实现了一个自定义TabHost和一个自定义TabWidget。该应用程序具有MainActivity和单个片段MainFragment。

开以确保实例保留在我的MainFragment中,我有以下内容:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    setHasOptionsMenu(true);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

}

为了确保保留MainActivity实例,我有:

/**
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FrameLayout frame = new FrameLayout(this);
    frame.setId(android.R.id.content);
    setContentView(frame, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    actionBar = getSupportActionBar();
    if ((MyTextEditor.isSmallScreenSize(getResources()) || MyTextEditor.isNormalScreenSize(getResources())) 
            && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ) {
        actionBar.setDisplayShowTitleEnabled(false);
    }
    if (savedInstanceState != null) {
        editorFrag = (MyTedFragment) getSupportFragmentManager().getFragment(
                savedInstanceState, "editor");
    }
    if (editorFrag == null) {
        editorFrag = new MyTedFragment();
        getSupportFragmentManager().beginTransaction()
        .replace(android.R.id.content, editorFrag).commit();
    }
         ....
}
     @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    getSupportFragmentManager().putFragment(outState, "editor", editorFrag);
}

以下AndroidManifest.xml

<application
    android:name="com.myapp.MyApp"
    android:debuggable="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/MyAppTheme" >

    <!-- Ted main activity ... ie a text field :)
     android:uiOptions="splitActionBarWhenNarrow" 
     android:windowSoftInputMode="adjustResize"
     android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|fontScale|screenSize|smallestScreenSize">

  -->
    <activity
        android:name="com.myapp.texteditor.MainActivity"
         android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|fontScale|screenSize|smallestScreenSize"
        android:launchMode="singleTask" android:windowSoftInputMode="adjustResize">

   </activity>
    ....
   </application>

现在出现问题:

案例1:Android版本:2.3.6三星设备上的姜饼

如果我将我的活动推到后台并在不到3分钟的时间内重新启动我的应用程序,主活动实例就会恢复正常。 如果我选择在一段时间后重新启动我的应用程序,比如10分钟左右,应用程序会重新启动,这对我的应用程序来说很糟糕,因为如果用户有任何未保存的更改,则会丢失。

案例2: Android版本:4.3,在模拟器上运行

在重新启动应用程序之前,我选择等待多长时间,实例始终会恢复。看起来一切正常。

这可能是什么原因?这是否与活动生命周期或Gingerbread活动管理器周围的错误有关?

2 个答案:

答案 0 :(得分:1)

你的第一个案例是你无法避免的。真实设备无法永远保持您的活动(内存压力等)。如果你的应用程序在后台,那么它被认为对用户来说并不重要(因为他没有与之交互),并且如果需要,它是操作系统杀死的好目标。

答案 1 :(得分:0)

一个可能有用的选项是SharedPreference。

此数据将一直存在,直到app被卸载,但每个数据条目需要一个String键,如果片段是高度动态的,它是无用的,尽管通常可以使用数组等来解决。

请查看我对How to maintain fragment's state in the application的答案。