如何在Android程序中以编程方式按下返回按钮?

85

在我的应用程序中,有一个注销功能。如果用户点击注销,则会进入主屏幕。现在我通过按返回按钮退出我的应用程序。但是我想要的是像返回按钮功能一样自动退出(即以编程方式)。我知道调用finish()会实现此功能。但问题是它会回到上一个活动。


即使您按下返回按钮,先前的活动也会显示... - Tarun
10
只需使用 finish(); 即可。 - V.J.
1
@Tarun 我正在使用这段代码来清除所有历史记录 ExitActivity.this.finish(); Intent intent1 = new Intent(ExitActivity.this,PinActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent1);
- vinothp
@user1216003,你走在正确的道路上。你可以通过在意图中设置标志来实现与返回按钮相同的操作。 - V.J.
8个回答

131

onBackPressed()自API Level 5以后就被支持。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {
        onBackPressed();
    }
}

@Override
public void onBackPressed() {
    //this is only needed if you have specific things
    //that you want to do when the user presses the back button.
    /* your specific things...*/
    super.onBackPressed();   
}

3
这样做有何意义?您正在描述Android默认的行为。当按下返回按钮时,它会调用onBackPressed()…我说得对吗? - drulabs
3
如果你需要支持 API 5 及以下的版本,则必须像上面那样使用。更多详情请参考此链接:http://android-developers.blogspot.co.uk/2009/12/back-and-other-hard-keys-three-stories.html。 - Tarun
1
然后onBackPressed就可以了......在onBackPressed()内启动您的ExitIntent。 - Tarun
1
感謝您的評論,我沒有使用返回按鈕。我正在使用登出按鈕,當用戶點擊時會彈出對話框詢問是否確定。如果確定,它會回到主屏幕,然後自動退出,但我卡在那裡了......這是因為我的應用程序中使用了警報功能。每當警報彈出消息時,主屏幕就會成為其背景。所以我需要移除它,這就是我正在嘗試做的事情... - vinothp
@SiKni8 你可以调用 getActivity().getFragmentManager().popBackStack(); - Tarun
显示剩余2条评论

46

你不需要覆盖 onBackPressed() - 它已经被定义为当用户按下返回按钮时,你的活动将默认执行的操作。因此,每当你想要 "程序化地按下" 返回按钮时,只需调用 onBackPressed()

然而,这只会导致 finish() 被调用 ;)

我认为你对返回按钮的作用感到困惑了。默认情况下,它只是调用 finish(),因此仅退出当前活动。如果在该活动后面有其他东西,那个屏幕就会显示出来。

当从登录中启动您的活动时,您可以添加一个 CLEAR_TOP 标志,这样当你退出时,登录活动就不会存在。


嗨,谢谢你的回答。听起来不错,但我再次尝试了你的方法,最终还是停留在同样的登录界面。你能帮我解决这个问题吗? - vinothp
1
这是正确的答案,但你应该编辑它,因为它并不总是“只是调用finish()” 。在我的情况下(并且它正好按照我的意图工作),它是通过片段堆栈向后移动的一种方式,并且直到您到达该堆栈上的第一个项目才调用finish()。 - Yevgeny Simkin

11
有时候覆盖方法onBackPressed()很有用,因为在使用片段(fragment)并且在它们之间切换时,如果您按返回按钮,它们会返回到上一个片段。

1
这完全正确,值得更多赞。 - Yevgeny Simkin

5
在您的活动中重写onBackPressed方法后,调用它。

2
感谢您的评论。在OnBackPressed中,我可以插入代码以便在按下后退按钮时执行某些操作。但是我想要的是自动调用后退按钮…我的意思清楚吗? - vinothp
做一件事情...无论你想在哪里调用,无论你想什么时候调用,只需调用这个函数。你可以根据标志或任何你想要的事件,在onCreate内部调用它。 - drulabs

3
您可以简单地使用onBackPressed();,或者如果您正在使用片段,则可以使用getActivity().onBackPressed()

0
public void onBackPressed() {
        Intent intent = new Intent(Intent.ACTION_MAIN);

        intent.addCategory(Intent.CATEGORY_HOME);

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        startActivity(intent);

    }

// 确保在 onCreate 方法之外使用


0

只需在您的第一个类(登录活动)的onPause();方法中添加finish();即可。就这样


0

对于使用 Kotlin 并且涉及到片段的用户:

如果您正在通过活动进行导航,请使用 finish(),但是对于片段,您可以通过其片段标记来删除该片段。

当导航到片段时,请使用:

myFragment = myFragment(this)            

parentFragmentManager.beginTransaction()
                .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out)
                .add(R.id.baseFragmentContainer, myFragment, "MYFRAGMENT")
                .addToBackStack("myFragmentNameInStack")
                .commit()

然后,当点击您特定的按钮并模拟“返回按钮”按下时,请执行以下操作:

    binding.someButton.setOnClickListener {
        activity?.supportFragmentManager?.
        popBackStack("myFragmentNameInStack", FragmentManager.POP_BACK_STACK_INCLUSIVE)
    }

这将删除由标签"myFragmentNameInStack"添加的片段,显示屏幕上的前一个。

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