【发布时间】:2014-01-21 08:54:52
【问题描述】:
我正在构建一个 Android 应用程序。按下返回时如何退出 Android 应用程序。安卓版本为2.3.3及以上。 Android 应用程序会转到我不想要的上一个活动。
【问题讨论】:
-
清除后台堆栈。或在暂停呼叫完成时使用基本活动覆盖。从中扩展您的活动
-
用
finish()覆盖onBackPressed()
标签: android
我正在构建一个 Android 应用程序。按下返回时如何退出 Android 应用程序。安卓版本为2.3.3及以上。 Android 应用程序会转到我不想要的上一个活动。
【问题讨论】:
finish()覆盖onBackPressed()
标签: android
试试这个
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
【讨论】:
AndroidManifest.xml 中为我的 WelcomeActivity 类添加了android:noHistory="true",但是从我的 WelcomeActivity 中按下后退按钮并没有关闭我的应用程序(这是我想要的);它会带我回到我的 MainActivity,这是我调用 startActivityForResult() 方法去 WelcomeActivity 的地方。我必须在 WelcomeActivity 类上使用您的解决方案才能让我的应用正确关闭。
按下后退按钮时您实际上不想再次打开的某些活动,例如启动屏幕活动、欢迎屏幕活动和确认窗口。实际上,您不需要在活动堆栈中使用它。您可以使用=> 打开 Manifest.xml 文件并添加属性来执行此操作
android:noHistory="true"
这些活动。
<activity
android:name="com.example.shoppingapp.AddNewItems"
android:label=""
android:noHistory="true">
</activity>
或
有时您想在按下某个后退按钮时关闭整个应用程序。这里最好的做法是打开主窗口而不是退出应用程序。为此,您需要重写 onBackPressed() 方法。通常,此方法会打开堆栈中的顶部活动。
@override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
或
按下后退按钮时,您想退出该活动,并且您不想将其添加到活动堆栈中。在 onBackPressed() 方法中调用 finish()。它不会关闭整个应用程序,它只会转到堆栈中的上一个活动。
onBackPressed() - 当 Activity 检测到用户按下返回键时调用。
public void onBackPressed() {
finish();
}
【讨论】:
android:noHistory="true" 放在我的AndroidManifest.xml 文件中,但按下后退按钮不断将我带回我的 MainActivity。我还必须按照您的建议覆盖 onBackPressed() 方法,以便当我在欢迎屏幕活动中时,我的后退按钮关闭我的应用程序。我不知道为什么android:noHistory="true" 不起作用。
你可以这样做清除所有的后台堆栈。
@Override
public void onBackPressed() {
finishAffinity();
}
【讨论】:
我知道为时已晚,但没有人提到我使用的代码,所以它会帮助其他人。
这个moveTaskToBack 与主页按钮一样工作。它使 Back 堆栈保持原样。
public void onBackPressed() {
// super.onBackPressed();
moveTaskToBack();
}
【讨论】:
我找到了一个有趣的解决方案,可能会有所帮助。
我在我的 onBackPressed() 中实现了这个
finishAffinity();
finish();
FinishAffinity 移除现有活动与其堆栈的连接。然后完成可帮助您退出该活动。最终会退出应用程序。
【讨论】:
如果您在历史记录中拥有多个屏幕并且需要忽略所有其他屏幕。 我推荐使用这个:
@Override
public void onBackPressed() {
finish();
}
【讨论】:
// Finish current activity
// Go back to previous activity or closes app if last activity
finish()
// Finish all activities in stack and app closes
finishAffinity()
// Takes you to home screen but app isnt closed
// Opening app takes you back to this current activity (if it hasnt been destroyed)
Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_HOME)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(this)
}
【讨论】:
在正常情况下,您不应该关闭应用程序 - 用户将通过按 home 或按返回关闭您的活动将其移至后面。
但您可以使用以下提示:
1) 如果后栈中不需要旧的activity,则在启动新的activity后关闭它们:
startActivity(newActivityIntent);
finish();
2) 如果您需要http://developer.android.com/reference/android/app/Activity.html#moveTaskToBack(boolean),您可以将任务移到后面(而不是关闭)
3) 如果你真的需要它,你可以使用System.exit(0),但它强烈不推荐,通常说你有应用程序的架构问题。
【讨论】:
科特林:
override fun onBackPressed() {
val exitIntent = Intent(Intent.ACTION_MAIN)
exitIntent.addCategory(Intent.CATEGORY_HOME)
exitIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(exitIntent)
}
其他代码有问题,有些不行,有些需要API分类。
【讨论】:
moveTaskToBack() 现在是Deprecated
使用:
moveTaskToBack(true);
【讨论】:
弹出
@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
.setTitle("Really Exit?")
.setMessage("Are you sure you want to exit?")
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
WelcomeActivity.super.onBackPressed();
}
}).create().show();
}
将 Class 设置为 App 顶部且无历史记录
Intent launchNextActivity;
launchNextActivity = new Intent(B.class, A.class);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
launchNextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(launchNextActivity);
在此处输入代码 双击后按
private static long back_pressed;
@Override
public void onBackPressed(){
if (back_pressed + 2000 > System.currentTimeMillis()){
super.onBackPressed();
}
else{
Toast.makeText(getBaseContext(), "Press once again to exit",
Toast.LENGTH_SHORT).show();
back_pressed = System.currentTimeMillis();
}
}
【讨论】:
只需在您的意图下使用代码finish(); 即可关闭活动。所以,它不会再出现。这解决了我的问题。
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
【讨论】:
您可以使用此代码退出应用程序。
@覆盖 public void onBackPressed()
{
finishAffinity();
System.exit(0);
}
【讨论】: