如何防止回到上一个活动?


210

当我在手机上按了BACK按钮时,我要防止特定活动返回到先前的活动。

具体来说,我有登录和注册屏幕,HomeScreen当发生成功的登录/注册时,两者都启动一个新的活动。启动HomeScreen后,我想防止用户能够通过按BACK键返回登录或注册屏幕。

我尝试使用Intent.FLAG_ACTIVITY_NO_HISTORY,但是由于该应用程序集成了Facebook,因此当使用“使用Facebook登录”时,Facebook应该返回到初始登录屏幕,因此我应该保留这些活动的历史记录。

我想到了在按下按钮时覆盖BACK按钮的行为HomeScreen以直接完成应用程序,

@Override
public void onBackPressed() {
    finish();
}

但这也不起作用。


1
只是为了澄清一下,您试图捕获除Facebook外的所有人的行为?
havexz 2011年

2
从某种意义上说是的,但是实际上我想要的是在成功登录并打开HomeScreen之后,用户不能通过按BACK按钮返回到登录屏幕。就像Twitter或Foursquare一样,一旦我们登录到这些应用程序,我们将在注销之前看不到登录页面(即使在登录后按BACK)。
ecem 2011年

Answers:


345

我的建议是完成您不希望用户返回的活动。例如,在您的登录活动中,在您致电后立即startActivity致电finish()。当用户单击“后退”按钮时,他们将无法进入登录活动,因为该活动已从堆栈中删除。


2
如果我希望上一个活动中的线程继续运行该怎么办?
AlleyOOP 2014年

2
那您就不想采用我的方法了。调用finish()将终止活动。您可以在要执行的活动中启动要运行的流程吗?
编码器

7
注意:如果您finish在共享转接期间拨打电话,您可能会流失以前的活动。例如,如果您具有HomeActivity-> IntermediateActivity-> FinalActivity,并且在启动后立即调用finish(),您会在短暂的时间内看到。IntermediateActivityFinalActivityHomeActivity
大卫·默多克

101

在通常的登录/主要活动场景中或实施阻止屏幕时,以下解决方案可能非常有用。

为了最小化应用程序而不是返回到上一个活动,您可以onBackPressed()像这样覆盖:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot)保持原样,仅将任务(所有活动)置于后台。与用户按下“主页”按钮相同

参数boolean nonRoot-如果为false,则仅在活动是任务的根目录时才有效;如果为true,则适用于任务中的任何活动。


3
非常适合登录屏幕,因为它可以保持历史记录完整。
Hackmodford

谢谢,我试图找到这个大约三天。由于Activity的android:noHistory =“ true”标志无法按预期运行(noHistory标志在最小化后会重新创建活动),而finish()有时对我不起作用,但是为什么我仍然不明白。
Denshov '16

37

我不确定您到底想要什么,但听起来似乎应该可行,而且听起来您已经步入正轨。

这里有一些链接可能会有所帮助:

在Android中禁用后退按钮

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

如何禁用“返回”某些活动?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
由于Facebook问题,我无法使用noHistory选项,我试图在我的问题以及其中一项评论中进行解释。但是带有BACK按钮的功能不是禁用它,而是使它像退出整个应用程序一样System.exit(0)被调用(我知道这不是最好的方法,但我只想举一个例子)。
ecem

谢谢,这很好。我在这里只提出建议,不需要退货。只需删除super.onBackPressed();并将方法留空即可。效果也很好
hyperCoder

20

针对您的情况有两种解决方案,活动A启动活动B,但是您不希望返回活动B中的活动A。

1.从后堆栈中删除了先前的活动A。

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2.在活动B中禁用了返回按钮操作。

有以下两种防止返回事件的方法,

1)推荐方式

@Override
public void onBackPressed() {
}

2)覆盖onKeyDown方法

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

希望它有用,但仍取决于您的情况。


3
禁用onBackPressed()是否可以带来不错的用户体验?
C. Skjerdal

这完全取决于您要制作的内容,应用程序功能需要它然后再去做。
user3099225 '19

我完全忘记了使用的第一种方法,这真是令人惊讶finish()。不必要地过度使用nohistory属性,意图标志,父级活动清单标签等!傻了,谢谢你的回答!
瓦伦

8

由于已经提出了许多好的解决方案,因此请尝试给出更具说服力的解释。

如何跳过返回上一个活动?

从Backstack中删除以前的活动。简单

如何从Backstack中删除先前的活动?

通话finish()方式

正常流量:

在此处输入图片说明
所有活动都存储在称为Backstack的堆栈中。
当您开始一个新的Activity(startActivity(...))时,新的Activity被推到栈顶,当您按下返回按钮时,Activity从栈中弹出。要注意的
一个关键点是,当按下后退按钮时,将在finish();内部调用method。这是onBackPressed()方法的默认行为。

那么,是否要跳过活动B?

即A <-C

只需在活动B中添加finish();方法startActvity(...)

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

在此处输入图片说明


6

finish()提供给您关闭当前Activity而非整个应用程序的方法。而且您最好不要尝试寻找杀死应用程序的方法。一点建议。

您是否尝试过的合取Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY?请记住在Intent开始活动时使用此标志!


2
FLAG_ACTIVITY_NO_HISTORY使用“通过Facebook登录”时,阻止我的LoginScreen捕获Facebook的回调。因为一旦焦点移出LoginScreen,就无法恢复(因为没有历史记录)。但是我还没有尝试过Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,我会检查一下,谢谢!
ecem

也感谢该finish()方法,我对此一无所知。
ecem

4

放在finish()之后

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
这基本上是四年前公认的答案。
TylerH

3

paulsm4的答案是正确的。如果onBackPressed()只是返回,它将禁用后退按钮。但是,我认为,鉴于您的用例,一种更好的方法是翻转活动逻辑,即使您的家庭活动成为主要活动,检查用户是否在此处登录,如果没有,则启动登录活动。原因是,如果您在主要活动中覆盖了“后退”按钮,那么大多数用户在按下后便会感到困惑,而您的应用程序则什么也不做。



3

这种方法很好用

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

只需重写onKeyDown方法并检查是否按下了后退按钮。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

当您创建onBackPressed()只是删除super.onBackPressed();,并应工作


1

finish();

在ActivityStart之后立即停止活动,以防止以任何方式返回活动。然后加

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

开始您的活动。

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.