如何关闭活动并返回到Android中的上一个活动


144

我有一个主要活动,当我单击一个按钮时,开始一个新活动,我使用以下代码进行了操作:

Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);

上面的代码是从main活动运行的。

现在在主活动调用的新活动中,有一个后退按钮。当我单击此后退按钮时,我希望我的新活动关闭,并且必须回到原始的主要活动。

我尝试了调用,super.finish()并且只是finish() (来自新活动),但是这随后关闭了我的整个应用程序(包括我的主要活动)。

如何仅关闭当前关注的活动,然后返回到主要活动?

已编辑

我的手机的后退按钮也关闭了我的整个应用程序,这让我认为我已经错误地启动了第二项活动?


好的,我一直在寻找,

我创建了一个设置活动,该活动使用相同的清单代码和相同的代码来启动活动。

对于设置活动,当我按下后退按钮时,它将返回到主活动。

有了上面在主要问题中提到的活动,它就退出了我的整个应用程序。

因此,问题似乎不在于完成活动的代码,而是活动本身。


4
您甚至不需要后退按钮,只需让用户使用电话后退键即可,而您无需执行任何操作。
阮阮

“电话返回”按钮将关闭输入应用程序,而不仅仅是我的辅助活动。我不想结束主要活动。
Zapnologica

1
“后退”按钮不应该这样做-您可以显示更多代码吗?
peejaybee 2013年

响应您的编辑,从您发布的内容来看,辅助活动看起来不错。我认为TGMCians可能是正确的答案,您可以调查清单。
peejaybee 2013年

看到这个答案,我认为这会对您有所帮助
Muhammad Helmi'1

Answers:


201

我认为您在开始之前正在调用finish()method 。MainActivitySettingsActivity

您描述的方案将通过以下两种方式发生:

以太网

您已设置android:noHistory = "true"MainActivityAndroidManifest.xml导致MainActivityfinish自动上按返回键。

要么

在切换到“ SettingsActivity”之前,您已经调用finish()MainActivity,这会杀死它。当您按下后退按钮时,由于堆栈中没有预设要弹出的其他活动,因此它将返回主屏幕。


这可以解释为什么手机的“后退”按钮也关闭了主要活动。
peejaybee 2013年

调试时,我注意到在finish()之后继续执行,因此建议另外添加一个返回值。
直到2015年

这个答案中的第三个原因难道不是第一个原因的重复吗?

60

您可以通过仅在正在进行的活动中调用finish()来返回上一个活动。请注意,finish()调用之后的所有代码都将运行-您可以在调用finish()之后进行返回以解决此问题。

如果要将结果返回到活动一,则在开始活动二时需要:

startActivityForResults(myIntent, MY_REQUEST_CODE);

在被调用的活动中,您可以从onCreate()参数获取Intent或使用

getIntent();

设置返回结果到活动一然后在活动二做

setResult(Activity.RESULT_OK, MyIntentToReturn);

如果您无意返回,那就说

setResult(Activity.RESULT_OK);

如果活动的结果不好,则可以使用Activity.RESULT_CANCELED(默认情况下使用)。然后在活动一中

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

要完成一项活动,请使用与上述相同的带有finish()的方法,并设置好结果。


1
“请注意finish()调用之后的任何代码都将运行-您可以在调用finish()之后再返回以解决此问题。”我认为'fix'在这里是不好的选择。更像是您在避免执行以下几行(不固定)。
罗丹(Lo-Tan)


11

如果使用片段,则应使用

getActivity().onBackPressed();

如果您使用单一活动,您可以使用

finish();



4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

我相信您的第二项活动可能未与您的子项主要活动相关联。检查您的AndroidManifest.xml文件,查看<activity>您的子活动的条目是否包含android:parentActivityName属性。它看起来应该像这样:

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

只是不叫finish()上你MainActivity再这样就需要重写你onBackPressed()在你的SecondActivity,除非你是在功能做其他的事情。如果你觉得“需要”这个后退按钮,那么你可以简单地调用finish()SecondActivity,这将带你到你的MainActivity,只要你有没有叫finish()


