【问题标题】:Fail to resume the activity stack during 1st launching after installation安装后第一次启动时无法恢复活动堆栈
【发布时间】:2013-08-09 14:46:13
【问题描述】:

我们的应用程序有一个启动活动(启动器的主要活动)和许多其他活动。在大多数情况下,当用户将应用程序切换到后台并从启动器中恢复时,旧的活动堆栈会恢复,并且该堆栈中的顶部活动会按预期显示。

但是,当 apk 刚刚安装在手机上,或者安装了同一应用程序的新 apk(更高版本)时,它的行为很奇怪。当应用程序切换到后台并从启动器恢复时,之前的活动堆栈不会恢复,并且始终显示启动活动。如果我们从最近的应用程序列表中恢复应用程序,则活动堆栈将按预期恢复。只有从最近的应用程序列表中杀死任务后,一切才恢复正常。之前的活动堆栈将始终正确恢复,直到再次被另一个 apk 安装替换。

我的 Android 版本是 4.1.2,我正在使用它的默认启动器。

以下是启动活动的配置。

<activity android:name=".welcome.activity.SplashActivity" android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

谁知道这种奇怪的行为?提前致谢!

【问题讨论】:

  • “无论何时安装相同应用程序的新 apk” - 等等,在新手机上,一切正常。一旦安装了新版本(>版本号),它就搞砸了?
  • 很抱歉我没有准确地说出来。我刚刚通过删除应用程序并再次安装 apk 进行了测试,奇怪的行为也会发生。再次,在最近的应用程序列表中杀死它后,一切都会好起来的。

标签: android


【解决方案1】:

最后我发现这是安卓系统的问题。已经在Activity history stack wrong upon first install on device?讨论过。

我采用了https://code.google.com/p/android/issues/detail?id=2373#c40 中所述的解决方法,并且效果很好,即在 SplashActivity.onCreate() 中添加以下代码:

    if (!isTaskRoot()) {
        Intent intent = getIntent();
        String action = intent.getAction();
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
            finish();
            return;
        }
    }

【讨论】:

    【解决方案2】:

    如果不了解您的应用程序,我真的无法判断发生了什么。我会调查:

    • launchMode 清单元素:android:launchMode
    • 检查您的活动没有被系统破坏和重新创建:Recreating an Activity
    • 如果您正在对片段执行任何操作并且这些片段是否正确维护状态

    对不起,有点猜测!

    【讨论】:

      【解决方案3】:

      由于您只想显示一次 Splash Activity,因此您可以在启动 Main Activity 后使用 finish(),这应该可以解决您的问题。

      【讨论】:

      • 在启动主要活动后,我已经在启动活动中调用了finish()。
      猜你喜欢
      • 2017-05-01
      • 1970-01-01
      • 2015-10-24
      • 2011-07-22
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多