如何以编程方式退出android应用程序

时间:2011-06-13 12:08:11

标签: android

我找到了一些以编程方式退出Android应用程序的代码。通过在onDestroy()中调用以下任何一个代码,它会完全退出应用程序吗?

  1. System.runFinalizersOnExit(true)
                (OR)
  2. android.os.Process.killProcess(android.os.Process.myPid());
  3. 点击退出按钮后,我不想在后台运行我的应用程序。 请问我可以使用这些代码中的任何一个来退出我的应用程序吗?如果可以,我可以使用哪些代码?这是退出Android应用程序的好方法吗?

34 个答案:

答案 0 :(得分:333)

从API 16开始,您可以使用finishAffinity方法,该方法似乎非常接近按名称和Javadoc描述关闭所有相关活动:

<强> this.finishAffinity();

  

完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动。这通常在应用程序可以启动到另一个任务(例如来自它理解的内容类型的ACTION_VIEW)并且用户使用向上导航切换出当前任务并进入其自己的任务时使用。在这种情况下,如果用户已导航到第二个应用程序的任何其他活动,则应将所有这些活动作为任务切换的一部分从原始任务中删除。

     

请注意,此结尾不允许您将结果传递给上一个活动,如果您尝试这样做,则会抛出异常。


自API 21起,您可以使用非常相似的命令

<强> finishAndRemoveTask();

  

完成此任务中的所有活动,并将其从最近的任务列表中删除。

答案 1 :(得分:145)

getActivity().finish();
System.exit(0);

这是退出应用的最佳方式。!!!

对我来说是最好的解决方案。

答案 2 :(得分:31)

如果您确实需要杀死该应用程序,请认真考虑:为什么不让OS找出何时何地释放资源?

否则,如果您非常确定,请使用

finish();

作为对@dave appleton评论的反应:首先阅读了大问题/答案组合@gabriel发布:Is quitting an application frowned upon?

现在假设我们有这个问题,这里的问题仍然有一个答案,就是如果你正在做任何退出的事情你需要的代码是finish()。显然你可以有不止一个活动等等,但这不是重点。让一些用例运行

  1. 你想让用户因为内存使用和“不在后台运行而退出所有东西?Doubtfull。让用户在后台停止某些活动,但让操作系统杀掉任何不需要的资源。”
  2. 您希望用户不转到您应用的上一个活动?好吧,要么配置它没有,要么你需要一个额外的选项。如果back = previous-activity的大部分时间都有效,那么如果他/她想要做其他事情,用户是否只会按回家?
  3. 如果您需要某种重置,您可以查看您的应用程序是否/如何/等退出,如果您的活动再次获得焦点,您可以对此采取措施,显示一个新屏幕,而不是重新启动您所在的位置。
  4. 所以最后,当然,finish()并没有杀死它,但它仍然是你需要的工具。如果有“杀死所有活动”的用例,我还没有找到它。

答案 3 :(得分:31)

finishAffinity();

System.exit(0);

如果您只使用finishAffinity();而不使用System.exit(0);,您的应用程序将退出,但分配的内存仍将被您的手机使用,所以...如果您想干净并且真的退出应用程序,使用它们。

这是最简单的方法,可以在任何地方使用,退出应用程序是真实的,你可以打开很多活动仍然可以放弃所有没有问题。

单击按钮上的示例

public void exitAppCLICK (View view) {

    finishAffinity();
    System.exit(0);

}

或者如果你想要一些不错的东西,例如带有3个按钮的警告对话框是NO NO和CANCEL

// alertdialog for exit the app
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set the title of the Alert Dialog
alertDialogBuilder.setTitle("your title");

// set dialog message
alertDialogBuilder
        .setMessage("your message")
        .setCancelable(false)
        .setPositiveButton("YES"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // what to do if YES is tapped
                        finishAffinity();
                        System.exit(0);
                    }
                })

        .setNeutralButton("CANCEL"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on CANCEL tapped
                        dialog.cancel();
                    }
                })

        .setNegativeButton("NO"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on NO tapped
                        dialog.cancel();
                    }
                });

