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

172

我有一个主活动,在点击按钮时会启动一个新活动,我使用了以下代码来实现:

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

上述代码是从主活动中运行的。

现在在我的新活动中,由主活动调用,我有一个返回按钮。 当我点击这个返回按钮时,我希望我的新活动关闭并回到原始的主活动。

我已经尝试调用super.finish()finish()(从新的活动中),但这会关闭我的整个应用程序(包括我的主活动)。

我如何只关闭当前焦点的活动,然后返回主活动?

编辑

我的手机返回按钮也关闭了整个应用程序,这让我想到我是否错误地启动了第二个活动?


好的,我一直在寻找解决方法,

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

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

对于上面提到的那个活动,它只是退出了整个应用程序。

因此,问题似乎不在于结束活动的代码,而在于活动本身。


4
不需要返回按钮,只需让用户使用手机上的返回键即可,您无需做任何操作。 - Hoan Nguyen
手机的返回按钮关闭了输入应用程序,而不仅仅是我的次要活动。我不想关闭主活动。 - Zapnologica
1
“返回”按钮不应该这样做 - 你能展示更多的代码吗? - peejaybee
回应您的编辑,从您发布的内容来看,第二个活动看起来不错。我认为TGMCians可能有正确的答案,您可以调查一下您的清单。 - peejaybee
请查看此答案,我认为这会对您有所帮助。 - Muhammad Helmi
19个回答

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

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

        return super.onOptionsItemSelected(item);
    }

尝试这个方法,它可以同时适用于工具栏返回按钮硬件返回按钮


这个对我有用。我还有一个MainActivity和一个SettingsActivity,第二个有android:parentActivityName=".MainActivity"。这段代码处理了工具栏中的Home/Back按钮,并且只是完成当前活动并返回到堆栈中的上一个活动。谢谢。 - mortalis

2

我不知道这是否有用,但我曾经也遇到同样的问题,后来我找到了一个非常简单的方法,只需要使用一个全局布尔变量和onResume()动作。在我的情况下,如果在Activity C中点击特定按钮,它应该触发Activity 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活动。

2
在您的活动的onCreate方法中,编写以下代码。原始答案翻译成"最初的回答"。
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

然后,覆盖你的活动上的onOptionsItem selected方法如下。原始答案翻译成"最初的回答"。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

最初的回答:只需要这些,你就可以开始了。

1

Finish关闭整个应用程序,这是我在Android开发中讨厌的事情,不是finish本身有问题,而是他们没有遵循良好的语法规范。

startActivity(intent)

为什么不使用 closeActivity(intent) 方法来关闭活动?

1
这个回答解决了问题吗?还是只是一个建议?无论哪种情况,抱怨都是不必要的,也可能不受欢迎。 - Gilles Gouaillardet
它不会关闭应用程序,只会关闭当前的活动。请参考:https://developer.android.com/reference/android/app/Activity.html#finish() - ezaspi

1

如果您不在MainActivity上调用finish(),那么这将消除您需要在SecondActivity中覆盖onBackPressed()的需要,除非您正在该函数中进行其他操作。如果您感觉需要使用此返回按钮,则可以简单地在SecondActivity上调用finish(),这将带您回到MainActivity,只要您没有在其上调用finish()


我尝试了这种方法,但是我有大约10个连续使用高分辨率PNG的屏幕。问题是,在第7个屏幕左右,由于后台堆栈中的所有活动,设备已经没有内存可用。我决定在每个活动上调用finish,并通过允许垃圾回收来解决此问题,但现在需要手动编写后退行为,因为后台堆栈现在为空。您是否遇到过这个问题或者知道Android中有哪些机制可以解决这个问题? - Lo-Tan
你想让返回按钮做什么?返回到先前的“Activity”,还是总是返回到“MainActivity”?此外,如果您在使用“Bitmaps”时遇到内存不足的情况,那么您应该阅读文档中的这一部分。它对我很有帮助。 - codeMagic
@Lo-Tan,如果你想回到之前的活动,那么我认为你需要解决图像的内存管理问题,而不是结束活动(也许可以使用我提供的链接)。否则,你将不得不重新创建一个活动实例,并尝试找出要返回哪个活动。 - codeMagic
我希望返回按钮只能回到上一个屏幕。这是一系列教程屏幕,用户可以前进/后退。每个屏幕都经过设计并使用大量PNG文件 - 有时是占据整个屏幕的PNG文件(而不仅仅是小缩略图),因此每个屏幕都会消耗大量内存。 - Lo-Tan
@Lo-Tan 我认为你想要重写 onBackPressed() 方法,然后手动创建你想要跳转的活动。然后你可以结束当前的活动并启动之前的一个。 - Zapnologica

1
可能你正在点击按钮事件中调用finish();,导致主活动在你点击按钮后立即关闭,当你从下一个活动返回时,应用程序退出,因为主活动已经关闭,并且没有活动处于活动状态。

1
如果以上答案都没有帮助到你,我认为这个可能会帮助到某些人。
当我按内置的返回按钮或自定义的返回按钮时,应用程序关闭而不返回上一个活动,我也遇到了同样的问题。
我是从第一个活动的工具栏中调用第二个活动的。
但在起始活动中,我调用了以下内容:
case android.R.id.home:
            if (isActionMode) {
                clearSelectingToolbar();
                adapter.notifyDataSetChanged();
            } else {
                onBackPressed(); // This was making the activity to finish 
            }
            break;

并且这段代码用于启动活动

 case R.id.settings:
            context.startActivity(new Intent(ShowAllDirectoriesActivity.this, SettingsActivity.class));

在删除了“case android.R.id.home”部分后,我的活动能够正常执行,即返回到先前的活动。

因此,如果您也在使用相同的内容,请检查它!


1

你必须在你的MainActivity中使用这个

 Intent intent = new Intent(context , yourActivity);

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

这个标志将启动多个任务,使您的MainActivity保持活跃状态。当您调用finish时,它将关闭其他活动并返回到MainActivity。


0
{ getApplicationContext.finish();   }

尝试这个方法……


虽然这个代码块可能回答了问题,但最好能够提供一些解释为什么它能够这样做。 - David

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