我尝试过此路线,但我依次使用高分辨率PNG约有10个屏幕。问题在于,大约在屏幕7处,由于后堆栈中的所有活动,设备内存不足。我决定对每个活动都调用finish,并通过允许垃圾回收解决了此问题,但是由于后堆栈现在为空,因此现在需要手动编码后退行为。您是否遇到过这个问题,或者是否知道Android中有任何机制可以解决此问题?
罗丹(Lo-Tan)

您希望后退按钮做什么?返回到以前的状态Activity,或者总是返回到MainActivity?另外,如果您的内存不足,Bitmaps则应阅读Docs的本部分。它对我有帮助
codeMagic 2013年

@ Lo-Tan如果您想返回上一个活动,那么我认为您需要弄清楚图像的内存管理,而不要完成活动(也许使用我提供的链接)。否则,您将不得不重新创建活动的新实例并尝试找出要返回的实例
codeMagic 2013年

我希望后退按钮可以转到上一个屏幕。基本上,这是一系列教程屏幕,用户可以前进/后退。每个屏幕都是经过设计的,并使用大量的png-有时png占据了大部分屏幕(而不仅仅是小缩略图),因此每个屏幕都占用了大量内存。
罗丹(Lo-Tan)

@ Lo-Tan我认为您想覆盖onBackPressed()方法,然后手动创建要转到的活动。然后,您可以结束正在使用的那一个并启动上一个。
Zapnologica

1

我不知道这是否有用,但是我在同一个问题上苦苦挣扎,我发现了一个非常简单的方法,只有一个全局布尔变量和onResume()操作。就我而言,我的活动C如果单击特定按钮,则应触发活动B的finish()!

Activity_A-> Activity_B-> Activity_C

Activity_A(通常会打开Activity_B)

Activity_B(单击某些按钮可打开Activity_C):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

因此,每当我单击活动C上的按钮时,它将执行活动B的“ onResume()”功能,然后返回活动A。


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

尝试此操作,它既可以在工具栏的后退按钮上用作硬件后退按钮


这个为我工作。我也有一个MainActivitySettingsActivityandroid:parentActivityName=".MainActivity"第二之一。这段代码处理了工具栏中的Home / Back按钮,并完成了当前活动并返回到堆栈中的上一个活动。谢谢。
mortalis

1

Finish关闭了整个应用程序,这是我讨厌在Android开发中无法完成的事情,但是他们没有跟上他们的语法。

startActivity(intent)

为什么不

closeActivity(intent)吗?


1
这会回答问题吗?还是这只是一个可以尝试的建议?在这两种情况下,咆哮都是不必要的,因此很可能不受欢迎
Gilles Gouaillardet

1

我们遇到了非常相似的情况。

活动1(打开)->活动2(预览)->活动3(详细信息)

错误的“按回”响应

  • 在活动3上向后按设备也会关闭活动2。

我已经检查了上面发布的所有答案,但没有一个起作用。回顾了在活动2和活动3之间进行过渡的Java语法是否正确。

调用第三方应用程序时无需编写代码。通过活动。我们决定研究配置角度-最终使我们能够确定问题的根本原因。

范围:活动2(呼叫者)的配置。

根本原因

android:launchMode="singleInstance"

解决方案

android:launchMode="singleTask"

显然,在此“背压”问题上,singleInstance在一个实例中将调用的Activity与调用的Activity一起考虑,而singleTask将允许被调用的Activity具有其自身的身份,足以使预期的背压功能正常工作。


0
{ getApplicationContext.finish();   }

试试这个方法。


尽管此代码块可以回答问题,但最好是提供一些解释,以解释其原因。
戴维(David)

0

您可能正在调用finish(); 在单击按钮事件中,以便在单击按钮后立即关闭主要活动,并且当您从下一个活动回来时,由于主要活动已经关闭并且没有任何活动,因此退出应用程序。


0

在您的活动的onCreate方法上编写以下代码。

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

然后覆盖活动的onOptionsItem选定方法,如下所示

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

而且你很好。


0

您必须在MainActivity中使用它

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

该标志将启动多个任务,这些任务将保留您的MainActivity,当您调用完成时,它将杀死其他活动并使您返回MainActivity

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.