如何以编程方式退出android应用程序
我发现了一些代码,以编程方式退出Android应用程序。 通过在onDestroy()中调用以下任何一个代码,它会完全退出应用程序吗?
System.runFinalizersOnExit(true)
(要么)-
android.os.Process.killProcess(android.os.Process.myPid());
点击退出按钮后,我不想在后台运行我的应用程序。 请建议我可以使用这些代码中的任何一个退出我的应用程序? 如果是的话,我可以使用哪些代码? 在Android中退出应用程序的好方法是什么?
由于API 16,你可以使用finishAffinity方法,这似乎是非常接近所有相关的活动,其名称和javadoc描述:
this.finishAffinity();
在当前任务中完成此活动以及紧接其下的所有活动中具有相同亲和力的活动。 这通常用于应用程序可以启动到另一个任务(例如从可理解的内容类型的ACTION_VIEW),用户已经使用向上导航切换出当前任务并进入自己的任务。 在这种情况下,如果用户已经导航到第二个应用程序的任何其他活动,那么所有这些应该作为任务切换的一部分从原始任务中移除。
请注意,此结束不允许您将结果传递到上一个活动,如果您正在尝试这样做,则会抛出异常。
由于API 21,你可以使用一个非常类似的命令
finishAndRemoveTask();
完成此任务中的所有活动并将其从最近的任务列表中删除。
getActivity().finish(); System.exit(0);
这是退出您的应用程序的最佳途径。
对我来说最好的解决方案。
如果你真的需要杀死这个应用程序,请真的想一想:为什么不让OS知道何时何地释放资源?
否则,如果你真的确定,使用
finish();
作为对@dave的回应appleton的评论:首先阅读大问题/答案组合@gabriel发布: 正在退出一个应用程序皱起了眉头?
现在假设我们有这个问题,这里的问题仍然有一个答案,因为如果你正在做什么,你需要的代码是finish()
。 显然你可以有多个活动等等,但这不是重点。 让我们运行一些用例
- 你想让用户因为内存的使用而放弃一切,“不在后台运行”,让用户在后台停止某些活动,而让操作系统杀死任何不需要的资源。
- 你想要一个用户不去你的应用程序的以前的活动? 那么,要么配置它,否则,你需要一个额外的选择。 如果大多数时候back = previous-activity起作用,那么用户如果想要做别的事情就不会把他们压在家里呢?
- 如果你需要某种重置,你可以找出你的应用程序是否被退出,如果你的活动重新获得焦点,你可以采取行动,显示一个新的屏幕,而不是重新启动你的位置。
所以最后,当然, finish()
并不会杀死它,但它仍然是你所需要的工具。 如果有“杀死所有活动”的用例,我还没有找到它。
Android中没有应用程序退出 ,SampleActivity.this.finish(); 将完成当前的活动。
当你从一个活动切换到另一个时,继续完成前一个活动
Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class); startActivity(homeintent); SampleActivity.this.finish();
我认为在某些情况下应用程序应该被杀死。 例如,有一个应用程序只能在登录后才能使用。 登录活动有两个按钮,“登录”和“取消”。 当你点击“取消”按钮,它肯定意味着“终止应用程序”。 没有人希望在后台活着的应用程序。 所以我同意有些情况下需要关闭应用程序。
我不知道这是不是被折磨了,但是这是我怎么做的…
第1步 –我通常有一个包含我想要全局访问的方法和变量的类。 在这个例子中,我将其称为“App”类。 为类中的每个活动创建一个静态的Activity变量。 然后创建一个名为“close”的静态方法, 如果这些Activity变量不为空,它们将对每个Activity变量运行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可以自由接管并执行任何必要的清理。
再一次,我不知道这是否会因为任何原因而皱起眉头。 如果是这样,我很乐意阅读为什么它是如何改进的意见!
我觉得你要找的是这个
activity.moveTaskToBack(Boolean nonRoot);
public void quit() { int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); System.exit(0); }
这取决于你想关闭你的应用程序有多快。
关闭你的应用程序的一个安全的方法是finishAffinity();
它会在所有进程完成处理后关闭您的应用程序。 这可能需要一些时间。 如果以这种方式关闭应用程序,并在短时间后重新启动应用程序,则新应用程序有可能在相同的进程中运行。 所有未完成的进程和旧应用程序的单例对象。
如果你想确定,你的应用程序关闭完全使用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) ,运行这个代码并关闭后重新启动应用程序,你会遇到一些奇怪的行为,因为无限循环仍在运行。
您可以使用API 21中的finishAndRemoveTask ()
public void finishAndRemoveTask()
完成此任务中的所有活动并将其从最近的任务列表中删除。
如果你在Activity
,你最好使用finish()
,如果你在Fragment
,最好使用getActivity().finish()
。
如果你想完全退出应用程序,然后使用:
getActivity().finish(); System.exit(0);
finishAffinity();
System.exit(0);
如果你只使用finishAffinity(); 没有System.exit(0); 你的应用程序将退出,但分配的内存仍然会被你的手机使用,所以…如果你想要一个干净,真正的应用程序退出,使用它们两个。
这是最简单的方法,并在任何地方工作,真正退出应用程序,你可以有很多活动打开仍然会退出所有没有问题。
例如点击按钮
public void exitAppCLICK (View view) { finishAffinity(); System.exit(0); }
或者如果你想要的东西很好,例如带3个按钮的提示对话框是否和取消
//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();
正在放弃申请吗? 。 通过这个链接。 它回答你的问题。 系统执行杀死应用程序的工作。
假设你有两个活动A和B.你从A导航到B.当你点击返回按钮时,你的活动B从后台堆栈弹出并销毁。 先前在后退堆栈活动A中的活动需要关注。
您应该将其留给系统来决定何时终止该应用程序。
public void finish()
当你的活动完成并且应该关闭的时候调用它。
假设你有很多活动。 你可以使用Action bar。 点击主图标naviagate到您的应用程序的MainActivity。 在MainActivity中点击返回按钮退出应用程序。
这不是一个好的决定,因为它违背了Android的应用程序处理原则。 除非绝对不可避免,否则Android不会杀死任何进程。 这有助于应用程序启动更快,因为它们始终保存在内存中。 所以你需要一个非常特殊的理由来杀死你的应用程序的进程。
这可能是非常晚的,也是根据你自己不应该处理生命周期过程的指导方针(就像你为你做的那样)。 一个建议是,你在所有的活动注册一个广播接收器与“ finish()
” onReceive()
&当你想退出你可以简单地通过一个意图,表明所有的活动必须关闭…..虽然确保你在你的onDestroy()
方法中“取消注册”接收者。
按钮点击 退出应用程序的正确和确切的解决方案是使用下面的代码:
//按下按钮返回按下的事件
public void onBackPressed() { moveTaskToBack(true); finish(); }
从您的顶级活动:
super.onBackPressed();
这将杀死任何东西;)
int p = android.os.Process.myPid(); android.os.Process.killProcess(p);
你可以完全的应用程序。 从而
Intent intent = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
它将工作100%。 祝你好运!
只需要使用finish()就可以在后面按下onKeypressed()
把这个代码写在你的压缩覆盖方法上
@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); }
- 如何在Google Maps Android API v2中直接将相机移到当前位置?
- GoogleApiClient正在抛出“GoogleApiClient尚未连接”后,onConnected函数被调用
- Android:如何定期发送位置到服务器
- “支持的最小Gradle版本是2.14.1。 当前版本是2.10。“错误
- Android Studio“项目结构”不能正常工作
- android youtube用静态的用户名和密码上传video
- Android clipToPadding属性是做什么的?
- 格式属性值“android:drawable”无效
- Android:什么是android.R.id.content用于?