Android中,每个应用程序都有自己独立的资源和内存空间,进程间是不能
随便互相访问的,系统给每个进程分配的内存大小都是固定的。
内存溢出的原因其实就是因为应用程序使用内存超出了系统所分配的内存空
间,所以就导致了内存溢出。我们可以在android:minSdkVersion="11"以上的应用中给AndroidManifest中的Application标签增加一个属性:android:largeHeap="true",请求系统给当前应用分配更多内存。
当然,这么做的话对于API小于11版本的应用程序就不能使用了。或者当每个程序都在后台运行,如果都需要系统分配内存,程序一多,内存就不够分配了,系统的运行就会卡顿,效率就会降低。
那么,我们如何去完全的解决这个问题呢?
这就要看多进程了。
如何开启多进程?
简单的两步:
AndroidManifest.xml中设置android:process=":remote"
android:name=".remoteService"
android:label="@string/app_name"
android:process=":remote"/>
(这里process中“:”开头表示的是私有进程,如果是其他的字符,就是公有进程)
然后在Acitvity中启动这个服务
Intent intent = new Intent(this,remoteService.class);
startService(intent);
(还有种方法是用过JNI利用C/C++调用fork()方法来生成子进程)
当然,如果不再需要该进程,系统会在退出这个Activity的时候将其K掉;
了解了进程,我们再来看看进程的优先级
进程分为五个等级:
前台进程、可见进程、服务进程、后台进程、空进程;
空进程:
看字面意思就知道,空进程相比较他们四个而言优先级肯定是最弱的,弱爆了的那种,一看就知道系统最先K掉的就是它,为啥?因为它没啥用啊,空的占位置嘛。但是,它也有被保留的时候,那就是当某个程需要被再次启动时,会留作缓存作用,缩短下次启动的时间。
后台进程:
后台嘛,由于用户对它没啥感觉,所以系统可能会随时带走它,但是毕竟有许多的后台进程在运行,因此他们也会保存在LRU列表中,来确保包含用户最近查看的Activity所在进程最后一个被终止(onStop());
服务进程:
服务进程与用户所见的内容也是没有直接关联的,但是他们通常在执行一些用户关心的操作(下载、音乐播放),所以他的进程优先级就比较高了;
可见进程
既然都已经可以见了,所以优先级是高于服务进程的(不在前台运行时,但用户还是可见,调用onPause()方法);
前台进程
就相当于是用户的操作界面了,系统是不会将它杀死的,当然,如果程序报错出现异常另当别论;
上面我们说到了“:”的是私有进程,没有“:”的是全局进程,那么它们的区别在哪里?
简单来说,全局进程是通过shareUID来跟他处于同一个进程里,具有相同UID的应用可以共享数据,可以互相访问对方的私有数据,就相当于一把钥匙,对方都有了自己的钥匙,就可以随意来查看你在做什么(很邪恶是不是???),那么私有进程就是我不让其它的组件跟我在同一个进程里面,无法访问我的数据;