AlertDialog alertDialog = alertDialogBuilder.create();

alertDialog.show();

答案 4 :(得分:19)

我认为应用程序应该在某些情况下被杀死。例如,有一个应用程序只能在登录后使用。登录活动有两个按钮,“登录”和“取消”。当您单击“取消”按钮时,它肯定意味着“终止应用程序”。没有人希望应用程序在后台运行。所以我同意某些情况需要关闭应用程序。

答案 5 :(得分:18)

Android中没有应用程序退出, SampleActivity.this.finish();将完成当前的活动。

当您从一个活动切换到另一个活动时,请完成前一个活动

Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class);
startActivity(homeintent);
SampleActivity.this.finish();

答案 6 :(得分:12)

创建一个export default class Child extends React.Component{ sendData(false){ this.props.handleChange(hello) //make sure to pass the value in the argument that you wish to do a setState on in the parent component } } 并在清单中声明它。并致电ExitActivity以退出应用。

ExitActivity.exit(context)

答案 7 :(得分:8)

如果您在 sprintf(cChar1, "t1: %lu; t2: %lu;", (unsigned long)t1, (unsigned long)t2); sprintf(cChar2, "t1: %u; t2: %u;", (unsigned int)t1, (unsigned int)t2); sprintf(cChar3, "t1: %hu; t2: %hu;", (unsigned short)t1, (unsigned short)t2); sprintf(cChar4, "t3: %lu; t4: %lu; t5: %lu;", (unsigned long)t3, (unsigned long)t4, (unsigned long)t5); ,则最好使用finish();如果您在Activity,则最好使用getActivity().finish()

如果您想完全退出应用,请使用:

Fragment

答案 8 :(得分:8)

这取决于您关闭应用的速度。

关闭应用的安全方法是 finishAffinity();

在所有流程完成处理后,它会关闭您的app。 这可能需要一些时间。 如果以这种方式关闭应用程序,并在短时间后重新启动它,则新应用程序可能在同一进程中运行。使用旧应用程序的所有未完成的进程和单例对象。

如果您想确定您的应用已完全关闭,请使用 System.exit(0);

这将立即关闭您的应用。 但是,您可能会损坏应用程序已打开的文件或共享首选项上的编辑未完成。所以要小心使用它。

如果将看门狗与长时间运行的任务结合使用,您可以看到不同方法的影响。

new ANRWatchDog(2000).setANRListener(new ANRWatchDog.ANRListener() {
    public void onAppNotResponding(ANRError error) {
        MainActivity.this.finishAffinity();
        System.exit(0);
    }
}).start();
for(int i = 0; i < 10; ++i){
    --i;
}

这会在2秒后杀死您的应用,而不显示ANR对话框或类似内容。如果您删除 System.exit(0),运行此代码并在关闭后重新启动应用程序,您将遇到一些奇怪的行为,因为无限循环仍在运行。

答案 9 :(得分:8)

您可以使用API​​ 21中的finishAndRemoveTask ()

  

public void finishAndRemoveTask()

     

完成此任务中的所有活动,并将其从最近的任务列表中删除。

答案 10 :(得分:7)

首先,这种方法需要min Api 16。

我将此解决方案分为3个部分,以便更广泛地解决这个问题。

1。如果您想在活动中退出应用,请使用以下代码段:

if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
            finishAffinity();
        } else if(Build.VERSION.SDK_INT>=21){
            finishAndRemoveTask();
        }

2。如果您想退出有权访问Activity的非活动类中的应用,请使用以下代码段:

    if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
                getActivity().finishAffinity();
            } else if(Build.VERSION.SDK_INT>=21){
                getActivity().finishAndRemoveTask();
            }

3. 如果要退出非Activity类中的应用程序而无法访问Service等活动,我建议您使用BroadcastReceiver。您可以将此方法添加到项目中的所有活动中。

创建LocalBroadcastManager和BroadcastReceiver实例变量。如果需要,可以替换getPackageName()+“。closeapp”。

