当在手机上按下 BACK 按钮时,我想防止特定活动返回到之前的活动。
具体来说,我有登录和注册屏幕,当成功登录/注册时,它们都会启动一个名为 HomeScreen
的新活动。启动 HomeScreen 后,我想阻止用户通过按 BACK 键返回登录或注册屏幕。
我尝试使用 Intent.FLAG_ACTIVITY_NO_HISTORY
,但由于应用程序集成了 Facebook,当使用“使用 Facebook 登录”时,Facebook 应该返回初始登录屏幕,因此我应该保留这些活动的历史记录。
我想在按下按钮并使用时覆盖 HomeScreen
上的 BACK 按钮的行为以直接完成应用程序
@Override
public void onBackPressed() {
finish();
}
但这也行不通。
我的建议是完成您不希望用户返回的活动。例如,在您的登录活动中,在您调用 startActivity
之后立即调用 finish()
。当用户点击后退按钮时,他们将无法进入登录活动,因为它已从堆栈中删除。
以下解决方案在通常的登录/主要活动场景或实施阻止屏幕中非常有用。
要最小化应用程序而不是返回到以前的活动,您可以像这样覆盖 onBackPressed()
:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
moveTaskToBack(boolean nonRoot)
保留您的后台堆栈,只是将您的任务(所有活动)置于后台。 与用户按下主页按钮相同。
参数 boolean nonRoot
- 如果为 false,则仅当活动是任务的根时才有效;如果为真,它将适用于任务中的任何活动。
我不确定您到底想要什么,但听起来应该是可能的,而且听起来您已经走在正确的轨道上。
以下是一些可能有帮助的链接:
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"/>
System.exit(0)
一样退出整个应用程序(我知道这不是最好的做法,但我只是想举个例子)。
您的情况有两种解决方案,活动 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);
}
希望它有用,但仍然取决于您的情况。
finish()
的第一种方法。对 nohistory
属性、意图标志、父活动清单标签等进行了不必要的过度考虑!傻,谢谢你的回答!
由于已经提出了许多很好的解决方案,我试着给出一个更具描述性的解释。
如何跳过回到上一个活动?
从 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()
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()
方法,我不知道。
将 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
paulsm4 的答案是正确的。如果在 onBackPressed()
中您只是返回,它将禁用返回按钮。但是,考虑到您的用例,我认为更好的方法是翻转活动逻辑,即将您的家庭活动作为主要活动,检查用户是否在那里登录,如果没有,则启动登录活动。原因是,如果您在主活动中覆盖后退按钮,大多数用户会在按下后退时感到困惑,而您的应用程序什么也不做。
这种方法工作正常
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();
即可
只需覆盖 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();
在 ActivityStart 之后立即停止活动,防止以任何方式返回它。然后加
onCreate(){
getActionBar().setDisplayHomeAsUpEnabled(false);
...
}
到您开始的活动。
AndroidManifest.xml
<activity
android:name=".welcome.SplashActivity"
android:noHistory="true" // just add this line
android:exported="true">
</activity>
finish
,您可能会看到之前的活动。例如,如果您有HomeActivity
->IntermediateActivity
->FinalActivity
,并且您在启动FinalActivity
后立即在IntermediateActivity
中调用finish()
,您会在短时间内看到HomeActivity
。