Android System.exit(code) and android.os.Process.killProcess(pid)或者发生RunTimeException 导致应用重启

Android比system.exit(0)或 Process.killProcess更好的退出应用方案(推荐使用) 在开发过程中发现system.exit(0)或Process.killProcess调用后,如果还存在activity,会导致程序杀死重启等很多问题。 首先在 application中添加boolean值ifexit public class myapplication extends Application { public static boolean ifexit; } 然后在...... 阅读详情

转载自:http://blog.youkuaiyun.com/just_keep/article/details/42558579

关于 System.exit(code) and Android.os.Process.killProcess(pid) 或者发生RunTimeException导致应用重启 的问题,由于没有找到正式官方的文档说明,所以本人通过代码进行了一系列测试发现了某些规律


有不对的请知晓者告知。


首先在android中一个进程对应一个dalvik vm 实例,一个应用可以有一到多个进程也就是对应一到多个dalvik vm instance。一个应用可以有一到多个Task,每个Task 里面可以有一到多个TaskRecord。每个TaskRecord 对应了一个Activity。


OK,再来看一下api 文档时如何解释这两个方法的:


System.exit(code) 

Causes the VM to stop running and the program to exit with the given exit status. If runFinalizersOnExit(boolean) has been previously invoked with a true argument, then all objects will be properly garbage-collected and finalized first.


Process.killProcess(pid)

Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.

一个是Stop VM ,一个是Kill Process ,上面说了一个 进程对应一个 VM ,那么不管是调用哪一个方法都会用看到同样的效果


当我们在代码中调用System.exit 或者 Process.KillProcess 的时候肯定会结束掉当前线程,但是会不会重启应用就要根据你调用结束时整个属于这个应用的所有Task的状态来决定:

android中Task 是可以跨进程跨应用的,即不同应用的activity 可能运行在同一个Task  中,System.exit 或者 Process.KillProcess 是根据什么来决定是否重启?重启的时候又是回到的哪一个界面(Activity)的呢?哪些界面会被重启?哪些又不会被重启呢?分为以下几部来说明:


首先:

在每一个时刻Android 系统都有一个Task 列表,维护了当前系统中已启动的应用以及应用中各个界面(Activity)之间的顺序。比如:

Task 1 (App1)

--- taskrecord1 (Activity A) 栈顶

--- taskRecord2 (Activity B)栈底


Task 11(App1)

--- taskrecord1 (Activity c)

--- taskRecord2 (Activity d)


Task2(App 2)

--- taskrecord1 (Activity A)

--- taskRecord2 (Activity B)


Task2(App 3)

--- taskrecord1 (Activity C)

--- taskRecord2 (Activity D)


Task 有顺序,TaskRecord 也是有顺序的,假如当前Task 如上所说,那么 当前手机显示的就是 App1 这个应用程序的 ActivityA界面。


2:是否重启:

当调用System.exit 或者 Process.KillProcess 的时候,首先会结束掉执行该方法所在的进程,然后根据结束掉该应用的时候的该应用的所有Task 状态来决定是否重启, 如果退出时该应用所有Task 中的TaskRecord 数量大于一 就会重启,小于或等于一不会重启,整个应用就结束掉了


3::重启后回到哪一个界面:

重启后会回到该应用的最上一个Task -当前显示的Task(因为一个应用可以有多个Task)中 栈顶的第二个TaskRecord(栈顶第一个将不会被重启),这也说明了为什么需要所有TaskRecord 的数量大于1的原因。


3:哪些会被重启,哪些不会?

上面第二条说了会回到第一个Task 的栈中的第二个TaskRecord,如果栈中在第二个下面还有其他TaskRecord 。那么在按返回键的时候会重新执行下一个TaskRecord  对应Activity  的onCreate 方法,依次类推,直到栈底为止。




 注意: 如果再Activity 的生命周期中执行System.exit 或者 Process.KillProcess 方法的时候一定要注意,在OnCreate ,OnStart,OnResum 的时候栈中是还没有存在该Activity对应的TaskRecord (该Activity还未被添加进去),或者同样在OnPause,OnStop,onDestory 的时候,如果是按Back 那么该Activity  对应的Activity 对应的TaskRecord 在执行System.exit 或者 Process.KillProcess 之前就已经被移除栈了,即在这种情况下会重启回到这个Activity 的上一个的上一个Activity(如果存在的话,如果不存在着直接退出了整个程序)。



