ChatGPT解决这个技术问题 Extra ChatGPT

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

当在手机上按下 BACK 按钮时,我想防止特定活动返回到之前的活动。

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

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

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

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

但这也行不通。

只是为了澄清一下,您试图为除 facebook 之外的所有人捕捉行为?
在某种意义上是的,但实际上我想要的是在成功登录并打开 HomeScreen 之后,用户应该无法通过按 BACK 按钮返回登录屏幕。就像 Twitter 或 Foursquare 一样,一旦我们登录到这些应用程序,在我们注销之前我们看不到登录页面(即使我们在登录后按 BACK)。

c
coder

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


如果我希望上一个活动中的线程继续运行怎么办?
那时你不会想采用我的方法。调用 finish() 将终止活动。您能否在您将要进行的活动中启动您想要运行的流程?
注意:如果您在共享转换期间调用 finish,您可能会看到之前的活动。例如,如果您有 HomeActivity -> IntermediateActivity -> FinalActivity,并且您在启动 FinalActivity 后立即在 IntermediateActivity 中调用 finish(),您会在短时间内看到 HomeActivity
@DavidMurdoch您知道针对该特定案例的任何解决方案吗?
M
Marcel Bro

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

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

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

moveTaskToBack(boolean nonRoot) 保留您的后台堆栈,只是将您的任务(所有活动)置于后台。 与用户按下主页按钮相同

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


完美的登录屏幕,因为它保持历史完整。
谢谢你,我试图找到这个大约三天。因为 Activity 的 android:noHistory="true" 标志不能按预期工作(noHistory 标志在最小化后重新创建活动)并且 finish() 有时对我不起作用,但为什么我仍然不明白。
C
Community

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

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

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"/>

由于我试图在我的问题和评论之一中解释的 Facebook 问题,我无法使用 noHistory 选项。但是带有 BACK 按钮的东西并没有禁用它,而是让它像 System.exit(0) 一样退出整个应用程序(我知道这不是最好的做法,但我只是想举个例子)。
谢谢这很好用。我在这里提出的唯一建议是,无需退货。只需删除 super.onBackPressed(); 并将方法留空。这也很好用
S
Sundip Mistry

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

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


禁用 onBackPressed() 是不是很糟糕的用户体验?
这完全取决于您要做什么,在应用程序功能中需要这个然后去做。
令人惊讶的是,我完全忘记了使用finish() 的第一种方法。对 nohistory 属性、意图标志、父活动清单标签等进行了不必要的过度考虑!傻,谢谢你的回答!
C
Community

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

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

从 Backstack 中删除前一个 Activity。简单的

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

调用 finish() 方法

正常流程:

https://i.stack.imgur.com/3X9lS.png

所以如果你想跳过活动B?

即 A<--- C

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

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

https://i.stack.imgur.com/qiOOC.png


这是部分解决方案,context 没有 finish()
Activity 有 finish() 方法。
c
cadavre

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 尝试过,我会检查一下,谢谢!
还要感谢 finish() 方法,我不知道。
g
gsamaras

finish() 放在后面

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

这基本上是四年前公认的答案所说的。
a
asok Buzz

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

android:launchMode="singleTask"

在此处了解更多信息:http://developer.android.com/guide/topics/manifest/activity-element.html


d
dmon

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


A
A P

这种方法工作正常

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

h
hyperCoder
@Override
public void onBackPressed() {
}

创建 onBackPressed() 时,只需删除 super.onBackPressed(); 即可


M
Machine Tribe

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

B
Brandon Dyer

finish();

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

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

到您开始的活动。


M
Mahesh Mahadar

AndroidManifest.xml

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

 </activity>