Android:防止回到上一个活动

问题描述:

我想在Android上这样做:基本上当手机按下BACK按钮时,我想阻止特定活动返回到之前的活动。Android:防止回到上一个活动

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

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

我想重写上HomeScreen BACK按钮的行为是按下按钮时,直接完成应用程序的,我用

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

但也不能正常工作。

我在Android开发中很新,所以任何帮助都会非常有用。

在此先感谢。

+0

只是为了澄清,你想捕捉回来的人,除Facebook的行为? – havexz 2011-12-25 19:16:37

+0

从某种意义上说是的,但实际上我想要的是在成功登录并且HomeScreen打开之后,用户不应该能够通过按BACK按钮返回到登录屏幕。就像Twitter或Foursquare一样,一旦我们登录到这些应用程序,我们在注销之前不会看到登录页面(即使我们在登录后按BACK)。 – ecem 2011-12-26 00:40:00

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

+11

是的,这是我一直在寻找!当我完成这个活动时调用'finish()'完全阻止回去。非常感谢你! – ecem 2011-12-29 02:19:49

+1

如果我想让上一个活动中的线程继续运行,该怎么办? – AlleyOOP 2014-01-06 18:09:59

+0

那你就不想用我的方法。调用finish()将会终止该活动。你可以开始你想要在你要做的活动中运行的过程吗? – coder 2014-01-06 18:32:36

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

这里有几个环节,这可能有助于:

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

我不能使用noHistory选项,因为我试图在我的问题中解释Facebook问题,也是其中一条评论。但是BACK按钮并没有关闭它,而是让它退出整个应用程序,如'System.exit(0)'(我知道它不是最好的practive,但我只是想举一个例子)。 – ecem 2011-12-26 00:48:24

+1

从void返回? – 2015-08-01 01:03:50

finish()给你方法来关闭当前的活动不是整个应用程序。而且你最好不要去寻找杀死应用程序的方法。小小的建议。

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

+1

当使用Facebook登录时,FLAG_ACTIVITY_NO_HISTORY会阻止我的LoginScreen捕获Facebook的回叫。因为一旦焦点离开LoginScreen,它就不能恢复(因为没有历史记录)。但我没有尝试过'Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS',我会检查它,谢谢! – ecem 2011-12-26 00:46:08

+0

也感谢'finish()'方法,我不知道它。 – ecem 2011-12-26 00:46:42

paulsm4的回答是正确的。如果在onBackPressed()中您只是返回,它将禁用后退按钮。不过,我认为根据您的使用情况,更好的方法是翻转活动逻辑,即将家庭活动作为主要活动,检查用户是否已登录,如果不是,则开始登录活动。原因是,如果您在主要活动中覆盖后退按钮,则大多数用户在向后按压时都会感到困惑,而您的应用什么也不做。

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

为了最大限度地减少应用程序,而不是回到以前的活动,您可以覆盖onBackPressed()这样的:

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

moveTaskToBack(boolean nonRoot)离开你的背部栈是什么,只要把你的任务(所有活动)的背景。 与用户按下主页按钮相同。

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

+7

很棒!正是我需要的。谢谢! – avb 2014-12-31 10:51:02

+0

这帮了我。谢谢! – Shami 2015-01-08 22:36:13

+0

这是有效的答案。 – Everett 2015-03-27 18:39:13

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 s挞到活动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.禁用回去按钮操作。

有两种方法可以防止如下回去事件,

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