知识梳理之Android进程

Android进程:Android基于Linux,Linux中会为每个用户分配一个进程,一个主线程,Android基本原理一样,默认情况下一个APK对应一个进程;

1、通过在AndroidManifest.xml中为四大组件(Activity、Service、BoradcastReceiver、ContentPrivider)添加android:process =“”熟悉来完成进程的指定,从而可以使一个APK包含不同的进程中;

2、不同进程有不同的内存空间,即使一个APK中,不同进程都是互相不共享的,引用网友的分析:http://www.cnblogs.com/lynchyo/p/3522593.html
引用

每个进程都是运行在不同的虚拟机上,进程间内存的具有不可见性。对于不同的进程,他们载入的Class文件虽然名字一样(比如都是com.breeze.multiprocess.MultiProcessTestActivity),但是他们其实是加载到了不同的内存地址空间。com.breeze.multiprocess.MultiProcessTestActivity中把isChecked变量设置为true,它其实只是把当前进程(com.breeze.multiprocess)的MultiProcessTestActivity类的isChecked变量的设置为了true,com.breeze.MultiProcess.test进程中的 com.breeze.MultiProcess.test.MultiProcessTest_1_Activity类和它位于不同的内存地址空间,当然其变量isChecked也位于不同的内存地址空间,自然也不受影响。


总结:每个进程的运行都有独立的内存空间存放数据,即使两个独立进程使用了同一个类,但两个进程会在各自的内存空间持有一份,互不影响,即使是包裹他们的Application,也是每个进程的组件都拥有一份独立数据。利用这个原理,可以解决Android中的OOM问题,但这不是解决OOM最好的方法,具体关于OOM的深入分析,大家可以参考:http://blog.csdn.net/gemmem/article/details/13017999
内存概念不理解的看这儿:http://blog.csdn.net/gemmem/article/details/8920039


3、系统内存不足时会根据一定的优先级结束一些进程(应用程序),这个优先级可分为:
前台进程
可见进程
服务进程
后台进程
空进程
详细区别可以参考:http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html

4、怎么样结束一个进程
A、结束活动Activity:这个大家都知道是finish,但其实当前进程并没有结束;如果项目中包含多个组件(四大组件)那需要结束每一个,这样才完全结束进程。一般的service和Broadcast根据项目进行看是否需要完全退出;
B、结束当前进程:killProcess(int pid)和System.exit(0);注意,这两个方法会影响Activity的生命周期,Activity可能不会执行部分生命周期回调方法,即非正常结束;,不过可以将这两个方法放到onDestroy()方法的最后,即走完生命周期之后介绍进程,虽然也是非正常退出,但不影响程序本身;
注意:在调用者两个方法之前要将系统中的Activity和Service全部退出,否则调用这两个方法,系统只能结束Activity,进程会重新启动;其中一种方法是在Activity和Service中添加广播,在介绍到广播之后结束Activity和Service
C、结束其他进程,如:
restartPackage()在android2.2版本之后则不能再使用此方法
killBackgroundProcesses(String packageName) 
forceStopPackage(String packageName)
killall -HUP packageName || kill -9 pid

以上部分方法需要系统权限和共享签名;
注意:有Service的还是会重启;
详细可参考:
http://blog.csdn.net/null1989/article/details/12745827


5、进程间通信:
A、Intent:Android组件间通信的基础,组件可以在一个应用程序内,也可以是不同的应用程序;
B、Content provider:用于数据库共享,可以远程(夸应用程序)实现增、删、改、查。
C、Broadcast:被动的通信方式,即只能等待接受;
D、AIDL服务:服务间通信的主要方式;
详细参考:http://dengzhangtao.iteye.com/blog/1311703

6、关于进程、线程,引用网友的话:
引用

既然android service是运行在主线程中的,那service还有什么用??
你没有将android 组件和android C/S架构的概念理解清楚,不仅没有理解清楚,还把组件的概念,跟线程、进程混淆在一起了。 我将android比喻成一栋办公大楼,android 中进程就是一个办公室,线程就是办公室里面的员工,办公室是不能干活的,而真正干活的是这个办公室里面的员工。一个员工只能在一个办公室里面干活,而一个办公室可以有很多员工。 Android的老板希望它的公司能办理的井井有条,于是针对每一种职能专门设立管理部门,例如WMS,负责窗口管理的,例如MPS,负责多媒体播放的。 一个部门可以有一个或多个办公室,一个办公室也可以有多个部门。 而android的管理部门往往是不干什么实事的,就像我们的天朝的猿类,你推它一下,它才动一下。所以android需要一些干实事的部门,做对外客户的,这些部门我们统称为apk。Android中有好多这种部门,于是为了防止这些部门瞎干,又把部门分成Activity、Service、BrocastReceiver、ContentProvider四种子部门,这些子部门就是用来跟其它部门做沟通的,而所有的子部门运作时都会由大管家AMS来记录在案。 Activity,做门面的。 Service,做对外支持的。 BrocastReceiver,做门卫收信的。 ContentProvider,做仓库管理的。 做门面的,可以做对外支持的活,也可以做仓库管理的活。但是外面可不这么认为,它想找你要数据,只会找ContentProvier,找对外支持只会找Service。 另外AMS大管家有个不好的习惯,它为了节省公司的资源,AMS那里没有你这个apk任何部门运行记录的时候,它有可能把你的电关了(杀进程)。 而LZ你描述的问题呢,就是你的部门想下载东西,是由Activity子部门去干呢,还是Service去干。我的说法,都可以,但是,AMS那个不好的习惯,你没有任何Service运行,而Activity又退到后台了,那就会把你的进程杀了。

理解:在Android系统中,在默认情况下,一个应用程序内的各个组件(如Activity、BroadcastReceiver、Service)都会在同一个进程(Process)里执行,且由此进程的【主线程】负责执行。如果指定了一个APK中多个进程,那由所在进程的主线程执行。
参考:http://blog.csdn.net/myarrow/article/details/14223493

参考:
http://www.cnblogs.com/hanyonglu/archive/2012/04/12/2443262.html
http://www.cnblogs.com/lynchyo/p/3522593.html
http://blog.csdn.net/gemmem/article/details/8920039

猜你喜欢

转载自gqdy365.iteye.com/blog/2119646