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; } 然后在...... 阅读详情

关于 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效果是一样的。


VS2017中调用gdal(C#版)的方法二(含gdal下载地址,配置过程,代码测试,超详细!!) VS2017中gdal(C#)版的配置与测试 上次记录了直接在VS2017中下载并应用gdal的方法,这次来记录一下网上下载的安装包配置与测试的方法。 一、环境、版本及下载地址 win10,vs2017社区版,gdal2.4.4 还是像之前在Unity中应用gdal一样,最好是下载已经编译好的C#版的gdal,不然自己配置真的很容易出错,我就是这样的,下面提供不同版本的gdal下载地址: 1.GDAL2.4.4(C#版、64位): https://download.csdn.net/download/che 阅读详情

相关推荐

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

dify1.3.1应用服务与数据服务分离,附件及插件包迁移至minio,实现离线部署,保证插件正常运行

Time_1023的博客 1873

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

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

打渔还是晒网 —— stone 1647

PTA编程—币值转换

我对于这个题的主要思想就是把九位数分三块,对每块进行处理后,再合并。有了这个思想就开始写代码,后面就是哪有洞补哪,哪个测试用例没通过就对其特殊处理…。反正最后测试用例全通过了。 #include<iostream> #include <string> #include <algorithm> using namespace std; char a[10]={'a','b','c','d','e','f','g','h','i','j'}; //既然题目说了最多9位

uyo9ko的博客 991

android exception异常代码,Android DeadSystemException

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

weixin_35410816的博客 4782

手把手教你玩转AT32F403A位带操作:像51单片机一样控制GPIO

本文详细介绍了如何在雅特力AT32F403A国产MCU上实现位带操作,像51单片机一样高效控制GPIO。通过实战演示和性能对比,展示了位带操作在实时控制中的优势,包括更快的执行速度和更低的延迟,特别适合工业控制和电机驱动等场景。

weixin_29234509的博客 285

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 672

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

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

ShareUs的专栏 3万+

手把手教你配置SAP PP供应区域(Supply Area):实现线边仓精准发料与物料流优化

本文详细解析了SAP PP供应区域(Supply Area)的配置方法,帮助企业实现线边仓精准发料与物料流优化。通过三级优先级逻辑和四步配置法,系统可自动识别最优组件来源位置,显著提升生产订单处理效率和库存准确率。文章还提供了典型问题解决方案和性能优化技巧,适用于离散制造和重复制造场景。

weixin_29275257的博客 434

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

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

HeXinGen的博客 1万+

ZYQN7000系列VxWorks驱动开发:VxWorks系统移植

文章目录ZYQN7000驱动开发:VxWorks系统移植1.硬件环境2.编译vsb和vip工程2.1修改设备树文件2.2添加调试打印组件3.选择uboot来启动VxWorks内核4.尝试在开发板上启动内核4.1 拷贝镜像和设备树至SD卡4.2开发板上电4.2.1 uboot成功启动4.2.2 启动VxWorks5.添加shell和cmd组件 ZYQN7000驱动开发:VxWorks系统移植 1.硬件环境 正点原子领航者开发板 2.编译vsb和vip工程 vsb和vip工程的编译过程可以参考之前的文章,htt

明故宫的记忆 5507

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6861

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

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

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

STK相关总结

STK简介 一.SIM卡应用工具包(SIM Application Toolkit),又名CAT/USAT,它包含一系列终端与SIM卡的交互指令,SIM卡可以应用卡内的小应用程序和终端交互,从而实现增值服务的目的,STK包括三种类,STK-imsi切换,STK –OTA,STK-BIP 功能: (1) Profile download:配置下载,开机初始化SIM卡过程中,终端告诉SIM卡终端支持哪些功能,STK中download指终端将数据发送给SIM卡 (2) Proactive command: 主动式

jingjing_2的博客 3357

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

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

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

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

sunming的博客 9614

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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的博客 6749

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+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

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

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

邵东的博客 1万+
上一篇: Android WebView 闪屏问题
下一篇: Android Actionar overflow 不显示的问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮克桃在写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值