android 进程什么时候被销毁
http://wear.techbrood.com/guide/components/processes-and-threads.html
每一个 android 应用默认会起一个进程,除非你用 android:process 实现多进程。
每一个进程里面都有一个 dalvik 虚拟机实例用来执行代码。
进程中默认只有一个主线程(UI线程), 4 大组件默认都运行在 UI 线程中, 所以 4 大组件中都不能直接做耗时操作,否则会 ANR。
service 和 broadcastreceiver 中要做耗时操作都必须开启单独的线程来做。
但按 back 键退出应用后,进程什么时候被回收呢??
android 会尽可能长时间的去保留一个应用进程不被回收,这样下次可以快速启动,只有当内存紧张时才会回收进程,而回收哪些进程则根据进程的优先级来判断。
默认有 5 种进程优先级, 根据进程中组件的状态来判断:
1 Foreground process
简单来说就是正在前台与用户交互的进程,优先级最高。
2 Visible process
可见但没有与用户交互
3 Service process
不是 1 和 2 但含有用 startService 启动的 service 的进程。
4 Background process
非 1 2 3 不可见的进程
5 Empty process
空进程,主要做缓存。
android 推送都是在 service 中进行 socket 通信,进程优先级默认是 3 ,所以内存紧张时也是有可能被 Kill 掉的,就收不到推送了。
service 可以通过 startForground() 来设置为前台进程,这样优先级就变为 1 了,不容易被 kill 掉。而且通过 onStartCommand 的返回值
可以控制进程在被意外 kill 掉时是否需要重启,这样就达到了长时间运行,应用永远在线, 用 tcp 长连接实现推送。
看有些人用 System.exit(0) 和 Process.killProcess 来 kill 掉进程,这 2 个方法确实都能 kill 掉进程,但有些情况下会导致应用重启,例如
当 A 启动 B 你在 B 中调用 System.exit(0) 或 Process.killProcess 时会 kill 掉当前进程然后重启一个新的进程。
我之前说过 90% 的情况下你是不需要手动 kill 掉一个应用的进程的,这样第二次启动肯定非常慢。进程是由 OS 底层进行管理的,退出应用你只需要
finish 掉所有的 activity 就行了。如果有些需求确实需要 kill 掉进程,上面的 2 个方法也可以,前提是任务站内只有一个 activity 时再调用。反正我目前
还没有遇到过需要每次退出应用都必须杀死进程的场景,不要跟我说是为了节省内存,上面说了 5 种进程等级,系统自己会管理,不需要人为干预。
而且你自己杀死进程后第二次启动又需要创建新的进程,应用启动就非常慢了。
android 进程什么时候被销毁的更多相关文章
- 【腾讯Bugly干货分享】Android进程保活招式大全
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:腾讯——张兴华 目前市面上 ...
- Android 进程生命周期 Process Lifecycle
Android 进程生命周期 Process Lifecycle 进程的生命周期 Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程. ...
- Android 进程保活招式大全
目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被 ...
- Android(java)学习笔记160:Framework运行环境之 Android进程产生过程
1.前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序 ...
- 【朝花夕拾】Android性能篇之(六)Android进程管理机制
前言 Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...
- Android 进程保活招式大全(转载)
目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被 ...
- Android开发——Android进程保活招式大全
)前台进程(Foreground process),即用户当前操作所必需的进程,通常数量不多.举例如下: //拥有用户正在交互的 Activity(已调用 onResume()) //拥有某个 Ser ...
- 从AIDL开始谈Android进程间Binder通信机制
转自: http://tech.cnnetsec.com/585.html 本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 ...
- Android(java)学习笔记103:Framework运行环境之 Android进程产生过程
1. 前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程 ...
随机推荐
- RO05 - 如何编写RemObjects SDK服务端 (Delphi Version)
转载:http://blog.csdn.net/henreash/article/details/2261134 本文档向你展示如何使用RemObjects(Delphi版)创建第一个服务.读了本文档 ...
- 发个题目坑 二模03day1
1.数列(seq2.pas/c/cpp) 题目描述 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.给定 A ...
- 查看一些特定sql需求的书写
user表,5个人abcde, content表10篇文章,一个人对应两篇文章,有 time字段,查询出五个人的最新文章. select a.id,a.SName,a.ClsNo,a.Scorefr ...
- chrome打开本地文件目录
chrome地址栏输入: file:///
- linux下创建库函数
来源: 在Linux下如何使用自己的库函数-riverok-ChinaUnix博客 http://blog.chinaunix.net/uid-21393885-id-88128.html 构建Lin ...
- 解决Cannot change version of project facet Dynamic web module to 3.0
我们用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servlet还是2.3的,而一 ...
- ecshop设置一个子类对应多个父类并指定跳转url的修改方法
这是一篇记录在日记里面的技术文档,其实是对ecshop的二次开发.主要作用是将一个子类对应多个父类,并指定条跳转url的功能.ecshop是一款在线购物网站,感兴趣的可以下载源码看看.我们看看具体是怎 ...
- iOS 使用UIWebView把oc代码和javascript相关联
首先请参看一篇文章,作者写的很明白,请参看原地址 http://blog.163.com/m_note/blog/static/208197045201293015844274/. 其实,oc和js的 ...
- iOS 中使用Base64编码方式编码图片数据
最近一个项目要求对图片数据简单加密下,就是那种不能直接看到图片内容就行.于是我使用了base64编码对图片数据进行编码,把图片2进制数据变成了base64的字符串,再把这个字符串保存到server的数 ...
- python 的类变量和对象变量
python是一种解释性的语言,任何变量可以在使用的时候才声明以及定义,也可以在程序运行的任何位置进行声明和定义新的变量. class Man(object): #直接定义的类的变量,属于类 #其中 ...