Android彻底退出应用程序

Android--关闭某个指定activity,深入浅出安卓开发 WeakReference以及JVM相关,虽然WeakReference被static了,生命周期变长了,但是WeakReference关联的对象不受影响的,依然遵循WeakReference在gc时候的规则。优劣: 优点:代码简单直观,引入WeakReference,解决了内存泄漏问题。缺点:在每个activity中都要添加,代码量多。(不知是否可抽取到基类中,以后尝试)##方案三。 阅读详情

做android开发时,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);

-=====-=-=-=-=-=======-----=====

1. finish()方法

该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。

另外,还有一个方法finishActivity (int requestCode) ,关于这个方法,先看看sdk的api说明吧!

 
  1. public void finishActivity (int requestCode)
  2. Since: API Level 1
  3. Force finish another activity that you had previously started with startActivityForResult(Intent, int).
  4. Parameters requestCode The request code of the activity that you had given to startActivityForResult(). If there are multiple activities started with this request code, they will all be finished.

也许你会这样理解 ,Activity1 通过方法 startActivityForResult (Intent, int) 启动 Activity2,然后在 Activity2 中通过方法finishActivity (int requestCode)来结束 Activity1,但是很不幸运,不是这样的。不信你可以Demo一把!

上面文档说得很明白,该方法强制关闭通过方法 startActivityForResult (Intent, int) 启动的 Activity,也就是说在 Activity1 中的(重写)方法onActivityResult(int requestCode, int resultCode, Intent data) 来接收 Activity2 返回的结果,必须在 Activity1 中调用finishActivity (int requestCode)来结束 Activity2。(一般在onActivityResult 方法调用该方法结束 Activity2)。

 
  1. Force finish another activity that you had previously started with startActivityForResult(Intent, int).
  2. Parameters

还有,下面两个方法,可以参阅文档以及源码研究一下。

 
  1. finishActivityFromChild(Activity child, int requestCode)
  2. finishFromChild(Activity child)

2. killProcess

通过调用 android.os.Process 的相关方法,结束 App,示例如下:

 
  1. btn_exit.setOnClickListener(new Button.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. android.os.Process.killProcess(android.os.Process.myPid());
  5. }
  6. });

3. exit

我们知道,Java 的 exit(int code) 方法可以退出程序,通过查看该方法源码,知道它实际上是调用下面的方法:

 
  1. Runtime.getRuntime().exit(code);

示例代码,如下所示:

  1. btn_exit.setOnClickListener(new Button.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. System.exit(0);//正常退出App
  5. }
  6. });

接下来,我们研究一下这个方法。java.lang.System这个类的该方法jdk说明:

  1. exit
  2. public static void exit(int status)
  3. 终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
  4. 该方法调用 Runtime 类中的 exit 方法。该方法永远不会正常返回。
  5. 调用 System.exit(n) 实际上等效于调用:
  6. Runtime.getRuntime().exit(n)
  7. 参数:
  8. status - 退出状态。
  9. 抛出:
  10. SecurityException - 如果安全管理器存在并且其 checkExit 方法不允许以指定状态退出。
  11. 另请参见:
  12. Runtime.exit(int)

也就是说,参数为非0值的话是异常退出程序。参数为0的话,就是正常退出。

看RunTime这个类的该方法源码:

  1. public void exit(int status) {
  2. SecurityManager security = System.getSecurityManager();
  3. if (security != null) {
  4. security.checkExit(status);
  5. }
  6. Shutdown.exit(status);
  7. }

