清除任务并启动新活动

6
我不知道为什么这很难理解。我有我的主要活动,当启动时,会检查是否第一次打开。如果是,那么它会关闭主活动并使用FLAG_ACTIVITY_NEW_TASK打开设置/介绍活动。设置过程由三个活动(A、B和C)组成。在C活动结束时,如何清除包含A、B和C的设置任务并重新开始主活动。我尝试将FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP添加到主活动Intent,但按BACK键时,返回到设置过程的C活动。我该如何在C完成后清除A、B和C活动的任务并启动主活动?谢谢! 我正在Android 1.6(API 4)中构建,因此某些Activity标记可能受限制。

当您正在进行主活动时,请完成活动C。 - Mudassir
这是你在 onBackPressed() 方法中要做的事情。启动上一个活动(请参阅步骤)。 - Mudassir
@Brian:对于这个问题点赞。顺便问一下,你是在尝试实现类似的最终用户许可协议吗? - Ghost
@Mudassir:我的转场效果很好,我的意思是当一个活动完成时,默认的动画是向右滑动(就像你回到原始活动一样)。我只是说它不会“看起来”像用户按了返回按钮,因为它实际上是启动一个活动,所以动画看起来像是一个新的活动进来了,而不是“返回”。我希望你明白我的意思。 - Brian
@Brian:抱歉让你等待了。请看下面的答案。 - Mudassir
显示剩余10条评论
4个回答

2

FLAG_ACTIVITY_CLEAR_TOP会清除与其相同的Activity实例。在您的情况下,所有的活动都是不同的实例,所以FLAG_ACTIVITY_CLEAR_TOP不起作用。要清除任务,请在每个活动中创建一个Activity实例,并在每个活动的onCreate方法中将该实例分配为“this”。每当您想要清除任务时,只需调用该实例.finish()并启动您想要的活动。


1
这个能一次完成所有三个活动吗? - Mudassir
不只是一次,你看你有Activity A、B、C。要想一次性完成所有这些工作,你只需要执行以下类似的操作activityA_instace.finish(); activityB_instace.finish(); activityC_instace.finish(); 同时确保在你声明的 Activity 中,实例是公共静态的。如果是这样,实际上你可以通过我刚才展示的方法从任何地方清除你的任务。 - Arun
“instance”在编程中是什么意思?您能用一些代码来解释一下吗? - Mudassir

1

实际上,这可以通过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();
   }
}

我认为这是正确的方式,这样你就不会泄漏任何信息。

附注:我知道这是旧帖子,但也许有人会觉得这很有用。


0

我在这里回答了一个类似的问题。

正如Mudassir在他们的评论中所说,只需在启动新活动后立即finish()您的活动即可。


不,我想让用户在设置过程中需要时能够返回上一步。我只想在最后一步完成时完成设置活动堆栈。 - Brian

0
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();


9
这是不可接受的。你正在泄露所有活动和所有相关资源(查看层次结构,图像)。 - Jonas Alves
类似这个答案的内容会更适合你。正如@JonasAlves所指出的,你正在使用静态变量泄漏所有这些活动。相反,想出一个消息,在设置完成时可以广播它,并使每个设置活动都监听该广播。当它们接收到设置完成通知时,它们可以自己完成,不需要任何静态变量来实现这一点。 - Lo-Tan
2
静态引用活动意味着您的视图仍然保留在内存中,而没有被回收,从而导致内存泄漏。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接