如果按下后退按钮,android singleinstance Activity 不是单一的

标签 android android-activity single-instance launchmode

我遇到了一个有趣的问题,一个 Activity 被创建了多次,即使它在 list 中被定义为一个 singleTask 或一个 singelInstance Activity。这是如何重现的。比如说,在主要 Activity 中:

@Override
protected void onResume() {
    Intent i = new Intent(MainActivity.class, SingleActivity.class);
    startActivity(i);
}

在我的 SingleActivity 中,我有:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    Log.i("SingleActivity", "onCreate " + System.identityHashCode(this));
    ...
}

在 list 中,我有:

    <activity android:name=".SingleActivity"
              android:launchMode="singleInstance"
    />

现在,如果我启动应用程序,一切似乎都正常,预计在一种情况下:如果我在 SingleActivity 位于前面时按下“后退”按钮,它会导航回 MainActivity,其中 MainActivity.onResume() 将创建另一个 SingleActivity 实例,而不是提出已经存在的实例。这是我所知道的,因为在日志上显示了不同的身份哈希码。

如果启动模式是 singleTask,情况似乎也是如此。

唯一的解决方法似乎是覆盖 onBackPressed(),但这似乎是一个丑陋的解决方案。

我想知道我做错了什么

最佳答案

这是taskAffinity的问题.因为你没有指定 taskAffinity在您的 MainActivity 上的 list 中或者你的 SingleActivity ,这两个 Activity 具有相同的(默认)taskAffinity .当您开始一项 Activity 时,Android 会检查 taskAffinity您要开始的 Activity 。如果与taskAffinity相同任务中的根 Activity ,那么它将忽略launchMode="singleInstance"launchMode="singleTask" (因为这些启动模式需要 Android 创建一个新任务来启动 Activity)并在当前任务中启动 Activity。

不幸的是,这没有很好的记录,但是 taskAffinity优先于 launchMode .

如果你真的想要一个singleTasksingleInstance Activity (这通常不是正确的做法,因为它会带来一大堆其他你可能会出错的讨厌的事情),那么你需要确保你的 singleInstancesingleTask Activity 在其 <activity> 的 list 中具有以下内容定义:

android:taskAffinity=""

如果您需要更多信息,请在 StackOverflow 或 Google 中搜索“launchmode taskaffinity”

关于如果按下后退按钮,android singleinstance Activity 不是单一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987110/

相关文章:

android - 加载启动画面后如何显示插页式广告?

java - 当应用程序从后台进入前台时,如何显示特定 Activity ?

java - 如何在我的 android Activity 中的类中使用抽象方法?

java - 在设置菜单中的 onClick 事件后打开“关于”对话框

python - PyQt - 如果它已经在运行,如何检测和关闭 UI?

android - Gradle:如何将现有的完整项目包含为子项目?

android - HTML 按钮适用于 Windows 浏览器,但不适用于 Android

android - (动态)多个微调器州/市

c++ - 不是全局单例设计模式?

c# WPF 维护加载程序的单个实例