如何防止回到以前的活动?

问题描述 投票:184回答:13

当在电话上按下BACK按钮时,我想阻止特定活动返回到之前的活动。

具体来说,我有登录和注册屏幕,当成功登录/注册时,都会启动一个名为HomeScreen的新活动。启动HomeScreen后,我想通过按BACK键阻止用户返回登录或注册屏幕。

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

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

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

但这也行不通。

android back back-stack activity-stack
13个回答
322
投票

我的建议是完成您不希望用户返回的活动。例如,在您的登录活动中,在您致电startActivity之后,请致电finish()。当用户点击后退按钮时,他们将无法进入登录活动,因为它已从堆栈中杀死。


2
投票

既然已经提出了很多很好的解决方案,那么就试着给出一个更具描述性的解释。

如何跳过回到之前的活动?

从Backstack中删除以前的Activity。简单

如何从Backstack中删除以前的Activity?

调用finish()方法

正常流量:

enter image description here 所有活动都存储在称为Backstack的堆栈中。 当您启动一个新的Activity(startActivity(...))时,新的Activity被推到堆栈的顶部,当您按下后退按钮时,Activity将从堆栈中弹出。 需要注意的一个关键点是,当按下后退按钮时,会在内部调用finish();方法。这是onBackPressed()方法的默认行为。

So if you want to skip Activity B?

不,ーーC

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

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

enter image description here


1
投票

只需覆盖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;
}

0
投票

finish();

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

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

对于您正在开始的活动。


0
投票
@Override
public void onBackPressed() {
}

当你创建onBackPressed()时,只需删除应该有效的super.onBackPressed();and


95
投票

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

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

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

moveTaskToBack(boolean nonRoot)按原样离开你的后栈,只需将你的任务(所有活动)放在后台。与用户按下主页按钮相同。

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


34
投票

我不确定你想要什么,但听起来应该是可能的,而且听起来你已经走在了正确的轨道上。

以下是一些可能有用的链接:

Disable back button in android

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

       return;
    }

How can I disable 'go back' to some activity?

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

17
投票

您的案例有两种解决方案,活动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);
}

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


5
投票

finish()为您提供关闭当前活动而非整个应用程序的方法。而你最好不要试图寻找杀死应用程序的方法。小建议。

你试过Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY的结合吗?记得在Intent开始活动中使用这个标志!


3
投票

finish()放在后面

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

2
投票

paulsm4的答案是正确的。如果在onBackPressed()你刚刚返回,它将禁用后退按钮。但是,我认为根据您的用例更好的方法是翻转活动逻辑,即将您的主页活动作为主要活动,检查用户是否在那里登录,如果没有,则启动登录活动。原因是,如果您覆盖主活动中的后退按钮,大多数用户在按下时会感到困惑,而您的应用程序什么都不做。


2
投票

如果您不想返回应用程序上的所有活动,则可以使用

android:launchMode="singleTask"

在这里了解更多:http://developer.android.com/guide/topics/manifest/activity-element.html


2
投票

这种方法工作正常

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
© www.soinside.com 2019 - 2024. All rights reserved.