举例 1:

1:假如有一个App A ,  有3个Activity :ActivityA,ActivityB,ActivityC。启动顺序为A 启动B ,B启动C

2:首先通过Launcher 启动了A 。如果在A中通过某个点击事件或者在A的OnCreate or onStart  or onResum 方法,或者再A中按返回键的时候在OnStop or OnPause or OnDestroy 中触发了System.exit 或者 Process.KillProcess,那么程序将不会重启

3:如果 在A中启动了B ,并且A没有调用finish 方法,那么如果在B中的OnCreate or onStart  or onResum 方法或者再B中按返回键的时候在OnStop or OnPause or OnDestroy 中触发了System.exit 或者 Process.KillProcess,那么程序也将不会重启,只有当B 启动完成,对应的TaskRecord 已经添加的Task 中了才会重启回到ActivityA。

4:如果在B 中启动了C ,并且B 没有调用finish 方法,那么如果在C中的OnCreate or onStart  or onResum 方法或者再C中按返回键的时候在OnStop or OnPause or OnDestroy 中触发了System.exit 或者 Process.KillProcess,那么程序将会重启,但是重启后回到的界面是A 而非B,应为此时C还未添加到Task 或者已经从Task里面移除了,所以会重启回到除去栈顶的B 的下一个也就是A。当然如果C启动完成已经添加到了Task里面,在C中通过某个点击事件获取其他方式触发了System.exit 或者 Process.KillProcess那么会重启回到B


举例2:

1:有一个App B ,有5个Activity : A,B,C,D,E 。其中A是启动Activity,启动顺序为 A->B->C->D-E

2:假如C的activity:process = "com.test.process1",其他的Activity 使用默认的(名称和ApplicationID 一样),那么当A 启动了B 后B有启动了C ,只要是在C中不管任何地方调用了System.exit 或者 Process.KillProcess都会结束掉“com.test.process1”这个进程,其他进程不受影响,所以C Activity 

会关闭,但是A ,B 保持原样。因为C已经关闭了更具Task 里面的顺序所以显示B 界面(效果和按返回键一样,只是说按返回键不会结束掉进程);

3:接着第二种情况,假如不在C中调用,而是通过C启动了D,因为D 没有指定process ,所以D 和A,B 属于同一个进程。那么如果在D中执行了System.exit 或者 Process.KillProcess。那么会结束掉D所在的进程也就是默认名称的进程,而C 在的进程不受影响,因此再执行

System.exit 或者 Process.KillProcess后会显示C 界面不会立刻重启A,和B ,只有在C界面按返回的时候,这时候发现B 已经关闭了所以系统会自动重启B ,在B  中按返回发现A也不存在了所以会自动重启A。针对此情况有一点需要补充一下,如果D 已经添加到Task 里面后执行的结束方法,那么回到C ,和上面所说的不矛盾(只是C不需要重启因为C在单独的进程可以解释得通),那么如果是在D还未添加到Task 的时候,那么此时Task 里面只有A,B,C 三个。那么为什么任然回到C呢? 而不是B 呢?是因为C 在单独的进程所以不受影响,而顺序决定了C 在B 上面,所有只有回到C而不是B

4:如果A,B,属于同一个进程,C,D,E 属于另一个进程,如果此时Task里面的状态时A-B-C-D-E。 E 在栈顶,那么在E 中执行了结束方法。会重启E 所在的进程回到界面D。在D中按返回重启C ,在C中按返回到B (不重启,不再同一个进程)

5:假如A,B,D 属于同一进程同一个Task 。C 在另一个进程并且另一个Task.那么当启动完成D后,整个应用就有两个Task 。最上一个(当前显示的)Task{TaskRecordA,TaskRecord,B,TaskReocedD},以及另一个Task{TaskRecordC}。那么在D中执行结束方法,会重启回到B界面,返回的顺序是B->A->C.其中B,A 会重启,C不会


总结:总的来说就是当调用System.exit 或者 Process.KillProcess的时候,只会结束当前调用的进程(如果一个应用有多个进程,其他进程不会发生改变,其他进程里面的activity 也不会重起),在根据结束之前整个应用的Tasks 状态(数量和顺序)来决定时候重启,数量决定是否重启,顺序决定重启后回到哪一个界面。


同样当发生RunTimeException 的时候和System.exit 或者 Process.KillProcess效果是一样的。

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置) 本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。 阅读详情

相关推荐

