【问题标题】:Why is my activity restarted despite all my efforts尽管我付出了所有努力,为什么我的活动重新开始
【发布时间】:2013-11-06 23:30:07
【问题描述】:

这不是关于我如何避免我的活动重启和说配置更改谎言等重新创建的问题。这是一个关于为什么尽管我付出了所有努力,我的活动仍然重启的问题。可能的原因是什么?

这是我的场景。

我的应用是一个带有标签的文本编辑应用,所以我实现了一个自定义 TabHost 和一个自定义 TabWidget。该应用具有 MainActivity 和单个 Fragment 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 Gingerbread

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

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

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

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

【问题讨论】:

  • 对我来说听起来就像常见的 android 行为。最终你的应用程序会被销毁,具体时间由 android 决定。您只需要将您的数据保存在数据库中或在 onDestroy 中写入一个临时文件即可恢复上次已知状态。顺便说一句,用于处理方向等的 android:configChanges 设置确实是 hack imo,您应该执行其他操作,例如在 onSaveInstanceState 中保存变量并在 onCreate 中定位后恢复它。
  • 谢谢。这真的很有用。我将使用onDestroy() 的临时数据。但我的挑战是为用户将打开的所有选项卡执行此操作。但感谢指向正确方向的指针。
  • 不是 onDestroy(),onPause()。请阅读并了解 Android Activity 生命周期。

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


【解决方案1】:

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

【讨论】:

  • 谢谢。感谢您提供的信息。
【解决方案2】:

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

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

以我对How to maintain fragment's state in the application 的回答为例。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2020-01-11
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2012-03-13
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多