其api说明:

  1. exit
  2. public void exit(int status)
  3. 通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。
  4. 虚拟机的关闭序列包含两个阶段。在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭钩子 (hook)(如果有的话),并且允许它们同时运行直至结束。在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。
  5. 如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭钩子,则将无限期地阻断此方法。如果已经运行完关闭钩子,并且已启用退出终结 (on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。
  6. System.exit 方法是调用此方法的一种传统而便捷的方式。
  7. 参数:
  8. status - 终止状态。按照惯例,非零的状态码表明非正常终止。
  9. 抛出:
  10. SecurityException - 如果安全管理器存在,并且其 checkExit 方法不允许存在指定的状态
  11. 另请参见:
  12. SecurityException, SecurityManager.checkExit(int), addShutdownHook(java.lang.Thread), removeShutdownHook(java.lang.Thread), runFinalizersOnExit(boolean), halt(int)

该方法又是调用Shutdown这个类的exit()方法。

  1. static void exit(int status) {
  2. boolean runMoreFinalizers = false;
  3. synchronized (lock) {
  4. if (status != 0) runFinalizersOnExit = false;
  5. switch (state) {
  6. case RUNNING: /* Initiate shutdown */
  7. state = HOOKS;
  8. break;
  9. case HOOKS: /* Stall and halt */
  10. break;
  11. case FINALIZERS:
  12. if (status != 0) {
  13. /* Halt immediately on nonzero status */
  14. halt(status);
  15. } else {
  16. /* Compatibility with old behavior:
  17. * Run more finalizers and then halt
  18. */
  19. runMoreFinalizers = runFinalizersOnExit;
  20. }
  21. break;
  22. }
  23. }
  24. if (runMoreFinalizers) {
  25. runAllFinalizers();
  26. halt(status);
  27. }
  28. synchronized (Shutdown.class) {
  29. /* Synchronize on the class object, causing any other thread
  30. * that attempts to initiate shutdown to stall indefinitely
  31. */
  32. sequence();
  33. halt(status);
  34. }
  35. }

其中,runAllFinalizers()是一个本地方法:

  1. JNIEXPORT void JNICALL
  2. Java_java_lang_Shutdown_runAllFinalizers(JNIEnv *env, jclass ignored)
  3. {
  4. jclass cl;
  5. jmethodID mid;
  6. if ((cl = (*env)->FindClass(env, "java/lang/ref/Finalizer"))
  7. && (mid = (*env)->GetStaticMethodID(env, cl,
  8. "runAllFinalizers", "()V"))) {
  9. (*env)->CallStaticVoidMethod(env, cl, mid);
  10. }
  11. }

System.exit()的参数是把退出原因返回给系统, 一般来说可以是任何的整数 。

0表示正常退出,1表示非正常 。

最后说一下finish()与exit方法的区别:

finish()是Activity的类方法,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,退出当前Activity并释放资源(内存),但是该方法不可以结束整个App如有多个Activty或者有其他组件service等不会结束。

其实android的机制决定了用户无法完全退出应用,当你的application最长时间没有被用过的时候,android自身会决定将application关闭了。


4. restartPackage方法

  1. ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  2. manager.restartPackage(getPackageName());

首先需要创建ActivityManager对象,然后调用restartPackage()方法(如果有兴趣的话,可以看源码)。

注意:getPackageName获得当前应用包名称,如mark.zhang

使用这种方式来退出App,需要权限:

  1. <uses-permission android:name="android.permission.RESTART_PACKAGES" />

更加详细的说明,如下:

  1. void android.app.ActivityManager.restartPackage(String packageName)
  2. Have the system perform a force stop of everything associated with the given application package. All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc. In addition, a Intent.ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped, notifications removed, etc.
  3. You must hold the permission android.Manifest.permission.RESTART_PACKAGES to be able to call this method.
  4. Parameters:
  5. packageName The name of the package to be stopped.

可以看出,相同的UID的进程会被kill,还会停止相关的服务以及移除所有的Activity,并且会发送一个广播。


注意一个问题:在android2.2之后,该方法不可以将应用程序结束,需要使用ActivityManager类的下面这个方法:

  1. public void killBackgroundProcesses (String packageName)

api 文档说的很清楚:

  1. public void restartPackage (String packageName)
  2. Since: API Level 3
  3. This method is deprecated.
  4. This is now just a wrapper for killBackgroundProcesses(String); the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.

另外,需要使用权限:

  1. <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

但是不管你怎么样折腾,还是无法退出App,呜呼哀哉!这里给出一个方法:

  1. int currentVersion = android.os.Build.VERSION.SDK_INT;
  2. if (currentVersion > android.os.Build.VERSION_CODES.ECLAIR_MR1) {
  3. Intent startMain = new Intent(Intent.ACTION_MAIN);
  4. startMain.addCategory(Intent.CATEGORY_HOME);
  5. startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  6. startActivity(startMain);
  7. System.exit(0);
  8. } else {// android2.1
  9. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  10. am.restartPackage(getPackageName());
  11. }


关于android.os.Build.VERSION.SDK_INT,可以参考 http://blog.youkuaiyun.com/androidbluetooth/article/details/6778422

android 退出activity 的方式总结 在android中使用:[activityname].this.finish();  只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 一   使用killProcess()函数,首先获取当前进程的id,然后杀死该进程: android.os.Process.killP 阅读详情

相关推荐

优雅退出Android应用程序:正确关闭Activity

通过在主Activity中管理全局的Activity列表,并在每个Activity的生命周期方法中添加和移除Activity,我们可以确保所有的Activity都能正确地关闭。当用户完成某个任务或者希望退出应用程序时,我们需要确保所有的Activity都正确地关闭,以释放资源并终止应用程序的运行。这样,当一个Activity被销毁时,它会自动从全局的Activity列表中移除,避免了潜在的内存泄漏问题。需要注意的是,为了确保应用程序的稳定性,我们可以在Activity的。方法,从而退出应用程序。

CyberGenius的博客 499

android_基础_权限大全

转载自: https://www.cnblogs.com/shiwei-bai/p/4916794.html 1 android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST 作为一个工厂测试程序,运行在root用户 android.permission.FLASHLIGHT 访问闪光灯,android开发网提示HTC .

写bug的蚊子的博客 3191

秋叶ComfyUI整合包:一键部署AI绘画工作流,解决环境配置难题

在AI绘画和生成式AI领域,Stable Diffusion作为开源的扩散模型,为图像生成提供了强大的技术基础。其核心原理是通过学习数据分布,对随机噪声进行逐步去噪,最终生成高质量的图像。这项技术的价值在于极大地降低了专业图像创作的门槛,并推动了AIGC(人工智能生成内容)在艺术设计、游戏开发、广告营销等场景的广泛应用。然而,其典型工作流实现工具ComfyUI,在实际部署中常因Python环境、PyTorch版本与CUDA驱动之间的复杂依赖关系而受阻,尤其是面对NVIDIA 30系、40系及未来50系等不同

优快云头条 669

使用easypermissions,申请android动态权限。

使用easypermissions配置android的app应用权限。android6以上需要动态申请权限。 reposition: http://jcenter.bintray.com/pub/devrel/easypermissions/0.4.3/ sample: https://gi...

chonggong6368的博客 801

桑基图实战指南:Excel/Python/R三工具高效绘制方法

桑基图是一种以线条宽度编码流量大小、以节点位置表达流程阶段、以连接关系呈现数据流向的专项可视化技术,其核心原理在于‘宽即量、位即序、连即逻辑’。它并非装饰性图表,而是面向业务诊断的分析前置工具,尤其适用于预算分配、能源损耗、用户转化等存在明确单向流动与显著数值差异的场景。相比传统柱状图或漏斗图,桑基图能天然暴露系统瓶颈与隐性损耗,大幅提升决策效率。本文聚焦工程落地,覆盖Excel插件快速交付、Python Plotly交互开发、R networkD3生态集成三大主流路径,兼顾数据准备铁律、索引映射规范与中文

cuml0912的博客 488

静态时序分析Static Timing Analysis1——STA概述、标准工艺库、时钟、IO约束的建立

简要介绍STA和标准工艺库内容,对时钟,IO等进行约束的指令介绍,PVT

qq_42135020的博客 7541

android按back键彻底退出应用程序的方法

android

yiyudemei的专栏 1580

NLM去噪算法:原理、优化与医学图像处理实战

本文深入解析NLM去噪算法的核心原理及其在医学图像处理中的优化应用。通过全局自相似性计算,NLM算法有效抑制噪声并保留细节,特别适用于超声图像斑点噪声处理。文章还介绍了积分图像和傅里叶变换等优化技巧,显著提升计算效率,并分享医学影像项目中的实用调参经验。

weixin_29051149的博客 348

android 彻底退出应用程序在不同API下需要调用的方法

一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);   1. finish()方法 该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。 另外,还有一个方法finis

