android递归查找父级,在Android中完成父级和当前活动

在Android应用中,从活动B开始活动C并希望按回退键关闭整个应用。问题在于使用`finish()`和`getParent().finish()`导致NullPointerException。解决方案包括使用`FLAG_ACTIVITY_CLEAR_TASK`和`FLAG_ACTIVITY_NEW_TASK`启动C,或者通过在B和A中处理结果代码来协调活动关闭。
摘要由CSDN通过智能技术生成

在Android中完成父级和当前活动

我有3个活动。 活动A导致活动B,活动B又可以返回活动A或开始活动C。但是,如果我在活动C中按回,则该应用程序应关闭。

总结一下:

活动A开始活动B

按下活动B会返回A

活动B开始活动C

在活动C上按Back键应关闭该应用

我应该如何从活动B转到活动C? 当前,此代码在最后一行为我提供了NullPointerException:

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

startActivity(intent);

ActivityB.this.finish();

ActivityB.this.getParent().finish();

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

15个解决方案

55 votes

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

从活动A开始,使用finish()启动活动B以获取结果

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

finish()立即返回,因此

设置一个结果,该结果将通知A也要完成,

致电B中的finish()。

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

失败的话,您可以将活动C放入其自己的应用程序,然后在启动第二个应用程序后关闭第一个应用程序(使用A和B)。

附言 前进时请考虑Falmarri的评论!

祝好运。

codinguser answered 2020-02-04T12:52:31Z

34 votes

如果您想从子活动中完成父活动,

在父活动中,在触发子活动时,使用以下命令:

startActivityForResult(intent_name,any_integer_variable);

并以以下方式覆盖onActivityResult方法:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(resultCode==2){

finish();

}

}

现在,在子活动中,以以下方式覆盖onStop和onDestroy:

protected void onStop() {

setResult(2);

super.onStop();

}

@Override

protected void onDestroy() {

setResult(2);

super.onDestroy();

}

请注意,我已经在子活动中将值设置为2,并且正在父活动中对其进行检查。 如果该值与我设置的值相同,则父活动也将完成。然后,您可以使用递归方法进行进一步的活动。

Anuj Agarwal answered 2020-02-04T12:53:10Z

12 votes

您应该在父Activity中使用onActivityResult方法

假设活动A是活动B的父级。如果要在活动B中单击“后退”按钮以退出应用程序(也退出活动A)

在活动B中,在onActivityResult或onDestroy()中

你打电话

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

这会将结果代码传递给其父活动。

您的父级活动A,结果代码许可您将需要使用onActivityResult方法在您可以调用的方法内

if(resultCode == 0) //matches the result code passed from B

{

ActivityA.this.finish()

}

这个对我有用 :)

TS.xy answered 2020-02-04T12:53:56Z

4 votes

我什么都没做。 这就是我修改您的代码的方式。

您用于输入其他意图的代码:

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

}

LifesAway answered 2020-02-04T12:54:29Z

3 votes

这些都不适合我。 所以我找到了解决方案。 该帮助明确列出了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);

Yugank answered 2020-02-04T12:54:50Z

2 votes

尝试这个

Intent intent = new Intent(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGORY_HOME);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

Ketan Ahir answered 2020-02-04T12:55:10Z

2 votes

如果您处于活动A并开始了另一个活动,即活动B。活动A->活动B

现在要关闭这两个活动。

然后在活动B中使用以下代码。

B.this.finish();

并在活动A中使用以下代码:

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

finish();

活动B完成后,活动A也将完成。

有一个缺点,我不知道可能是您想要还是不想要。

缺点是,如果用户在活动B上并且他/他按下后退按钮以在活动A上移动。那么,在这种情况下,活动A也将完成。

Ali Shan answered 2020-02-04T12:55:57Z

1 votes

这很正常:

btn_back.setOnClickListener(new View.OnClickListener()

{

public void onClick(View v) {

Player.this.finish();

}

});

dhrupal answered 2020-02-04T12:56:17Z

1 votes

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

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(intent);

您的活动C将是根活动,然后按回车将完成应用程序。

Vipin Sahu answered 2020-02-04T12:56:37Z

1 votes

从屏幕(B)您要从无后屏幕开始屏幕(C)使用以下命令启动此屏幕(C):

screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP

| Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

startActivity(screenC);

finish();

返回屏幕将退出应用程序。

miroslavign answered 2020-02-04T12:57:02Z

1 votes

在活动A中,使用startActivityForResult(intent,19)启动活动B以获取结果

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

startActivity()立即返回,因此

设置一个结果,该结果将通知A也要完成,

在B中调用finish()。并在子活动中的finish()方法之前调用setResult()方法在父活动中,覆盖onActivtyResult(....)方法。当A从B接收到该结果时,A也会对其本身调用finish()。

enter code here

@Override

protected void onActivityResult(int arg0, int arg1, Intent arg2) {

//Added by Ashish to close parent activity

if(arg1==19){

finish();

}

super.onActivityResult(arg0, arg1, arg2);

}

Ashish Saini answered 2020-02-04T12:57:40Z

1 votes

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

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

希望能帮助到你 !!

Animesh Mangla answered 2020-02-04T12:58:09Z

0 votes

让每个活动都监听下一个活动的结果,并在发生此情况时自行完成。

您可以使用特殊的结果代码来指示您希望活动结束。

Cheryl Simon answered 2020-02-04T12:58:34Z

0 votes

您可以覆盖后退键行为:

活动A开始活动B

按下活动B会返回A

活动B开始活动C

在活动C上按Back键应关闭该应用

请注意,我不会从onBackPressed调用super。这也使您可以覆盖Android的浏览堆栈机制,我发现这是一个很大的优势,因为目前似乎还没有一种简单的方法可以从浏览堆栈中清除最旧的项目。

public class B extends Activity

{

...

@Override

public void onBackPressed()

{

// Start activity A

Intent aIntent = new Intent(this, A);

startActivity(bIntent);

}

...

}

public class C extends Activity

{

...

@Override

public void onBackPressed()

{

// Close

finish();

}

...

}

您也可以根据需要专门完成父级活动,但是使用此方法,您不必担心。

Peter Ajtai answered 2020-02-04T12:59:21Z

0 votes

以下代码应为您完成此操作。 几乎所有其他方法都将您的应用保留在最近的应用中。 可以在[https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()]中找到Javadoc。

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

if(am != null) {

List tasks = am.getAppTasks();

if (tasks != null) {

tasks.get(0).finishAndRemoveTask();

}

}

Hamzeen Hameem answered 2020-02-04T12:59:41Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值