自动化测试-自愈技术

随着人工智能的发展,作为一名软件测试工程师,相信大家都会思考如何把这一前沿技术引入到我们的自动化测试当中,想一万遍不如做一遍。,传递当前页面状态,获取之前成功的定位器路径,比较它们,并生成修复的定位器列表。如果修复成功,我们可以使用 Healenium Idea 插件更新我们的自动化测试代码:插件使用修复定位器寻找修复和更新测试代码。的旧定位器去定位按钮的时候,脚本就会报错,提示 “NoSuchElement”的错误异常。现在,我们假设开发人员变更了应用程序的UI界面,改变了这个按钮的id属性,从。

qq_58223744的博客 2660

Android 进程重启问题 android.os.Process.killProcess()

全局任务栈内有超过一个以上的 Activity 实例。此时,调用 `Process.killProcess(Process.myPid())`后,系统表现,类似“意外关闭”会重建关闭页面的前一个 Activity

打渔还是晒网 —— stone 1646

LabVIEW工程密码保护机制与移除技术详解

LabVIEW作为工业自动化领域广泛使用的图形化编程工具,其密码保护机制涉及文件加密与权限控制等核心技术。从技术实现来看,现代版本采用AES-128加密结合SHA-256哈希校验,而经典版本使用XOR加密配合Base64编码。理解这些加密原理对于工程维护、灾难恢复等合法场景至关重要。在实际应用中,密码移除工具需要处理不同版本的文件结构差异,包括解析XML描述区的Protection标签、动态识别版本并应用对应解密策略。这类技术在工业设备维护、教学研究等场景具有重要价值,但必须注意遵守法律边界,确保拥有合法的

weixin_34161083的博客 390

android exception异常代码,Android DeadSystemException

目前,我们的HockeyApp崩溃报告中出现了DeadSystemException。 它发生在Android 7.0和Android 7.1上。 我们在应用程序的先前版本中没有遇到此异常(当前它们都已被用户使用),因此我想这个异常是由一些代码更改引起的。 但是堆栈跟踪对此并没有帮助。 任何想法?感谢您的任何建议。HockeyApp的堆栈跟踪:java.lang.RuntimeException:...

weixin_35410816的博客 4780

【安徽理工大学】一文带你高分拿下计算机考研复试(85+的秘密)

一文带你高分拿下安徽理工大学计算机考研复试(85+的秘密)

猫天意的博客 1523

SCI论文发表很容易【5】:比较容易中的期刊

整理了一些经管方面比较容易中稿的期刊,可供大家参考

qq_25018077的博客 1678

Android应用停止运行处理策略(如 DeadSystemException)

Android应用停止运行处理策略- https://www.jianshu.com/p/c3da4681a19b Android DeadSystemException- https://stackoverflow.com/questions/42784731/android-deadsystemexception Android DeadSystemException- https://www...

ShareUs的专栏 3万+

ubuntu20.04搭建QGC4.2编译环境

QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。

超维空间科技的博客 1万+

Android System crash DeadSystemException(Service/Activity/终极解决方案)

当Android系统服务已经死亡,app进程与之通讯,会抛出DeadSystemException。可能发生在Activity的生命周期,service的生命周期,其他涉及跨进程通讯,处理起来各有不同

HeXinGen的博客 1万+

数据仓库数据质量监控和处理方法最佳实践

指的是检查数据是否存在反常或者错误的情况,例如数值反常地过大或者过小,或者超过记录的波动值,对应的规则包括数值波动检查,最大值、最小值检查,跨表准确性等。指的是检查数据是否存在缺失的情况,这里的缺失可以是整个数据集的记录缺失,也可以是某个字段记录的缺失,对应的规则包括空值检查,表总行数检查。指的是检查数据是否符合规范,是否按照规定的格式存储,对应的规则包括正则表达式检查,字段长度检查,枚举集合检查,数值范围等。指的是检查哪些数据是重复数据或者数据的哪些属性是重复的,对应的规则例如主键唯一性检查。

大模型大数据攻城狮的专栏 897

高频仿真:高频天线设计_(4).天线参数分析与优化

通过上述步骤,我们展示了如何综合使用解析方法、数值优化方法和实验数据来设计和优化一个高效宽带天线。首先,我们通过解析方法确定了天线的初步长度;然后,使用遗传算法优化了天线的直径以最大化增益;最后,通过实验数据验证了天线的性能,包括驻波比和带宽。这一综合性方法可以有效地提升天线的设计和优化效果,确保其在实际应用中表现出色。