LocalBroadcastManager mLocalBroadcastManager;
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(getPackageName()+".closeapp")){
            if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
                finishAffinity();
            } else if(Build.VERSION.SDK_INT>=21){
                finishAndRemoveTask();
            }
        }
    }
};

将这些添加到Activity的onCreate()方法。

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    IntentFilter mIntentFilter = new IntentFilter();
    mIntentFilter.addAction(getPackageName()+".closeapp");
    mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);

另外,不要忘记在Activity

的onDestroy()方法中调用取消注册接收器
    mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);

对于退出应用程序,您必须使用我在PlayService类中使用的LocalBroadcastManager发送广播,该类扩展了服务。

  LocalBroadcastManager localBroadcastManager = LocalBroadcastManager
                                .getInstance(PlayService.this);
                        localBroadcastManager.sendBroadcast(new Intent(
                                getPackageName() + ".closeapp"));

答案 11 :(得分:6)

我不确定这是不是不赞成,但这就是我这样做的方式......

第1步 - 我通常有一个包含我想要全局访问的方法和变量的类。在这个例子中,我将其称为“App”类。在应用程序具有的每个活动的类中创建一个静态Activity变量。然后创建一个名为“close”的静态方法,该方法将在每个活动变量上运行finish()方法,如果它们不为空。如果您有主要/父级活动,请最后关闭它:

public class App
{
    ////////////////////////////////////////////////////////////////
    // INSTANTIATED ACTIVITY VARIABLES
    ////////////////////////////////////////////////////////////////

        public static Activity activity1;
        public static Activity activity2;
        public static Activity activity3;

    ////////////////////////////////////////////////////////////////
    // CLOSE APP METHOD
    ////////////////////////////////////////////////////////////////

        public static void close()
        {
            if (App.activity3 != null) {App.activity3.finish();}
            if (App.activity2 != null) {App.activity2.finish();}
            if (App.activity1 != null) {App.activity1.finish();}
        }
}
在您的每项活动中

第2步 - ,覆盖onStart()onDestroy()方法。在onStart()中,将App类中的静态变量设置为“this”。在onDestroy()中,将其设置为null。例如,在“Activity1”类中:

@Override
public void onStart()
{
    // RUN SUPER | REGISTER ACTIVITY AS INSTANTIATED IN APP CLASS

        super.onStart();
        App.activity1 = this;
}

@Override
public void onDestroy()
{
    // RUN SUPER | REGISTER ACTIVITY AS NULL IN APP CLASS

        super.onDestroy();
        App.activity1 = null;
}

第3步 - 当您想要关闭应用时,只需从任意位置拨打App.close()即可。所有实例化的活动都将关闭!由于您只是关闭活动而不是杀死应用程序本身(如您的示例所示),因此Android可以从那里接管并进行任何必要的清理。

同样,我不知道这是否会因任何原因而不受欢迎。如果是这样,我很乐意阅读有关它为何以及如何改进的评论!

答案 12 :(得分:5)

如果您想关闭您的应用:

对于 API >= 21,使用:

finishAndRemoveTask();

对于 API < 21 使用:

finishAffinity();

答案 13 :(得分:5)

从应用程序退出的简单方法

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);

答案 14 :(得分:5)

public void quit() {
        int pid = android.os.Process.myPid();
        android.os.Process.killProcess(pid);
        System.exit(0);
    }

答案 15 :(得分:5)

我认为你在寻找的是

activity.moveTaskToBack(Boolean nonRoot);

答案 16 :(得分:4)

Is quitting an application frowned upon?。浏览此链接。它回答了你的问题。系统完成了杀死应用程序的工作。

假设您有两个活动A和B.您从A导航到B.当您单击后退按钮时,您的活动B将从后台堆叠中弹出并销毁。后堆栈活动A中的先前活动需要关注。

您应该将其留给系统来决定何时终止该应用程序。

public void finish()

在您的活动完成后调用此选项并应关闭。

假设您有很多活动。你可以使用动作栏。点击主页图标naviagate到你的应用程序的MainActivity。在MainActivity中,单击后退按钮退出应用程序。

