Android 清除任务并启动新活动

Android 清除任务并启动新活动,android,android-activity,android-intent,task,Android,Android Activity,Android Intent,Task,我不知道为什么这很难弄清楚。我有我的主要活动,当启动时,检查它是否是第一次被打开。如果是,则会关闭主活动,并打开设置/介绍活动,其中包含标志\u活动\u新任务。设置过程包括三个活动(A、B和C)。在活动C结束时,如何使其清除包含A、B和C的设置任务并再次启动主活动。我已尝试将标记活动\u新任务|标记活动\u清除\u顶部添加到主活动意图,但当我按BACK键时,它返回到设置过程的活动C。当C完成并启动主任务时,我如何使其清除活动A、B和C的任务?谢谢 我正在构建Android 1.6(API 4),

我不知道为什么这很难弄清楚。我有我的主要活动,当启动时,检查它是否是第一次被打开。如果是,则会关闭主活动,并打开设置/介绍活动,其中包含
标志\u活动\u新任务
。设置过程包括三个活动(A、B和C)。在活动C结束时,如何使其清除包含A、B和C的设置任务并再次启动主活动。我已尝试将
标记活动\u新任务|标记活动\u清除\u顶部
添加到主活动
意图
,但当我按BACK键时,它返回到设置过程的活动C。当C完成并启动主任务时,我如何使其清除活动A、B和C的任务?谢谢


我正在构建Android 1.6(API 4),因此一些
活动
标志可能会受到限制。

我回答了一个类似的问题


正如Mudassir在他们的评论中所说,在开始一个新的活动后,立即
finish()
您的活动。

FLAG\u ACTIVITY\u CLEAR\u TOP将清除同一活动实例中的活动。在您的案例中,所有活动都属于不同的实例,因此标记\u活动\u清除\u顶部将不起作用。要清除任务,请在每个活动中创建一个活动实例,并在每个活动的onCreate方法上指定该实例“this”。每当您想清除任务时,请调用该实例。finish()。然后开始你想要的活动

class A extends Activity { 
public static Activity instanceOfA = null;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instanceOfA = this;
}
}

class b extends Activity { 
public static Activity instanceOfB = null;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instanceOfB = this;
}
}


class c extends Activity { 
public static Activity instanceOfC = null;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    instanceOfC = this;
}
}
现在假设您想从当前活动中清除所有任务,然后调用 instanceOfA.finish(); instanceOfB.finish();
instanceOfC.finish()

实际上,这可以通过startActivityForResult实现

public class A extends Activity {
   public onButtonClick() {
      startActivityForResult(new Intent(this, B.class), 0);
   }
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (resultCode == RESULT_OK) {
         finish();
      }
   }
}

public class B extends Activity {
   public onButtonClick() {
      startActivityForResult(new Intent(this, C.class), 0);
   }
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if (resultCode == RESULT_OK) {
         setResult(RESULT_OK);
         finish();
      }
   }
}

public class C extends Activity {
   public onButtonClick() {
      setResult(RESULT_OK);
      finish();
   }
}
我认为这是正确的方法,你不能这样泄露任何东西


PS:我知道这是一篇老文章,但也许有人会发现这篇文章很有用。

当你继续进行主活动时,完成活动C。清除标志只会从堆栈中删除一个活动,不是吗?@Mudassir如果我刚完成活动C,那么当我从主活动中按回来时,它只是转到活动B。如果用户需要更改设置中的某些内容,我想让用户能够返回一个步骤。在最后一步单击“完成”后,完成整个设置过程;此时,它应该只销毁整个安装活动堆栈。这就是您将在
onBackPressed()
方法中执行的操作。启动上一个活动(阅读步骤)。否,我希望用户能够在安装过程中返回需要的步骤。我只想在最后一步完成时完成安装活动的堆栈。这能一次完成所有三个活动吗?这不是一次,看你有活动A、B、C。要一次完成所有这些,你只需要做一些类似于下面的活动A_instance.finish();活动b_instance.finish();activityC_instance.finish();还要确保您的实例是您声明的活动中的公共静态实例。如果是这样的话,你实际上可以从任何地方完成你的任务,就像我刚才所说的,你所说的实例到底是什么意思?你能用一些代码解释一下吗?这是不可接受的。您正在泄漏所有活动以及与之相关的所有资源(查看hiarrchies、图像)。类似的内容更适合您。正如@JonasAlves指出的,您正在通过使用静态泄漏所有这些活动。相反,当安装完成时,您可以发出一条消息进行广播,并让每个安装活动监听广播。当他们收到安装完成通知时,他们可以自己完成,并且不需要静态来完成。对活动的静态引用意味着您的视图保留在内存中,不会被回收,从而导致内存泄漏。