成长的味道 2213

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

2025年7月5日全国青少年信息素养大赛Python编程初中组复赛真题+答案解析

伶俐角少儿编程 466

Ubuntu零基础入门到精通【4.4讲】:网络、蓝牙、显示器、声音与输入法设置!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1486

Android彻底退出,解决应用程序退出不完全

问题描述 退出流程: 子页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;完全退出 每个页面在关闭的时候都写了finish(),但还是会出现退出不完全的现象,例如: 子页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;主页面——&gt;退出登录——&gt;登录页面——&gt;完全退出 由于主页面和登录页面重复显示,所以在登录页面退出时加了System...

weixin_42824294的博客 7755

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

android彻底退出应用_Android退出应用程序方法总结

退出图在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?今天就为大家整理分享一些退出应用程序的方法,一起来看看吧!更新内容Ver:v1任务管理器方法补充新增监听式退出方法Ver:v2任务管理器方法修正新增销毁任务栈退出方法1. finish方法finish();该方法只是结束当前Activity,系统将最上面的Activity移出了栈,并没有...

weixin_42509196的博客 3824

【图像去噪】论文复现:Mamba没Out!MaIR的Pytorch源码复现,跑通全流程,轻松解决环境配置问题,图文结合,明确MaIR创新点,与MambaIR对比,示意图与源码对应,清晰易懂,注释详细!

