如何在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个回答

234

我认为你在MainActivity中调用了finish()方法,然后才启动SettingsActivity。根据你所描述的场景,会出现以下两种情况:

要么:

你在AndroidManifest.xml中设置了MainActivityandroid:noHistory = “true”,这会导致在按下返回键时MainActivity自动结束。

要么:

在切换到“SettingsActivity”之前,你在MainActivity中调用了finish(),从而关闭了它。当你按下返回按钮时,由于没有其他活动存在于堆栈中可以弹出,它会回到主屏幕。


这可能解释了为什么手机的“返回”按钮也会关闭主活动。 - peejaybee
调试时,我注意到在finish()之后执行仍会继续,因此最好再加上一个return。 - untill
这个答案中的第三个原因不是和第一个一样吗? - Pang

70

在你所在的活动中,只需调用finish()即可返回到之前的活动。请注意,在finish()调用之后的任何代码都将被运行 - 你只需要在调用finish()后加一个return语句即可解决这个问题。

如果你想要将结果返回给第一个活动,那么在启动第二个活动时,你需要:

startActivityForResults(myIntent, MY_REQUEST_CODE);

在您所调用的活动中,您可以从onCreate()参数中获取意图或使用它。

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() 后返回即可避免执行以下代码。我认为“修复”这个词在这里不太合适。更准确地说,您是要避免执行以下行(而不是修复)。 - Lo-Tan

19
如果您使用Fragment,应该使用:
getActivity().onBackPressed();

如果您使用单个活动,则可以使用

finish();

这应该被标记为正确答案。 - undefined

16

当您点击按钮时,可以让它调用:

super.onBackPressed();

10

我相信你的第二个活动可能没有与你的主活动连接为一个子活动。检查你的AndroidManifest.xml文件,看看你的子活动的<activity>条目是否包含android:parentActivityName属性。它应该看起来像这样:

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

10

尝试使用这段代码替代 finish

onBackPressed();


2
从ActivityB返回ActivityA很好用。对于片段和单个活动,可以使用@Osama Ibrahim的答案。 - Eftekhari

10
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

这将关闭整个应用程序:

this.finish();

这将关闭整个应用程序,而不仅仅是当前活动,就像手机的返回按钮一样。 - Zapnologica
如何从相机活动返回到上一个活动。 - coderpc
5
不,它只会关闭当前活动。参见:https://developer.android.com/reference/android/app/Activity.html#finish() - Firzen

4

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

活动1(开场)- > 活动2(预览)- > 活动3(详情)

“返回键”错误响应

  • 在活动3上按设备返回键也会关闭活动2。

我已经检查了所有上面发布的答案,但没有一个有效。 Java语法用于在活动2和活动3之间进行转换被认为是正确的。

刚从调用第三方应用程序的活动中编码出来。 我们决定调查配置角度 - 最终使我们能够确定问题的根本原因。

范围:活动2(调用者)的配置。

根本原因

android:launchMode="singleInstance"

解决方案:

android:launchMode="singleTask"

显然,在“返回按键”问题上,singleInstance会将调用的Activity与调用Activity在一个实例中考虑,而singleTask允许被调用的Activity具有自己的身份,使预期的“返回按键”功能正常工作。

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