2401_87715305的博客 923

Android开发 - Android杀进程的几种方法,ActivityManager.killBackgroundProcesses,Process.killProcess等的用法

Android杀进程的几种方法: System.exit(0), Runtime.getRuntime().exit(0), Process.killProcess(Process.myPid()), ActivityManager.killBackgroundProcesses(), ActivityManager.forceStopPackage(packageName)。

记录和分享程序人生的点点滴滴 4594

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android.os.dead,android.os.DeadSystemException

你好,极光推送一直在报这个问题,走过路过的同学是否有遇到该问题,是怎样解决的,谢谢jpush: "cn.jiguang.sdk:jpush:3.6.6",jcore: "cn.jiguang.sdk:jcore:2.3.8"``````android.app.ActivityThread.handleUnbindService(ActivityThread.java:4064)3 ......4 ...

weixin_39716521的博客 895

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

判断服务是否运行引发android.os.DeadSystemException

/** * 判断某个服务是否正在运行的方法 * * @param serviceName 是包名+服务的类名 * @return true代表正在运行,false代表服务没有正在运行 */ public static boolean isServiceWork(Context context,String serviceName) { ...

sunming的博客 9614

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android疑难杂症之KillProcess 和System.exit 无效

地址:http://www.toutiao.com/i6362384168738882050/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=5929823057&utm_medium=toutiao_android 首先就...

weixin_30514745的博客 180

android.os.DeadSystemException

在程序压测的过程中,出现过此类问题,查了很多资料。都在说是这个问题是系统核心进程出错了,需要重启,所以杀掉了所有的应用。 下面是源代码,源代码,也无法给我们任何的帮助。 /** * The core Android system has died and is going through a runtime restart. All * running apps will be promptly killed. */ public class DeadSystemException extends D

yangyulong0622的博客 6748

Android app主动杀死进程并重启

最近有个bug,这个bug还很容易实现,就是在app授权权限之后,将app放在后台,在设置里对app的权限关闭操作,再从后台打开app,app会crash。

CoderZ的博客 4838

android system.exit(0)后会重启

必须要将前一个activity 给finish()掉

xiaoshixiu的专栏 2016

android.os.Process.killProcess(android.os.Process.myPid());重启应用的原理

Process.killProcess 最终是调用 linux API kill() 发送 SIGKILL 信号,进行收到这个信息都会立即结束进程。 然而Android 下不同的是 ActivityManager 一直监听者进程状态。如果发现进程被kill,会立即重启进行,并重启之前状态对应的Activity、Service、ContentProvider等。 这就是为什么我们调用Proces

ytyese的博客 2351

android Process.killProcess 和 System.exit(0) 区别

1 Process.killProcess 和System.exit(0) 两个都会 kill 掉当前进程。 你可以打开 DDMS 查看进程号,或 adb shell 进入 shell 然后 ps 一下,进程确实被 kill 掉了。 2 如果是在第一个 Activity 调用Process.killProcess 或System.exit(0) 都会 kill 掉当前进程。 但是如果...

weixin_30882895的博客 281

崩溃记录:android.os.DeadSystemException

记录一个系统崩溃,如下图所示,这个崩溃全部出现在三星手机,而且操作系统版本为10,而且都是退到后台之后报的,我猜想应该是应用崩溃导致进程被杀了,然后再进行后续操作是出错了。 具体原因还没找到。 ...

kanglupeng的专栏 1万+

Android中使用System.exit(0)退出后app又重新启动

System.exit(0):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。System.exit(0)正常终止程序,有时候在退出安卓应用会使用到。 使用这个方法如果前面存在没有finish()掉的Activity会重新启动,导致退出失败。 MainActivity代码:直接启动第二个Activity: [java] view plain co...

邵东的博客 1万+

android+os+stack,Android android.os.DeadSystemException解决方案

Android DeadSystemException 出现情况是被系统杀掉服务导致出现的原因,一般出现在后台用户无感知。1.出错堆栈:image.png2.源码分析private void handleServiceArgs(ServiceArgsData data) {Service s = mServices.get(data.token);if (s != null) {try {if (...

weixin_39898248的博客 2203
上一篇: 控制虚拟按键的显示与隐藏
下一篇: 安卓应用kill 自身并启动
安卓鸟
博客等级 码龄15年 14粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值