【问题标题】:SingleInstance activity make me confuseSingleInstance 活动让我感到困惑
【发布时间】:2011-12-06 02:19:36
【问题描述】:

一个活动是一个单实例活动。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class A extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle("A");
        startActivity(new Intent(this, B.class));
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        testLog("new Intent A");
    }

    private void testLog(String string) {
        Log.d("test", string);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        testLog("destroy A");
    }
}

B 活动是标准活动。

在正常情况下 A->B。用户动作后退操作,B销毁。用户再次按下,A 破坏。没错。

但在另一种情况下:A->B。用户操作主页按钮。当用户重启任务时,android框架调用A的onNewIntent()

为什么?我的意思是活动堆栈应该是这样的:

-B
-A

为什么android框架将intent路由到A?

【问题讨论】:

  • 您介意发布您的清单吗?我认为您将其作为启动器的默认设置。
  • 更好的是,只需回答:“A”是清单中的默认/启动器活动吗?
  • android manifest 很简单。像这样:
  • 不,A 不是默认启动器。
  • 请稍候,我正在写答案,因为我相信我完全了解您的想法以及为什么您无法理解下面已经写好的答案。

标签: android


【解决方案1】:

singleTopsingleTasksingleInstance 之间存在差异。阅读the documentation 了解更多信息,但您确实需要注意singleInstance 的描述。

只允许此活动的一个实例一直在运行。 这个活动得到一个独特的任务,只有它自己在里面运行;如果它再次使用相同的 Intent 启动,则该任务将被提前并调用其 Activity.onNewIntent() 方法。 如果此 Activity 尝试启动一个新 Activity,则该新 Activity 将在单独的任务。有关任务的更多详细信息,请参阅任务和返回堆栈文档。

这正是您所看到的行为,应该是预期的。

【讨论】:

  • 好吧,好吧。但我还有一个问题。在家庭案例中,B 是前台(任务)。为什么 android 路由到 A(哪个是后台任务)?
  • 正如大卫所提到的,我认为您可能应该多阅读一些内容来理解任务。报价中的建议可能是一个很好的建议。看看Tasks and Back Stack 文档。
【解决方案2】:

好的,既然您回答了该评论,我就可以更放心地回答您的问题了。

歌舞伎说的是对的。但是,您不了解它,因为您甚至不了解任务的概念,以及它与启动器的关系。

当您在启动器上启动 singleInstance 活动时(看到?这就是我询问您的清单的原因!),启动器不会启动/重新启动您启动/使用的任何活动活动 A(singleInstance 活动)。它正在启动/重新启动 A 的任务,因为它离开了。

事实上,正如文档所说(阅读 kabuko 的回答),当您从 A 启动 B 时,B 完全被视为一项新任务。恰好这两个活动在活动历史记录中“粘合”在一起......显然,因为您在开始 A 之后立即开始 B。但我再说一遍:重要的是要看到这构成了对您的应用程序。

你问,为什么这是一个合乎逻辑的中断?

因为 A 是 singleInstance 活动。正如这里已经说过的,这些是该任务中唯一且唯一的一项活动。因此,如果您从启动器再次启动该任务,您将再次到达 A,而不是 B,因为 B 是另一个不属于 A 的任务。

与您的预期相比:如果 A 是 standard,则 B 将在同一任务中启动并考虑。因此,重新启动 A 的 task 会以 B 结束,这正是您所期望的。

最后,正如文档所说,这就是为什么您通常不应该使用singleTask 甚至更少使用singleInstance 的原因。这些不是预期的行为。而且由于它们不适合您,因此它们对用户的影响会更小,其他一切都一样。

【讨论】:

  • 正如我所说:如果启动器默认 A,则启动器会调用A,而最近的人会调用顶部的活动(甚至B),考虑到你没有'还没有完成 B(在这种情况下,将是 A)。如果 A 不是 默认/启动器,那么启动器将调用 B(不是 A 的任务,这与清单中启动器的任务不同),如果那是你离开的地方,最近的人会调用 A。这完全是关于任务和清单,以及最近和启动器之间的区别。
  • 我已经发布了一些附加问题,希望你能告诉我更多细节。:)
【解决方案3】:
android:taskAffinity="" android:launchMode="singleInstance"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多