How to quit android application programmatically
我找到了一些以编程方式退出Android应用程序的代码。 通过在onDestroy()中调用以下任何一个代码,它会完全退出应用程序吗?
(要么)
我不想在单击退出按钮后在后台运行我的应用程序。
请问我可以使用这些代码中的任何一个来退出我的应用程序吗? 如果可以,我可以使用哪些代码? 这是退出Android应用程序的好方法吗?
从API 16开始,您可以使用finishAffinity方法,该方法似乎非常接近通过其名称和Javadoc描述关闭所有相关活动:
this.finishAffinity();
Finish this activity as well as all activities immediately below it in the current task that have the same affinity. This is typically used when an application can be launched on to another task (such as from an ACTION_VIEW of a content type it understands) and the user has used the up navigation to switch out of the current task and into its own task. In this case, if the user has navigated down into any other activities of the second application, all of those should be removed from the original task as part of the task switch.
Note that this finish does not allow you to deliver results to the previous activity, and an exception will be thrown if you are trying to do so.
从API 21开始,您可以使用非常相似的命令
finishAndRemoveTask();
Finishes all activities in this task and removes it from the recent tasks list.
1 2 | getActivity().finish(); System.exit(0); |
这是退出应用程序的最佳方式。!!!
对我来说最好的解决方案。
如果您只使用
这是最简单的方法,可以在任何地方使用,退出应用程序真实,你可以打开很多活动仍然可以放弃所有没有问题。
单击按钮时的示例
1 2 3 4 5 6 | public void exitAppCLICK (View view) { finishAffinity(); System.exit(0); } |
或者如果你想要一些不错的东西,例如带有3个按钮的警告对话框是NO和CANCEL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | // 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(); |
如果你确实需要杀死应用程序,请认真考虑:为什么不让OS找出何时何地释放资源?
否则,如果你真的很确定,请使用
1 | finish(); |
作为对@dave appleton评论的反应:第一件事是读了大问题/答案组合@gabriel发布:退出一个应用程序不赞成?
现在假设我们已经有了这个问题,这里的问题仍然有一个答案,就是如果你正在做任何退出的事情你需要的代码是
所以最后,当然,
我认为在某些情况下应用程序应该是kill。例如,有一个应用程序只能在登录后使用。登录活动有两个按钮,"登录"和"取消"。当您单击"取消"按钮时,它肯定意味着"终止应用程序"。没有人希望应用程序在后台运行。所以我同意某些情况需要关闭应用程序。
android中没有应用程序退出,
SampleActivity.this.finish();将完成当前的活动。
当您从一个活动切换到另一个活动时,请完成前一个活动
1 2 3 | Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class); startActivity(homeintent); SampleActivity.this.finish(); |
创建一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class ExitActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); finish(); } public static void exit(Context context) { Intent intent = new Intent(context, ExitActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); } } |
这取决于您想要关闭应用的速度。
关闭应用程序的一种安全方法是finishAffinity();
在所有流程完成处理后,它会关闭您的app。
这可能需要一些时间。
如果以这种方式关闭应用程序,并在短时间后重新启动它,则新应用程序可能在同一进程中运行。使用旧应用程序的所有未完成的进程和单例对象。
如果你想确定,你的应用程序是完全关闭使用System.exit(0);
这将立即关闭您的应用程序。
但是,您可能会损坏应用程序已打开的文件或共享首选项上的编辑未完成。所以要小心使用。
如果将watchdog与长时间运行的任务结合使用,则可以看到不同方法的影响。
1 2 3 4 5 6 7 8 9 | 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),运行此代码并在关闭后重新启动应用程序,您将遇到一些奇怪的行为,因为无限循环仍在运行。
您可以使用API?? 21中的
public void finishAndRemoveTask ()
Finishes all activities in this task and removes it from the recent tasks list.
如果你在
如果您想完全退出应用程序,请使用:
1 2 | getActivity().finish(); System.exit(0); |
首先,这种方法需要最小Api 16。
我将此解决方案分为3个部分,以更广泛地解决这个问题。
1.如果要在活动中退出应用程序,请使用以下代码段:
1 2 3 4 5 | if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){ finishAffinity(); } else if(Build.VERSION.SDK_INT>=21){ finishAndRemoveTask(); } |
2.如果要退出具有Activity访问权限的非Activity类中的应用程序,请使用以下代码段:
1 2 3 4 5 | 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"。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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()方法中。
1 2 3 4 | mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(getPackageName()+".closeapp"); mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter); |
另外,不要忘记在Activity的onDestroy()方法中调用unregister接收器
1 | mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver); |
对于退出应用程序,您必须使用我在PlayService类中使用的LocalBroadcastManager发送广播,该类扩展了Service。
1 2 3 4 | LocalBroadcastManager localBroadcastManager = LocalBroadcastManager .getInstance(PlayService.this); localBroadcastManager.sendBroadcast(new Intent( getPackageName() +".closeapp")); |
从应用程序退出的简单方法
1 2 3 4 | Intent homeIntent = new Intent(Intent.ACTION_MAIN); homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(homeIntent); |
1 2 3 4 5 | public void quit() { int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); System.exit(0); } |
我不确定这是不是不赞成,但这就是我这样做的方式......
第1步 - 我通常有一个包含我想要全局访问的方法和变量的类。在这个例子中,我将其称为"App"类。在应用程序具有的每个活动的类中创建一个静态Activity变量。然后创建一个名为"close"的静态方法,如果它们不为null,将在每个Activity变量上运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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步 - 在每个活动中,覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @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步 - 当您想关闭应用时,只需从任何地方拨打
同样,我不知道这是否会因任何原因而不受欢迎。如果是这样,我很乐意阅读有关它为什么以及如何改进的评论!
我认为你在寻找的是这个
1 | activity.moveTaskToBack(Boolean nonRoot); |
退出申请是不是很害怕?浏览此链接。它回答了你的问题。系统完成了杀死应用程序的工作。
假设您有两个活动A和B.您从A导航到B.当您单击后退按钮时,您的活动B将从后台堆叠中弹出并销毁。后堆栈活动A中的先前活动需要关注。
您应该将其留给系统来决定何时终止该应用程序。
public void
在您的活动完成后调用此选项并应关闭。
假设你有很多活动。你可以使用动作栏。点击主页图标naviagate到你的应用程序的MainActivity。在MainActivity中单击后退按钮以退出应用程序。
要退出应用程序,您可以使用以下内容:
1 2 3 | getActivity().finish(); Process.killProcess(Process.myPid()); System.exit(1); |
同样要停止服务也请调用以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 } } } } |
我们希望代码强大而简单。
此解决方案适用于旧设备和较新设备。
1 2 3 4 5 6 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { getActivity().finishAffinity(); } else{ getActivity().finish(); System.exit( 0 ); } |
这可能是非常晚的,并且根据指导原则,您不应该自己处理生命周期过程(因为操作系统会为您执行此操作)。建议您在所有活动中使用"
虽然请确保在
这不是一个好的决定,因为它违反了Android的应用程序处理原则。 Android不会杀死任何进程,除非它绝对是不可避免的。这可以帮助应用程序更快地启动,因为它们始终保存在内存中。因此,您需要一个非常特殊的理由来终止您的应用程序。
与@MobileMateo类似,但在Kotlin中
1 2 3 4 5 6 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { this.finishAffinity() } else{ this.finish() System.exit(0) } |
按钮点击退出应用程序的正确和准确的解决方案是使用以下代码:
// On按钮返回按下事件
1 2 3 4 5 | public void onBackPressed() { moveTaskToBack(true); finish(); } |
如果您正在使用Kotlin,退出应用程序和
1 | exitProcess(0) |
请参阅文档。
作为参数的数字
@Sivi的回答关闭了应用程序。但回来后,如果你有一些儿童活动,可能会打开另一个未完成的活动。我在活动中添加了
1 2 3 4 | <activity android:name=".MainActivity" android:noHistory="true"> </activity> |
这会杀死任何东西;)
1 2 | int p = android.os.Process.myPid(); android.os.Process.killProcess(p); |
试试这个
1 2 | int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); |
我发现从活动中退出应用程序的最简单方法,不破坏Android的逻辑,并且不在现有活动中添加更多代码并传递额外内容,如下所示:
1 2 3 4 5 6 7 | 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 (); } |
1 2 3 4 5 6 7 8 9 | public class QuitApplicationActivity extends AppCompatActivity { @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); finish (); } } |
只是在终止应用程序的残酷方法列表中添加一个:
你可以退出完整的应用程序。从而
1 2 3 4 | Intent intent = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); |
它将100%工作。祝你好运!
在您的onbackpressed覆盖方法中编写此代码
1 2 3 4 5 6 7 | @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()按onKeypressed()