1

我的 Android 应用中有 8 个活动,我想要:

1)每次我在前 7 个活动中按返回按钮以返回到我以前的活动(Act1<Act2<Act3<Act4<Act5<Act6<Act7)但是

2)仅当我在第 8 个活动中时,我才绝对要退出我的 Android 应用程序并转到我手机的主屏幕。我尝试通过覆盖 onBackPressed method我的第 8 个活动(电话主屏幕<-Act8)来做到这一点

我找到了一个 Android 实现,我在其中插入finish();了所有 8 个活动的每个意图,但这不是我想要的,因为这样我就无法随时返回到上一个活动(finish();每个当前活动都从后台堆栈中删除) )。

请问我该怎么做?

到目前为止,我在第 8 次活动中的代码是:

            @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();

            }
4

5 回答 5

0

另一种方式:创建第 9 个活动并将其命名为 FinishAllActivity 或类似的名称。进行此活动调用finish(),然后返回其onCreate().

onBackPressed()活动 8 中,使用标志启动 FinishAllActivity FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK(有关更多详细信息,请参阅此问题)。Activity 1-8 将从堆栈中删除,然后第 9 个 Activity 将启动并立即终止,并且您的任务堆栈被清除。当您重新打开应用程序时,它应该从 Activity 1 开始。

这样做的好处是您不必修改活动 1-7。

于 2015-03-30T23:47:57.547 回答
0

您可以实现一个广播接收器,并让您想要关闭的每个活动在收到广播(将从您的最后一个活动发送)时调用 finish()。我想您需要将广播接收器类设为匿名内部类或活动中的私有类,以便您可以轻松访问封闭活动的完成方法。

这是广播接收器的一个很好的例子: http ://www.tutorialspoint.com/android/android_broadcast_receivers.htm

查看自定义意图部分。

这样做是一种松散耦合的方式来实现你想要做的事情。

于 2015-03-31T05:05:19.020 回答
0

将一个添加public static boolean到您的一个类中,表明该应用程序正在退出。当您希望应用程序完成时,在活动 8 中设置此布尔值,并让您的所有其他活动检查它onResume()并在它为真时立即完成。确保第一个活动在完成之前将其清除,否则它可能仍会在应用程序下次运行时设置。(当您的最后一个活动完成时,Android 不一定会丢弃 VM,因此下次可能会重用该类及其静态成员。)

请注意,这是简单的方式,而不是“Android 方式”。全局变量通常不受欢迎,原因你可以谷歌。执行此操作的“正确”方法是为结果启动每个活动并返回一个结果,以onActivityResult(...)指示应用程序是否正在退出。

于 2015-03-30T23:29:23.123 回答
0

在您的意图中使用FLAG_ACTIVITY_CLEAR_TOP标志,如下例所示。

 Intent intent = new Intent(getApplicationContext(),FirstActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  intent.putExtra("EXIT", true);
  startActivity(intent);

在您的第一个活动中检查以下条件。

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 调用 startActivity() 并带有解析为活动 B 的组件的 Intent,则 C 和 D 将完成并且 B 接收给定的 Intent,从而导致堆栈现在是:A,B。

所以在这里你必须调用D是你的最后一个活动,A是你的第一个活动。

于 2015-03-31T10:46:04.273 回答
-1

这样,您将完成您的第 8 个活动返回到您的第 7 个活动,同时您就像在设备上模拟按下 Home 按钮一样。当您重新运行您的应用程序时,它会在屏幕上显示第 7 个活动。如果您希望在这种情况下查看第 8 个活动,则只需删除该finish()方法。如果您希望下次您的应用程序从第一个 Activity 开始,那么您应该完成从 8 到 2 的所有 Activity,而不是第 1 个。您也可以添加 FLAG NEW_TASK 或其他一些标志来启动您的第一个活动。
更新
我的建议(为了在不改变工作流程的情况下获得快速结果)是用于startActivityForResult()启动链中的所有活动。当用户退出应用程序时,只需使用返回一个特殊参数setActivityResult()让所有嵌套活动了解用户的选择,使所有嵌套活动都运行finish()。这样,您的所有 8 项活动都将正确完成。

于 2015-03-30T22:10:00.767 回答