当按下手机上的后退键时,我想阻止一个特定的活动返回到它的前一个活动。

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

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

我想过在主屏幕上重写BACK按钮的行为,当我按下该按钮时直接完成应用程序

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

但这也行不通。


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

下面是一些可能会有帮助的链接:

禁用android中的后退按钮

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

       return;
    }

我如何禁用“返回”到一些活动?

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

finish()提供了关闭当前Activity的方法,而不是整个应用程序。你最好不要试图寻找杀死应用程序的方法。小的建议。

你试过意图连接吗?flag_activity_exclude_from_recent | Intent.FLAG_ACTIVITY_NO_HISTORY?记得在Intent starting activity中使用这个标志!


Paulsm4的答案是正确的。如果在onBackPressed()中你只是返回,它将禁用返回按钮。然而,我认为对于你的用例,更好的方法是翻转活动逻辑,即使你的家庭活动为主,检查用户是否已登录,如果没有,启动登录活动。原因是,如果你在你的主活动中覆盖了后退按钮,大多数用户会在他们按下后退时感到困惑,而你的应用程序什么也没有做。


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


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

为了最小化应用程序而不是回到以前的活动,你可以像这样重写onBackPressed():

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

moveTaskToBack(boolean nonRoot)留下你的后台堆栈,只是把你的任务(所有活动)在后台。与用户按Home键时相同。

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


Put

finish();

后立即 ActivityStart 停止该活动,从而阻止返回该活动的任何方式。 然后添加

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

你要开始的活动。


只需重写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;
}

把finish()放在后面

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

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

android:launchMode="singleTask"

更多信息请访问:http://developer.android.com/guide/topics/manifest/activity-element.html


对于您的情况有两种解决方案,活动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中禁用返回按钮动作。

有两种方法可以防止go back事件,如下所示:

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);
}

希望对你有用,但还是要看你的情况。


这种方法工作得很好

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

@Override
public void onBackPressed() {
}

当你创建onBackPressed()时,只需删除super.onBackPressed();这应该可以工作


既然已经提出了许多很好的解决方案,我将试着给出一个更指导性的解释。

如何跳过回到前一个活动?

从Backstack中移除之前的Activity。简单的

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

调用finish()方法

正常流量:

所有的活动都存储在一个称为Backstack的Stack中。 当你启动一个新的Activity(startActivity(…))时,新的Activity被推到堆栈的顶部,当你按下back按钮时,Activity从堆栈中弹出。 需要注意的一个关键点是,当按下返回按钮时,然后finish();方法在内部调用。这是onBackPressed()方法的默认行为。

如果你想跳过活动B?

A<——C

只需添加finish();在活动B中你的startActvity(…

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


AndroidManifest.xml

 <activity 
      android:name=".welcome.SplashActivity"
      android:noHistory="true" // just add this line
      android:exported="true">  

 </activity>