繁体   English   中英

如何从上一个活动中使用onBackPressed永久退出我的Android应用

[英]How will I permanently exit my Android app using onBackPressed from my last Activity

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

1)每次我在前7个活动中按返回按钮都会返回到上一个活动(Act1 <Act2 <Act3 <Act4 <Act5 <Act5 <Act6 <Act7)但

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

我找到了一个在其中插入finish();的Android实现finish(); 在我所有8个Activity的所有意图中,但这不是我想要的,因为这样一来,我就无法随时返回上一个Activity(带有finish();当前的每个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();

            }

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

请注意,这是简单的方法,而不是“ Android方法”。 由于您可以使用Google,因此通常不赞成使用全局变量。 执行此操作的“正确”方法是启动结果的每个活动,然后将结果返回到onActivityResult(...) ,以指示应用程序是否正在退出。

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

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

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

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

这是广播接收器的一个很好的例子: 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);

在您的第一次活动中检查以下情况。

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调用了一个具有解析为活动B组件的Intent的startActivity(),则C和D将完成,并且B收到给定的Intent,结果现在的堆栈是:A,B。

所以在这里您必须称呼D是您的最后一个活动,而A是您的第一个活动。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM