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

ece*_*cem 196 android back activity-stack back-stack

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

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

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

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

@Override
public void onBackPressed() {
    finish();
}
Run Code Online (Sandbox Code Playgroud)

但这也行不通.

cod*_*der 334

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

  • 注意:如果在共享转换期间调用"完成",则可能会对先前的活动产生影响.例如,如果您有`HomeActivity` - >`IntermediateActivity` - >`FinalActivity`,并且在启动`FinalActivity'之后立即在`IntermediateActivity`中调用`finish()`,您将看到`HomeActivity`以获得简短的内容时刻. (4认同)
  • 如果我希望之前活动中的线程保持运行怎么办? (2认同)
  • 那时你不会想采用我的方法。调用 finish() 将终止活动。您能否开始您想要在您将要进行的活动中运行的流程? (2认同)

Mar*_*Bro 96

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

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

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 完美的登录屏幕,因为它保持历史完整。 (3认同)

pau*_*sm4 34

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

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

在android中禁用后退按钮

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

       return;
    }
Run Code Online (Sandbox Code Playgroud)

如何禁用"返回"某些活动?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>
Run Code Online (Sandbox Code Playgroud)


Lun*_*ong 18

您的案例有两种解决方案,活动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
Run Code Online (Sandbox Code Playgroud)

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

有两种方法可以防止返回事件,如下所示,

1)推荐方法

@Override
public void onBackPressed() {
}
Run Code Online (Sandbox Code Playgroud)

2)覆盖onKeyDown方法

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

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

  • 禁用onBackPressed()是不是糟糕的用户体验? (2认同)

Roh*_*ngh 10

由于已经提出了许多很好的解决方案,我尝试给出更具描述性的解释。

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

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

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

调用finish()方法

正常流程:

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

那么如果你想跳过活动B?

即 A<--- C

只需在活动 Bfinish();之后添加方法startActvity(...)

Intent i = new Intent(this, C.class);
startActivity(i);
finish();
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


cad*_*vre 5

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

你试过连接Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY吗?记得在Intent开始活动时使用这个标志!

  • `FLAG_ACTIVITY_NO_HISTORY` 阻止我的 LoginScreen 在使用 Login with Facebook 时捕获 Facebook 的回调。因为一旦焦点离开 LoginScreen 就无法恢复(因为没有历史记录)。但是我还没有用`Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS`试过,我会检查一下,谢谢! (2认同)