答案 17 :(得分:3)

要退出应用程序,可以使用以下命令:

getActivity().finish();
Process.killProcess(Process.myPid());
System.exit(1);

也要停止服务,请调用以下方法:

private void stopServices() {        
    final ActivityManager activityManager = SystemServices.getActivityManager(context);
    final List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
    final int pid = Process.myPid();
    for (ActivityManager.RunningServiceInfo serviceInfo : runningServices) {
        if (serviceInfo.pid == pid && !SenderService.class.getName().equals(serviceInfo.service.getClassName())) {
            try {
                final Intent intent = new Intent();
                intent.setComponent(serviceInfo.service);
                context.stopService(intent);
            } catch (SecurityException e) { 
                 // handle exception
            }
        }
    }
}

答案 18 :(得分:2)

这可能是非常晚的,并且根据指导原则,您不应该自己处理生命周期过程(因为操作系统会为您执行此操作)。建议您在所有活动中使用“finish()”注册广播接收器onReceive()&amp;无论何时你想戒掉,你都可以简单地传递一个表明所有活动必须关闭的意图..... 虽然请确保在onDestroy()方法中“取消注册”接收器。

答案 19 :(得分:2)

这不是一个好的决定,因为它违反了Android的应用程序处理原则。 Android不会杀死任何进程,除非它绝对是不可避免的。这可以帮助应用程序更快地启动,因为它们始终保存在内存中。因此,您需要一个非常特殊的理由来终止您的应用程序。

答案 20 :(得分:2)

朋友只需添加此功能即可以编程方式退出应用程序 #java

logger.debug

答案 21 :(得分:2)

我们希望代码既健壮又简单。 此解决方案适用于旧设备和新设备。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        getActivity().finishAffinity();
    } else{
        getActivity().finish();
        System.exit( 0 );
    }

答案 22 :(得分:1)

按钮点击 退出应用的正确而准确的解决方案正在使用以下代码:

//按钮返回按下事件

public void onBackPressed()
{ 
   moveTaskToBack(true);
   finish();
}

答案 23 :(得分:0)

我发现从活动中退出应用程序的最简单方法是在不破坏Android的逻辑且不在现有活动中添加更多代码并传递额外内容的情况下如下:

public static void quitApplication (Activity currentActivity) {
    Intent intent = new Intent (currentActivity, QuitApplicationActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    currentActivity.startActivity (intent);
    currentActivity.finish ();
}

QuitApplicationActivity正在:

public class QuitApplicationActivity extends AppCompatActivity {

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);

        finish ();
    }
}

答案 24 :(得分:0)

试试这个

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);

答案 25 :(得分:0)

来自您的顶级活动:

super.onBackPressed();

答案 26 :(得分:0)

只需在终止应用程序的残酷方法列表中添加一个即可:

Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);

答案 27 :(得分:0)

这会杀死任何东西;)

int p = android.os.Process.myPid();
android.os.Process.killProcess(p);

答案 28 :(得分:0)

@Sivi的答案将关闭应用程序。但返回时,如果您有一些子活动,则可能会打开另一个未完成的活动。我将noHistory:true添加到了我的活动中,因此返回时的应用程序从MainActivity启动。

<activity 
      android:name=".MainActivity"
      android:noHistory="true">
</activity>

答案 29 :(得分:0)

如果您使用的是Kotlin,则退出该应用并替代System.exit()的正确方法是内置方法

exitProcess(0)

请参见documentation

以数字0作为参数表示要退出,并且没有发生错误。

答案 30 :(得分:0)

类似于@MobileMateo,但位于科特林

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    this.finishAffinity()
} else{
    this.finish()
    System.exit(0)
}

答案 31 :(得分:-1)

您可以退出完整的应用。因此

Intent intent = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

它将100%工作。祝你好运!

答案 32 :(得分:-4)

只需在背键上使用finish()按onKeypressed()

答案 33 :(得分:-4)

将此代码写入您的onbackpressed覆盖方法

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