论文题目:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration —— MaIR:用于图像恢复的局部性和连续性保持 Mamba【图像去噪】论文精读:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration【图像去噪】论文复现:Man!

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1114

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android彻底退出应用_Android完全退出应用程序的方法

本文实例讲述了Android完全退出应用程序的方法。分享给大家供大家参考。具体如下:在Android中,如果想退出Android程序,一般都是调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用...

weixin_42519772的博客 2415

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android彻底退出应用_android完全退出应用程序

android 完全退出应用程序android android 退出应用程序, 单例模式管理Activity引自:http://www.yoyong.com/archives/199android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(...

weixin_39559804的博客 937

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android彻底退出应用_android——彻底关闭——应用程序

最近学习做android的游戏开发时候,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new 出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);1. finish()方法该方法可以结束当前 Activity,但是如果你的App有很多 Activity ...

weixin_39559071的博客 962

android禁用应用组件,Android彻底退出(关闭)应用程序.docx

Android彻底退出(关闭)应用程序.docx做android开发时,发现一个关于android退出时不能彻底关闭的问题,比如:一个程序里new?出了N多个Thread,这样在退出程序的可能不能完全关闭,最后发现,只用finish()方法,有时候不能彻底退出,个人感觉还是要在适当的地方加上:System.exit(0);?-------------------------------------...

weixin_39997664的博客 239

android彻底退出应用_【移动开发】Android应用程序完全退出

前段期间,参加比赛做项目时遇到了一个问题:Android中应用程序弹出退出对话框退出应用程序时,老是出现上一个Activity,于是将在Activity跳转时将其finish()掉,结果还是不行!寻其原因:原来项目中有好多Activity用来显示界面,之间还掺扎着数据信息的交流,我们知道Activity是以栈的方式存放,要想将程序退出,自然得将众多Activity销毁掉了!后来在网上查阅了一下,找...

weixin_39950057的博客 325

android完全退出应用程序

最近开发的一个应用程序中,需要在两个activity之间来回切换,但又不想让这两个activity在切换时候重新创建,于是使用了android:launcher属性为singleInstance,这样切换不重新创建的目标达到了。但想在其中之一在按返回键的时候完全退出应用程序,google了下,说是使用 // 关闭进程 android.os.Process.killProcess(andr

CmdMac的专栏 1014
上一篇: autoconf 和 automake 生成 Makefile 文件
下一篇: svchost.exe是什么进程
goodspringin
博客等级 码龄14年 3粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值