首页 文章

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

提问于
浏览
172

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

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

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

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

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

但这也行不通 .

12 回答

  • 2

    This method is working fine

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

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

    到您正在开始的活动 .

  • 32

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

  • 88

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

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

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

    moveTaskToBack(boolean nonRoot) 按原样离开你的后栈,只需将你的任务(所有活动)放在后台 . Same as if user pressed Home button .

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

  • 1

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

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

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

    您的案例有两种解决方案,例如,如果活动A开始活动B,但您不想返回活动B中的活动A.

    1. Removed previous activity A from back stack.

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

    2. Disabled go back button action.

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

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

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

  • 0

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

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

  • 2

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

  • 13

    紧接着 finish()

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

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

    android:launchMode="singleTask"
    

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

  • 5
    @Override
    public void onBackPressed() {
    }
    

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

相关问题