在安卓系统中如何结束父活动和当前活动?

56

我有三个活动。活动A会导致活动B,然后可以返回到活动A或启动活动C。但是,如果在活动C中按返回键,则应用程序应该关闭。

总结一下:

  • 活动A启动活动B
  • 在活动B上按返回应该返回A
  • 活动B启动活动C
  • 在活动C上按返回应该关闭应用程序

我该如何从活动B转到C? 这段代码目前在最后一行上给了我一个NullPointerException:

Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();

如果我交换最后两行,我也会得到一个空指针。


14
我想指出的是,在应用程序不在第一页时,按返回按钮后应用程序关闭真的很烦人。我不确定你在做什么,但请注意不要让用户期望返回按钮会返回到前一个活动页面。 - Falmarri
16个回答

58

我不知道这是否可行,但您可以尝试:

  • 从Activity A使用startActivityForResult()启动Activity B以获取结果

  • 在Activity B中,当用户触发Activity C时,启动Activity C。

startActivity()会立即返回,因此

  • 设置一个结果,该结果将通知A也结束,

  • 在B中调用finish()

  • 当A从B接收到该结果时,它也会调用finish()自身。

如果失败,您可以将Activity C变成自己的应用程序,然后在启动第二个应用程序后关闭第一个应用程序(带有A&B)。

P.S. 在继续之前请考虑Falmarri的评论!
祝你好运。


38
如果你想要从一个子活动中结束父活动, 在触发子活动时,在父活动中使用以下命令:-
```java getParent().finish(); ```
请注意,这将结束整个父活动,而不仅仅是子活动。
startActivityForResult(intent_name,any_integer_variable);

并重写onActivityResult方法,方法如下:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode==2){
        finish();
    }
}

现在,在子Activity中,按照以下方式重写onStop和onDestroy:

protected void onStop() {
    setResult(2);
    super.onStop();
}
@Override
protected void onDestroy() {
    setResult(2);
    super.onDestroy();
}

请注意,我已经在子活动中将值设置为2,并在父活动中进行了检查。如果值与我设置的相同,则父活动也将结束。然后您可以使用递归方法进行其他活动。


2
我做了完全相同的事情,但无论我在子活动中使用setResult()设置什么值,父活动始终接收到0 - Kushal
2
我发现 onActivityResultonStoponDestroy 之前被调用,因此您需要先设置结果(setResult)。 - BluGeni
任意整数变量如何使用? - Amit Kumar

15

你应该在父活动中使用onActivityResult方法。

假设Activity A是Activity B的父级。 如果你想在Activity B中点击返回按钮来退出应用程序(也退出Activity A)

在你的Activity B中,在onStop()onDestroy()中,

你调用

setResult(0); //any int number is fine

这将把一个结果码传递给其父活动。

您的父Activity A监听该结果码,您需要使用onActivityResult方法。在该方法内部,您可以调用:

if(resultCode == 0) //matches the result code passed from B
{
    ActivityA.this.finish()
}

对我来说有效 :)


不错的解决方案。在子Activity中使用setResult和resultCode,然后在父Activity中接收resultCode。现在我可以处理当子Activity上的特定按钮被点击时,父Activity也将被销毁的情况。 - Touhid

5

对我来说,这些都没有起作用。所以我找到了一个解决方案。帮助文档清楚地列出了必须使用Intent.FLAG_ACTIVITY_CLEAR_TASK和Intent.FLAG_ACTIVITY_NEW_TASK。以下是适用于我的代码。

Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

4
我并没有做任何这样的事情。以下是我修改您的代码后的结果。
用于输入另一个意图的代码:
Intent whatEverIntentName = new Intent("Path.to.next.Intent");
startActivity(whatEverIntentName);
finish();

这样,您总是会在按返回键时退出。但等等! 当按下返回键时,您可以更改想要的反应方式。 做法如下:
@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
    startActivity(whatEverIntentName);
// Don't add finish here. 
//This is necessary because you finished your last activity with finish();
}

3

您可以使用finishAffinity(),它将关闭当前活动和当前活动的所有父活动。

注意:但是,从子活动到父活动的任何结果都不会被处理。

希望这有所帮助!


2

试试这个

  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);                

在使用相同的..方面有什么缺点吗?请让我知道。 - AndroidHacker

2

如果您正在Activity A上,并启动了另一个名为Activity B的活动。 Activity A --> Activity B

现在想要关闭这两个活动。

那么在Activity B中使用以下代码。

B.this.finish();

在Activity A中使用以下代码:

startActivity(new Intent(A.this, B.class));
finish();

当B活动结束时,A活动也会结束。

有一个缺点,我不知道你是否需要它。

缺点是,如果用户正在B活动中,并按下返回按钮回到A活动,则在这种情况下,A活动也会结束。


1

这个完美地运作了:

btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {

Player.this.finish();
    }
});

1
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

你的活动 C 将成为根活动,按返回键将结束应用程序。


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