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 掉当前进程。
但是如果不是在第一个 Activity 中调用,如 ActivityA 启动 ActivityB ,你在 ActivityB 中调用
Process.killProcess 或 System.exit(0) 当前进程确实也被 kill 掉了,但 app 会重新启动,
又创建了一个新的进程。(这是我同事发现的)
这点还不是很明白,我估计 android os 认为 app 是被意外终止的(如内存不足),os 底层有监听服务,
app 被意外终止会自动重启。
3 在测试极光推送的时候,发现退出 app 后就收不到推送了。后来发现是调用了 System.exit(0) 的原因。
首先 service 也是在进程中的,在主线程中,所以 service 中如果有耗时操作也要开启另外的线程来处理。
当调用 System.exit(0) 或 Process.killProcess 的时候进程被 kill 掉了,进程里的所有东西当然包括 service 肯定
也没了。由于极光推送 pushservice 被 kill 掉了,所以退出 app 后就收不到推送了。
4 还没完,戏剧性的事情发生了,刚退出 app 由于 kill 掉了进程,服务没了,所以收不到推送。但是过了大约1分钟左右居然又能推过来了。
原来是和 service 的 onStartCommand 的返回值有关
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("lelsie", "service onStartCommand");
return START_STICKY;
//return START_NOT_STICKY;
}
如果返回 START_STICKY 是说服务应该一直运行除非我们手动停止它。极光 pushservice 返回的肯定是 START_STICKY。
所以1分钟之内系统又重启了服务,当然会先为 app 创建一个新的进程,也就是重启了 app, 同样你可以在 DDMM 中查看进程的杀死与新进程的重建。
我在手机上截了 2 张图

第一个图是在调用了 Process.killProcess 或 System.exit(0) 之后的图,可以看到进程已不存在了,服务当然也不在了。显示正在重新启动。
第二个图是服务重启以后的正常状态,所以 1-2分钟后又能接收到推送了。
第三个图是 DDMS 截图
5 其实 Process.killProcess 或 System.exit(0) 都不应该直接调用, 进程是由 os 底层进行管理的,android 系统会自己进行处理回收进程。
退出应用你就直接 finish 掉 activity 就行了。
正常情况下 back 键退出应用以后 os 就会回收 app 进程, 但当 app 中有推送服务等需要长时间运行的服务时 os 就不会 kill 掉进程,也就是说应用将一直在线。 即使你手动 kill 掉进程, 进程也会自动重启。
本人水平有限,有问题大家再多讨论。。。。
有兴趣的同学可以用我写的 demo 测试: http://pan.baidu.com/s/1c0xS5g8
android Process.killProcess 和 System.exit(0) 区别的更多相关文章
- Android:finish()与System.exit(0)之间的区别
finish()与System.exit(0)都是用来退出.但是两者还是有一定的区别: finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没 ...
- android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
android Activity类中的finish().onDestory()和System.exit(0) 三者的区别 Activity.finish() Call this when your a ...
- android开发时,finish()跟System.exit(0)的区别
这两天在弄Android,遇到一个问题:所开发的小游戏中有背景音乐,玩的过程中始终有音乐在放着,然后在我退出游戏后,音乐还在播放! 我看了一下我最开始写的退出游戏的代码,就是简单的finish() ...
- android finish和system.exit(0)的区别
finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:当调用System.exit(0)时,杀死了整个 ...
- Android 与Java 进程退出 killProcess与System.exit
android所有activity都在主进程中,在清单文件Androidmanifest.xml中可以设置启动不同进程,Service需要指定运行在单独进程?主进程中的主线程?还是主进程中的其他线程? ...
- System.exit(0)和System.exit(1)区别:
System.exit(0)是将你的整个虚拟机里的内容都停掉了,而finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收.无论如何,内存都 ...
- How to use Android Activity's finish(), onDestory() and System.exit(0) methods
Activity.finish() Calling this method will let the system know that the programmer wants the current ...
- android中 System.exit(0)的理解
public class HelloGoodbye{ try{ System.out.println(“Hello World”); System.exit(0); } finally { Syste ...
- 【Android】System.exit(0) 退出程序
许多 Android 应用程序都是连续点击两下返回键时退出程序,代码如下: private long exitTime = 0; @Override public boolean onKeyDown( ...
随机推荐
- Linux下搭建Oracle11g RAC(8)----创建ASM磁盘组
以grid用户创建ASM磁盘组,创建的ASM磁盘组为下一步创建数据库提供存储. ① grid用户登录图形界面,执行asmca命令来创建磁盘组: ② 进入ASMCA配置界面后,单击Create,创建新的 ...
- 测试cnblogs是否存在链接引用的bug
如果来源页弹出了一个对话框,或者跳转到了本页面,说明来源页面存在链接引用的bug
- ubuntu 12.04 编译安装 nginx
下载源码包 nginx 地址:http://nginx.org/en/download.html 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到再安装两个包就ok sudo ...
- c# 值传递 引用传递
以前一直误以为引用类型,在作为参数传递时,都是引用传递(类似于值传递中的ref),也就是说,把引用类型的变量作为参数传递给方法,在方法中修改该参数,会改变这个变量的值, 后来通过一些事例发现,上面的认 ...
- c# 前端写代码的情况
<%for(int i=0;i<list_model.Count;i++) { %> <div style=" padding-left:35px;padding-r ...
- 绝对定位的DIV绝对居中显示
绝对居中:即在客户端上任何分辨率下纵横方向均居中 紫色的正方形为绝对定位的div position:absolute; top: 50%; left: 50%; 只能把div定位在以红色圈为起点的位置 ...
- Python初学记录
发音: 拍怂 语系:类C 特点: 1语句控制不用{}和(),而是强制用户空格或tab缩进.空格和tab数量不一定. 2解释性语言,不需要事先声明变量,即写即用. 3.list 列表可存放多种类型数据. ...
- TCP的服务流程
TCP协议提供的是可靠的.面向连接的传输控制协议,即在传输数据前要先建立逻辑连接,然后再传输数据,最后释放连接3个过程.TCP提供端到端.全双工通信:采用字节流方式,如果字节流太长,将其分段:提供紧急 ...
- Winedt 7.0 Build: 20120321 永久试用方法 WinEdt 7.0 破解
该方法,不是破解. 因为WinEdt试用版与正式版功能无异. 所以,该方法是 通过更新注册表信息,重置安装时间. 也就是重新获取31天的试用期时长. 方法如下: 1.用管理员权限打开CMD. 2.运行 ...
- SQL Server中Id自增列的最大Id是多少
什么是自增列 在SQL Server中可以将Id列设为自增.即无需为Id指定值,由SQL Server自动给该列赋值,每新增一列Id的值加一,初始值为1. 需要注意的是即使将原先添加的所有数据都删除, ...