多进程的介绍和使用(上)
来源:互联网 发布:企查查数据采集器 编辑:程序博客网 时间:2024/06/07 03:15
Android中,每个应用程序都有自己独立的资源和内存空间,进程间是不能
随便互相访问的,系统给每个进程分配的内存大小都是固定的。
内存溢出的原因其实就是因为应用程序使用内存超出了系统所分配的内存空
间,所以就导致了内存溢出。我们可以在android:minSdkVersion="11"以上的应用中给AndroidManifest中的Application标签增加一个属性:android:largeHeap="true",请求系统给当前应用分配更多内存。
当然,这么做的话对于API小于11版本的应用程序就不能使用了。或者当每个程序都在后台运行,如果都需要系统分配内存,程序一多,内存就不够分配了,系统的运行就会卡顿,效率就会降低。
那么,我们如何去完全的解决这个问题呢?
这就要看多进程了。
如何开启多进程?
简单的两步:
AndroidManifest.xml中设置android:process=":remote"
<service
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的应用可以共享数据,可以互相访问对方的私有数据,就相当于一把钥匙,对方都有了自己的钥匙,就可以随意来查看你在做什么(很邪恶是不是???),那么私有进程就是我不让其它的组件跟我在同一个进程里面,无法访问我的数据;
随便互相访问的,系统给每个进程分配的内存大小都是固定的。
内存溢出的原因其实就是因为应用程序使用内存超出了系统所分配的内存空
间,所以就导致了内存溢出。我们可以在android:minSdkVersion="11"以上的应用中给AndroidManifest中的Application标签增加一个属性:android:largeHeap="true",请求系统给当前应用分配更多内存。
当然,这么做的话对于API小于11版本的应用程序就不能使用了。或者当每个程序都在后台运行,如果都需要系统分配内存,程序一多,内存就不够分配了,系统的运行就会卡顿,效率就会降低。
那么,我们如何去完全的解决这个问题呢?
这就要看多进程了。
如何开启多进程?
简单的两步:
AndroidManifest.xml中设置android:process=":remote"
<service
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的应用可以共享数据,可以互相访问对方的私有数据,就相当于一把钥匙,对方都有了自己的钥匙,就可以随意来查看你在做什么(很邪恶是不是???),那么私有进程就是我不让其它的组件跟我在同一个进程里面,无法访问我的数据;
阅读全文
0 0
- 多进程的介绍和使用(上)
- (二十三)进程——获取进程id相关函数的介绍和使用
- 线程和进程的学习(上)
- 为什么要使用Servlet的背景(通用网关,进程和线程的介绍)
- Android上鲜为人知的UI控件介绍和使用
- linux 上常用的文件传输介绍和使用
- 多线程与多进程的介绍和区别
- 进程的介绍和linux中进程的命令解释
- linux进程的介绍和管理
- 进程和线程的简单介绍
- 进程介绍及和线程的关系
- linux 僵尸进程和孤儿进程的简要介绍
- 浅谈oracle 存储后台进程和用户进程的debug trace log(上)
- 显示计算机上所有进程和进程的内存信息
- 进程和线程的使用
- GCD的介绍和使用(一)
- GCD的介绍和使用(二)
- GCD的介绍和使用(五)
- 数据库中字段的数据格式为 1,2,3 时如何处理数据
- 过滤和排序数据1
- 网站核心页面优化:打造搜索引擎喜爱的页面
- QT-控件阴影效果
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
- 多进程的介绍和使用(上)
- gridview 固定列宽
- leetcode 449. Serialize and Deserialize BST
- java读取json文件
- 函数式编程简介(抄录)与在非函数式项目中的“伪应用”
- ios六大手势的创建使用
- Spring总结以及在面试中的一些问题.
- vue-cli代码缩进报错
- poj3683