我如何使用上一个 Activity 中的 onBackPressed 永久退出我的 Android 应用程序
How will I permanently exit my Android app using onBackPressed from my last Activity
我的 Android 应用程序中有 8 个活动,我想要:
1)每次我在前 7 个活动中按返回按钮返回到我之前的 Activity(Act1< Act2< Act3< Act4< Act5< Act6< Act7) 但是
2)只有当我在第 8 个时 Activity 我想绝对退出我的 Android 应用程序并转到我的 phone 的主页 Screen.I 尝试通过在我的第 8 个 Activity(Phone 主屏幕<-Act8)
中覆盖 onBackPressed method
来实现
我找到了一个 Android 实现,我在其中插入了 finish();
我所有 8 个活动的每个意图 但这不是我想要的,因为这我无法随时返回到以前的 Activity(finish();
每个当前 Activity 都从后退堆栈中删除)。
请问我该怎么做?
到目前为止,我的第 8 个 Activity 代码是:
@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);
finish();
}
这样你就完成了第 8 次 Activity return 到第 7 次 Activity,同时你就像在设备上模拟按下主页按钮一样。当您重新运行 您的应用程序时,它将在屏幕上显示为第 7 Activity。如果您希望在这种情况下看到第 8 个 Activity,则只需删除 finish()
方法。如果您希望下次您的应用程序从 1st Activity 开始,那么您应该完成从 8 到 2 的所有活动,但不是第 1 个。您也可以启动第一个 Activity 添加 FLAG NEW_TASK 或其他一些标志。
更新
我的建议(为了在不改变工作流程的情况下快速获得结果)是使用 startActivityForResult()
启动链中的所有活动。当用户退出应用程序时,只需 return 使用 setActivityResult()
的特殊参数,让所有嵌套活动了解用户的选择,使所有嵌套活动变为 运行 finish()
。这样你的8个活动就可以正常完成了。
在您的其中一个 class 中添加一个 public static boolean
,表示该应用程序正在退出。当您希望应用程序完成时,在 activity 8 中设置此布尔值,并让所有其他活动在其 onResume()
中检查它,如果为真,则立即完成。确保第一个 activity 在完成之前清除它,否则它可能在下次应用程序运行时仍被设置。 (Android 不一定会在您的最后一个 activity 完成时丢弃 VM,因此下次 class 及其静态成员可能会被重用。)
请注意,这是简单的方法,而不是 "Android way." 全局变量通常不受欢迎,原因可以 Google。 "correct" 方法是启动每个 activity 的结果和 return 到 onActivityResult(...)
的结果,指示应用程序是否正在退出。
另一种方法:创建第 9 个 Activity 并将其命名为 FinishAllActivity 或类似名称。使此 activity 调用 finish()
,然后在其 onCreate()
.
中调用 return
在 Activity 8 中的 onBackPressed()
中,使用 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK
标志启动 FinishAllActivity(有关详细信息,请参阅 this question)。活动 1-8 将从堆栈中移除,然后第 9 个 Activity 将开始并立即终止,您的任务堆栈将被清除。当您重新打开应用程序时,它应该从 Activity 1.
开始
这样做的好处是您不必修改活动 1-7。
您可以实现一个广播接收器,并让您想要关闭的每个 Activity 在收到广播(将从您的最后一个 activity 发送)时调用 finish()。我想你需要让你的广播接收器 class 是一个匿名的内部 class 或者你的 activity(s) 中的私有 class 这样你就可以轻松地访问封闭的 Activity 的完成方法。
下面是广播接收器的一个很好的例子:
http://www.tutorialspoint.com/android/android_broadcast_receivers.htm
查看自定义意图部分。
这样做是一种松散耦合的方式来实现您想要做的事情。
在您的意图中使用 FLAG_ACTIVITY_CLEAR_TOP 标记,如下例所示。
Intent intent = new Intent(getApplicationContext(),FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
在您的第一个 activity 中检查以下条件。
if (getIntent().getBooleanExtra("EXIT", false)) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
finish();
}
这里 FLAG_ACTIVITY_CLEAR_TOP 像下面的例子一样工作
考虑一个由活动组成的任务:A、B、C、D。如果 D 使用解析为 activity B 的组件的 Intent 调用 startActivity(),则 C 和 D 将完成和 B 收到给定的 Intent,导致堆栈现在为:A,B。
所以在这里你必须调用 D 是你的最后一个 activity 并且 A 是你的第一个 activity .
我的 Android 应用程序中有 8 个活动,我想要:
1)每次我在前 7 个活动中按返回按钮返回到我之前的 Activity(Act1< Act2< Act3< Act4< Act5< Act6< Act7) 但是
2)只有当我在第 8 个时 Activity 我想绝对退出我的 Android 应用程序并转到我的 phone 的主页 Screen.I 尝试通过在我的第 8 个 Activity(Phone 主屏幕<-Act8)
中覆盖onBackPressed method
来实现
我找到了一个 Android 实现,我在其中插入了 finish();
我所有 8 个活动的每个意图 但这不是我想要的,因为这我无法随时返回到以前的 Activity(finish();
每个当前 Activity 都从后退堆栈中删除)。
请问我该怎么做?
到目前为止,我的第 8 个 Activity 代码是:
@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);
finish();
}
这样你就完成了第 8 次 Activity return 到第 7 次 Activity,同时你就像在设备上模拟按下主页按钮一样。当您重新运行 您的应用程序时,它将在屏幕上显示为第 7 Activity。如果您希望在这种情况下看到第 8 个 Activity,则只需删除 finish()
方法。如果您希望下次您的应用程序从 1st Activity 开始,那么您应该完成从 8 到 2 的所有活动,但不是第 1 个。您也可以启动第一个 Activity 添加 FLAG NEW_TASK 或其他一些标志。
更新
我的建议(为了在不改变工作流程的情况下快速获得结果)是使用 startActivityForResult()
启动链中的所有活动。当用户退出应用程序时,只需 return 使用 setActivityResult()
的特殊参数,让所有嵌套活动了解用户的选择,使所有嵌套活动变为 运行 finish()
。这样你的8个活动就可以正常完成了。
在您的其中一个 class 中添加一个 public static boolean
,表示该应用程序正在退出。当您希望应用程序完成时,在 activity 8 中设置此布尔值,并让所有其他活动在其 onResume()
中检查它,如果为真,则立即完成。确保第一个 activity 在完成之前清除它,否则它可能在下次应用程序运行时仍被设置。 (Android 不一定会在您的最后一个 activity 完成时丢弃 VM,因此下次 class 及其静态成员可能会被重用。)
请注意,这是简单的方法,而不是 "Android way." 全局变量通常不受欢迎,原因可以 Google。 "correct" 方法是启动每个 activity 的结果和 return 到 onActivityResult(...)
的结果,指示应用程序是否正在退出。
另一种方法:创建第 9 个 Activity 并将其命名为 FinishAllActivity 或类似名称。使此 activity 调用 finish()
,然后在其 onCreate()
.
在 Activity 8 中的 onBackPressed()
中,使用 FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK
标志启动 FinishAllActivity(有关详细信息,请参阅 this question)。活动 1-8 将从堆栈中移除,然后第 9 个 Activity 将开始并立即终止,您的任务堆栈将被清除。当您重新打开应用程序时,它应该从 Activity 1.
这样做的好处是您不必修改活动 1-7。
您可以实现一个广播接收器,并让您想要关闭的每个 Activity 在收到广播(将从您的最后一个 activity 发送)时调用 finish()。我想你需要让你的广播接收器 class 是一个匿名的内部 class 或者你的 activity(s) 中的私有 class 这样你就可以轻松地访问封闭的 Activity 的完成方法。
下面是广播接收器的一个很好的例子: http://www.tutorialspoint.com/android/android_broadcast_receivers.htm
查看自定义意图部分。
这样做是一种松散耦合的方式来实现您想要做的事情。
在您的意图中使用 FLAG_ACTIVITY_CLEAR_TOP 标记,如下例所示。
Intent intent = new Intent(getApplicationContext(),FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
在您的第一个 activity 中检查以下条件。
if (getIntent().getBooleanExtra("EXIT", false)) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
finish();
}
这里 FLAG_ACTIVITY_CLEAR_TOP 像下面的例子一样工作
考虑一个由活动组成的任务:A、B、C、D。如果 D 使用解析为 activity B 的组件的 Intent 调用 startActivity(),则 C 和 D 将完成和 B 收到给定的 Intent,导致堆栈现在为:A,B。
所以在这里你必须调用 D 是你的最后一个 activity 并且 A 是你的第一个 activity .