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( ...
随机推荐
- PHP中的cookie创建取回删除;
<?php $expire=time()+3600;//设置过期cookie时间 setcookie('yaoyuan',"webyaoyuan",$expire);//se ...
- python实时处理log文件脚本
这个Python脚本是用来对实时文件的内容监控,比如 Error 或者 time out 字段都可以进行自定义:算是我的第一个真正的Python脚本,自己感觉还是比较臃肿,不过打算放到blog上记录一 ...
- HDU 5637 Transform
题意: 有两种变换: 1. 改变此数二进制的某一位(1变成0 或者 0变成1) 2. 让它与给出的n个数当中的任意一个做异或运算 给你两个数s, t,求从s到t最少要经过几步变换,一共m组查询思路: ...
- SqlServer循环读取配置
USE [DB_JP_BaseInfo00] GO /****** Object: StoredProcedure [dbo].[sp_wx_getAppointmentInfo_Str] Scrip ...
- ECshop--搜索模块细究
ecshop细究 今天看了下ecshop搜索这块,前台数据一直到后台查询再返回前台.大致是这么个过程,首先,在index.dwt文件内,body下面引入了 <!-- #BeginLibraryI ...
- DEDE自带的采集功能,标题太短的解决方法
DEDE自带的采集功能,标题太短获取不全的解决方法搜索了好多之后,终于还是在dede的官方论坛找到了答案.增加采集标题长度:255 目的:原标题长度太小,影响文件采集⑴修改系统参数设置(文档标题最大 ...
- php 表单的活用
一般表单都是用过POST 方式对数据进行隐秘的传输用, 可以偶尔你也会发现这样的用法,表单不止能够进行隐秘的传输.还能够进行URL的传输,并且是同时进行的 提交页面,在action 后面加了URL后缀 ...
- 在MessageBox的Show方法中如何无限使用参数值?
今天发现在show方法中不能使用花括号的方式使用多个可变参数,经过查询得出结果.在show方法中是不存在花括号的方式使用参数的.在Console.WriteLine中是存在的,如下: 那么在show方 ...
- SQL通过传递参数方式备份数据库.
存储过程的SQL代码: ALTER PROCEDURE USP_DBBackup ), --存储目录. ) --存储数据库名. AS SET NOCOUNT ON ) select @name = r ...
- Android学习笔记(SQLite的简单使用)
1.SQLite介绍 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且 ...