从任何活动完成应用程序

时间:2016-05-03 14:02:12

标签: android android-activity

我想从导航抽屉上的退出按钮中删除我的应用。抽屉有一个退出按钮,假设只是杀死整个应用程序(所有活动)并让用户退出应用程序。

当我在第一个活动中使用finish()时它正在工作但当我进入应用程序并致电finish()时,活动被杀死并返回到之前的活动但从未真正杀死该应用程序。

试图使用System.exit(0)但没有运气。

额外信息可能会提供帮助

我的所有活动都以android:launchMode="singleTop"开头。这意味着所有已经创建的活动都不会再创建,只是在调用时重新排序。

有人对此有任何建议,请帮助。

更新

我想在这里做一些更新,因为我的问题看起来像this SO问题。

正如我已经说过我正在使用android:launchMode="singleTop"。这个答案对我的案子不起作用。我必须调用onCreate()来实现这一点,但这不是我的情况。

5 个答案:

答案 0 :(得分:2)

使用以下代码

public void AppExit()
    {
        this.finish();
        Intent intent= new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
        System.exit(0);
    }

调用上述功能退出App。

答案 1 :(得分:1)

首先,您需要决定是否只需要将用户从应用中删除,或者是否还需要finish()所有活动。这取决于您的需求,但我的猜测是,在大多数情况下,大多数用户都不会知道差异,Android的目的是让许多应用程序仍在运行。如果这就是您所需要的,那么您可以使用Intent将用户带到主屏幕。

Intent intent = new Intent(Intent.
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

如果您确实希望finish()您的活动,那么您需要一种机制来通知用户正在退出应用的所有当前正在运行的活动。您可以使用EventBus之类的内容发送将由所有注册用户接收的活动;如果您不想使用第三方库,则可以使用LocalBroadcastManager执行相同类型的操作。为此,您可以使用IntentFilter注册BroadcastReceiver进行自定义操作,并在用户想要退出时使用该操作广播Intent。

在任何一种情况下,每个活动都应接收信号并自行呼叫finish()。请注意,订阅(在EventBus情况下)或接收者注册(在LocalBroadcastManager情况下)必须在onStop()之后仍然有效,因此我将在onCreate()中注册并在{{1}中取消注册}。

答案 2 :(得分:0)

在退出按钮中使用以下代码

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

并且,在您的ActivityOne.class oncreate()方法中,只需添加以下代码

即可
if (getIntent().getBooleanExtra("EXIT", false)) 
{
    finish();
}

答案 3 :(得分:0)

首先,Android应用程序并不打算被系统杀死,系统试图将它们保留在内存中,以防用户返回。

但是,如果你必须这样做,试试这个:

android.os.Process.killProcess(android.os.Process.myPid());

答案 4 :(得分:0)

如同几个答案所说,请致电完成();从活动开始一个意图后。这将确保当前活动是唯一的运行活动。还可以尝试使用super.finish(),它将在父活动中调用finish()。

您也可以只使用一个包含许多片段的活动。这样,如果您在退出按钮OnClickListener代码中调用finish(),您将退出该应用程序。这也将节省大量编码,因为您将定义导航抽屉一次。