按下后退按钮时如何退出?

Posted

技术标签:

【中文标题】按下后退按钮时如何退出?【英文标题】:How to exit when back button is pressed? 【发布时间】:2011-01-22 04:45:21 【问题描述】:

当用户按下意图上的后退按钮时,应用程序应该退出。如何确保按下后退按钮时应用程序退出?

【问题讨论】:

【参考方案1】:

在我的家庭活动中,我将“onBackPressed”覆盖为:

@Override
public void onBackPressed() 
   Intent intent = new Intent(Intent.ACTION_MAIN);
   intent.addCategory(Intent.CATEGORY_HOME);
   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(intent);
 

因此,如果用户在主页活动中并按返回,他会转到主屏幕。

我从Going to home screen Programmatically获取代码

【讨论】:

非常好,正是我需要的。 有人可以更深入地描述它是如何工作的吗?如果用户一直按返回按钮然后重新启动应用程序,活动堆栈不会无限增长吗? 嗯,在我看来,这只是对了一半。在大多数情况下,调用“原始”finish() 将调用 onDestroy()。您的日志告诉“正在完成”,但应用程序没有。但我没有更好的解决方案。奇怪的感觉。 @MartinPfeffer 你是对的,这可能会令人困惑。忘记日志,我刚删了。【参考方案2】:

在您开始一项新活动后,立即使用startActivity,确保您调用finish(),以便当前活动不会堆叠在新活动后面。

编辑 关于您的评论:

您所建议的并不是特别是 android 应用程序流程通常如何工作,以及用户期望它如何工作。如果您真的愿意,您可以 做的是确保导致该活动的每个startActivity 都是startActivityForResult 并且有一个onActivityResult 侦听器来检查退出代码,然后起泡。你可以read more about that here。基本上,在完成一项活动之前使用setResult 设置您选择的退出代码,如果您的父活动收到该退出代码,您将其设置在 that 活动中,然后完成那个,等等...

【讨论】:

我认为您不理解此案,我的问题是当用户单击特定的一项活动时,我选择按下后退按钮应该使呼叫退出应用程序【参考方案3】:

更好的用户体验:

/**
 * Back button listener.
 * Will close the application if the back button pressed twice.
 */
@Override
public void onBackPressed()

    if(backButtonCount >= 1)
    
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    
    else
    
        Toast.makeText(this, "Press the back button once again to close the application.", Toast.LENGTH_SHORT).show();
        backButtonCount++;
    

【讨论】:

干得好。我要添加的其他一些内容是为 Toast.makeText 调用设置一个成员变量(例如 Toast myToast=Toast.makeText()),然后在 backButtonCount >= 1 上使用它,在该 toast 上调用 .cancel()。为了我的目的,我将持续时间延长到 Toast.LENGTH_LONG,因为对于文本的数量来说,持续时间似乎很短。我的用户是老年人。此外,很明显,backButtonCount 是一个设置为 0 的成员变量,在您的第一个 if 语句中也应该设置为 0。 我还添加了“android.os.Process.killProcess(android.os.Process.myPid());”因此,如果用户再次单击它,我的应用程序将被杀死并重新启动【参考方案4】:

只有在后台堆栈中没有活动时,应用才会退出。所以在你的清单中添加这一行 android:noHistory="true" 到所有你不想重新堆叠的活动中。然后关闭应用程序调用 finish() strong> 在 OnBackPressed 中

<activity android:name=".activities.DemoActivity"
            android:screenOrientation="portrait"
            **android:noHistory="true"**
            />

【讨论】:

【参考方案5】:

为什么用户不直接点击主页按钮?然后他们可以从您的任何活动中退出您的应用,而不仅仅是特定活动。

如果您担心您的应用程序继续在后台执行某些操作。确保在相关的 onPause 和 onStop 命令中停止它(当用户按下 Home 时会触发)。

如果您的问题是您希望用户下次点击您的应用时重新开始,我建议您在屏幕上放置某种菜单项或 UI 按钮,让用户回到起点您的应用程序的活动。比如官方推特应用中的推特鸟等。

【讨论】:

【参考方案6】:

使用onBackPressed方法

@Override
public void onBackPressed() 
    finish();
    super.onBackPressed();

这将解决您的问题。

【讨论】:

那是错误的。应该先调用super.onBackPressed();【参考方案7】:

首先,Android 不建议您在后退按钮中执行此操作,而是使用提供的生命周期方法。后退按钮不应破坏 Activity。

Activity 被添加到堆栈中,当在 UI 堆栈中最后一个剩余的 Activity 上按下后退按钮时,可以从概览(方形按钮,因为他们在 5.0 中引入了材料设计)访问。如果用户想要关闭您的应用,他们应该从“概览”菜单中将其滑动(关闭)。

您的应用负责在 onPause()、onStop() 和 onDestroy() 生命周期方法上停止任何您不想运行的后台任务和作业。请在此处阅读有关生命周期及其正确实施的更多信息:http://developer.android.com/training/basics/activity-lifecycle/stopping.html

但要回答您的问题,您可以执行 hacks 来实现您想要的确切行为,但正如我所说,不建议这样做

@Override
 public void onBackPressed() 

// make sure you have this outcommented
// super.onBackPressed();
 Intent intent = new Intent(Intent.ACTION_MAIN);
 intent.addCategory(Intent.CATEGORY_HOME);
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);

【讨论】:

【参考方案8】:

要退出 Android 应用,只需使用。 在你的 Main Activity 中,或者你可以使用 Android manifest 文件来设置

android:noHistory="true"

【讨论】:

【参考方案9】:

使用方法finish() onBack method of your current_activity完成你的current_activity

然后在 current_activity 的 onDestroy 中添加以下行以移除强制关闭

@Override
public void onDestroy()

    android.os.Process.killProcess(android.os.Process.myPid());
    super.onDestroy();

【讨论】:

【参考方案10】:

我修改了@Vlad_Spays 的答案,以便后退按钮正常工作,除非它是堆栈中的最后一项,然后在退出应用程序之前提示用户。

@Override
public void onBackPressed()
    if (isTaskRoot())
        if (backButtonCount >= 1)
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
        else
            Toast.makeText(this, "Press the back button once again to close the application.", Toast.LENGTH_SHORT).show();
            backButtonCount++;
        
    else
        super.onBackPressed();
    

【讨论】:

【参考方案11】:

你可以简单地使用这个

 startActivity(new Intent(this, Splash.class));
 moveTaskToBack(true);

startActivity(new Intent(this, Splash.class)); 是应用程序启动时将启动的第一个类

moveTaskToBack(true); 将最小化您的应用程序

【讨论】:

【参考方案12】:

将此代码添加到您想要在按下后退按钮时退出应用程序的活动中:

@Override
public void onBackPressed() 
    super.onBackPressed();
    exitFromApp();


private void exitFromApp() 
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);

【讨论】:

以上是关于按下后退按钮时如何退出?的主要内容,如果未能解决你的问题,请参考以下文章

在颤振中,按下后退按钮时如何返回上一个 URL?

按下后退按钮时如何删除堆栈中的所有活动

如何从 Cordova 中的 android 设备后退按钮退出应用程序?

为啥在c#,mvc中退出并按下浏览器后退按钮时会转到一个页面

当按下后退按钮并打开导航抽屉时,我的应用程序关闭而不是关闭抽屉

按下后退按钮时保存