当在手机上按下BACK按钮时,我想阻止特定活动返回到之前的活动。
具体来说,我有登录和注册屏幕,当成功登录/注册时,都会启动一个名为HomeScreen
的新活动。启动HomeScreen后,我想通过按BACK键阻止用户返回登录或注册屏幕。
我尝试使用Intent.FLAG_ACTIVITY_NO_HISTORY
,但由于应用程序有Facebook集成,当使用“使用Facebook登录”时,Facebook应该返回初始登录屏幕,因此我应该保留这些活动的历史记录。 / p>
我想在HomeScreen
上覆盖BACK按钮的行为,以便在按下按钮时直接完成应用程序并使用
@Override
public void onBackPressed() {
finish();
}
但这也行不通。
答案 0 :(得分:316)
我的建议是完成您不希望用户返回的活动。例如,在您的登录活动中,在您致电startActivity
后立即致电finish()
。当用户点击后退按钮时,他们将无法进入登录活动,因为它已从堆栈中杀死。
答案 1 :(得分:91)
以下解决方案在通常的登录/主要活动场景或实施阻止屏幕时非常有用。
要最小化应用而不是回到之前的活动,您可以像这样覆盖onBackPressed()
:
@Override
public void onBackPressed() {
moveTaskToBack(true);
}
moveTaskToBack(boolean nonRoot)
保持原有的堆栈,只需将您的任务(所有活动)放在后台。 与用户按下主页按钮相同。
参数boolean nonRoot
- 如果为false,则仅当活动是任务的根时才有效;如果为true,它将适用于任务中的任何活动。
答案 2 :(得分:34)
我不确定你想要什么,但听起来应该是可能的,而且听起来你已经走在了正确的轨道上。
以下是一些可能有用的链接:
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"/>
答案 3 :(得分:15)
您的案例有两种解决方案,活动A启动活动B,但您不想回到活动B中的活动A.
<强> 1。从后台删除了之前的活动A.
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
ServerAdmin webmaster@yourdomain.com
DocumentRoot "/apache2/htdocs/YourDomainFolderWeb"
ServerName yourdomain.com
ErrorLog "logs/yourdomain.com-error_log"
CustomLog "logs/yourdomain.com-access_log" common
</VirtualHost>
<强> 2。已禁用在活动B中返回按钮操作。
有两种方法可以阻止返回事件,如下所示
1)推荐方法
Intent intent = new Intent(activityA.this, activityB.class);
startActivity(intent);
finish(); // Destroy activity A and not exist in Back stack
2)覆盖onKeyDown方法
@Override
public void onBackPressed() {
}
希望它有用,但仍取决于你的情况。
答案 4 :(得分:5)
finish()
为您提供关闭当前Activity而不是整个应用程序的方法。而你最好不要试图寻找杀死应用程序的方法。小建议。
您是否尝试过Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY
的结合?请记住在Intent
开始活动中使用此标记!
答案 5 :(得分:3)
将finish()
放在
Intent i = new Intent(Summary1.this,MainActivity.class);
startActivity(i);
finish();
答案 6 :(得分:2)
paulsm4的回答是正确的。如果在onBackPressed()
中你刚刚返回,它将禁用后退按钮。但是,我认为根据您的用例更好的方法是翻转活动逻辑,即将您的主页活动作为主要活动,检查用户是否在那里登录,如果没有,则启动登录活动。原因是,如果您覆盖主活动中的后退按钮,大多数用户在按下时会感到困惑,而您的应用程序什么都不做。
答案 7 :(得分:2)
如果您不想回到应用程序的所有活动,可以使用
android:launchMode="singleTask"
点击此处了解详情:http://developer.android.com/guide/topics/manifest/activity-element.html
答案 8 :(得分:2)
此方法运行正常
Intent intent = new Intent(Profile.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
答案 9 :(得分:1)
只需覆盖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;
}
答案 10 :(得分:1)
由于已经提出了许多不错的解决方案,因此请尝试给出更具说服力的解释。
如何跳过返回上一个活动?
从Backstack中删除上一个活动。简单
如何从Backstack中删除先前的活动?
调用finish()
方法
所有活动都存储在称为Backstack的堆栈中。
当您开始一个新的Activity(startActivity(...)
)时,新的Activity被推到堆栈的顶部,当您按下返回按钮时,Activity从堆栈中弹出。
要注意的一个关键点是,当按下后退按钮时,内部将调用finish();
方法。这是onBackPressed()方法的默认行为。
即A <--- C
只需在活动B中的finish();
之后添加startActvity(...)
方法
Intent i = new Intent(this, C.class);
startActivity(i);
finish();
答案 11 :(得分:0)
把
finish();
之后立刻 ActivityStart 阻止活动阻止任何方式回到它。 然后添加
onCreate(){
getActionBar().setDisplayHomeAsUpEnabled(false);
...
}
参加您正在开始的活动。
答案 12 :(得分:0)
@Override
public void onBackPressed() {
}
创建onBackPressed()
时,只需删除super.onBackPressed();
即可,
答案 13 :(得分:0)
我认为您可以在 startActivity() 之后简单地使用 finish()。