对singleTop模式感到困惑

时间:2014-10-02 02:21:36

标签: android android-activity

我在android文档中读过singleTop模式是这样的:

  

如果活动的实例已存在于顶部   当前任务,系统通过a将意图路由到该实例   调用它的onNewIntent()方法,而不是创建一个新实例   活动。活动可以多次实例化   实例可以属于不同的任务,一个任务可以有多个任务   实例(但仅当后台堆栈顶部的活动是   不是活动的现有实例。)

但是,我的应用程序表现不同。我的主要活动是清单文件中定义的singleTop启动模式。这是奇怪的表现。

  1. 从启动器启动主要活动。
  2. 从主要活动,开始子活动。
  3. 当用户按下后退按钮(或操作栏主页按钮)时,它会向主要活动发送一些额外内容的意图。这意味着需要更新主要活动(取决于子活动中的用户操作。)
  4. 主要活动显示更新显示。
  5. - 奇怪的是这个 -

    1. 从主要活动开始,按下后退按钮再次返回主要活动。
    2. 第二次按下后退按钮会打开启动器屏幕,然后我的应用程序将被放入后台。
    3. 在第5步,它为什么再次提出主要活动?我认为singleTop会将主要活动带到前面,这是当前任务中堆栈的顶部。但是从#5和#6中的那种行为来看,它似乎正在创建两个主要活动实例。

      我的理解是不正确还是其他事情正在发生,我还不清楚。请帮助解释/澄清。感谢。

      我的子活动已覆盖onBackPressed方法。同样,onNewIntent()的主要活动处理额外内容。

      @Override
      public void onBackPressed() {
          Intent intent = new Intent(this, MainActivity.class);
          intent.putExtra(MainActivity.UPDATE_ARG, true);
          startActivity(intent);
          super.onBackPressed();
      }
      

      注意:如果我使用singleTask模式,它的行为与我对singleTop的预期相同。但是我已经在某处读到了singleTask和singleInstance要谨慎使用。

3 个答案:

答案 0 :(得分:2)

来自发布的文档:

  

一个任务可以有多个实例(但只有当活动在   后堆栈的顶部不是活动的现有实例。

从你的代码:

  

当用户按下后退按钮(或操作栏主页按钮)时,它会发送   意图主要活动与一些额外的。这意味着主要   活动需要更新(取决于sub中的用户操作)   活性。)

当用户按下按钮时,您的主要活动剂量不存在于当前任务的顶部,并且您的子活动位于顶部,因为它尚未销毁,因此它创建了另一个主要活动,并且不使用现有活动,因为它主要活动不是最重要的。 从文档中查看此内容,请注意backstack包含当前前台活动

enter image description here

答案 1 :(得分:0)

  

为什么它会再次提出主要活动?

好吧,因为当你这样做时,你又开始了你的活动:

startActivity(intent);

您的活动中的任何更新都应该在onStart方法中执行(或者如果适用,则在onResume上执行)。

答案 2 :(得分:0)

我终于理解了这一切(我想!)。我会解释一下。

android:launchMode属性适用于活动,无论是从家庭启动器,应用程序(或其他应用程序)启动的。

实现Intent.FLAG_ACTIVITY_CLEAR_TOP行为需要意图标记singleTop。因此,我在开始活动之前创建意图时传递了该标志。

对于主要活动,这就是我所做的:

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, MainActivity.class);
    // these flags are important!!
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra(MainActivity.UPDATE_ARG, true);
    startActivity(intent);
    super.onBackPressed();
}

相应地,我在清单文件中声明了android:launchMode="singleTop"