在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