按下后退按钮时如何退出?
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);
【讨论】:
以上是关于按下后退按钮时如何退出?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Cordova 中的 android 设备后退按钮退出应用程序?
为啥在c#,mvc中退出并按下浏览器后退按钮时会转到一个页面