Android进程管理

来源:互联网 发布:流行网络歌曲500首 编辑:程序博客网 时间:2024/05/20 05:07

进程管理的必要性

移动设备内存空间有限,目前2-4G的内存比较多,虽然已经很大了,但是一个应用进程占用200m,这样很快就会觉得手机卡爆了。再说用户能看到应用也只有一个前台进程,其他的进程占用的内存很多都是浪费了,这样就有必要对这部分浪费的空间进行管理,清除掉那些没用的。

多进程实现:

mainfest清单中配置process

<service android:process=":test1">

以冒号开头“:test1”是私有进程,仅能放置本应用组件,其他应用无法共享该进程空间;

<service android:process="com.honjane.test2">

以包名+类名的是进程是共享进程,可以承载来着不同应用的组件。

除了android:process熟悉,组件配置项的android:mutiprocess属性控制组件进程模型的重要手段。mutiprocess默认为false,

<provider android:mutiprocess="true" ...>

此时,应用就会将该组件嫁接出去,当任何一个第三方应用使用该组件时,都会在第三方应用中备份一份组件对象。而不再是运行在该进程所在进程内(不带来很大并发复杂性问题,开发中使用较少)

进程优先级:

这里写图片描述

优先级的高低,由进程中组件与用户的交互状态来决定,组件中与用户交互状态越紧密,进程优先级越高。
当前用户交互的界面组件,称为前台进程组件。占用资源最多,对开发者来说,不要让组件执行长时间执行onRevice,service.onstart等函数,让进程停留在前台状态。
可视进程,与用户没有直接交互操作,但是用户可以看见这些组件,直接影响着用户的体验。通常,系统不会回收这些可视组件所在的进程。

进程回收:

1、组件安装优先级高低,优先级低的先被回收
2、优先级相同,越近使用过得进程越后被回收

最要分两类进程 “性能型”和“体验型”
“性能型”最要包括后台进程,空进程与手机性能相关

首先,Android手机会计算性能型进程的最大接受值,当低于这个阀值,不会考虑回收
其次,当性能型进程超过这个阀值,系统尝试回收空进程,如果回收后还是超过这个值,就会考虑回收后台进程,一旦性能型进程低于这个值,回收结束。

不难看出“性能型”进程回收是以进程数量为依据的。这种回收方式粗粒度不够,对资源的控制不够精确,毕竟不同的进程消耗的资源不一样。只按照数量来回收,不够精细。

后台界面组件回收解决了这个问题,它是在进程内部完成的,不影响进程数量和优先级,只实现进程内局部资源的释放。
系统将后台组件按照最近访问时间排序,一旦后台组件超过一个阀值(默认20个),系统按照最近访问时间释放掉那些最老访问的组件。组件被回收前会调用

Activity.saveInstanceState()

讲界面的一些信息暂存到磁盘,然后释放掉该组件,知道低于预设的组件阀值。
当我们要恢复的时候可以在onCreate或者restoreInstanceState()中恢复保存的数据

优先级调整

掌控优先级是有必要的,比如播放音乐,我们不希望播放一段时间,进程被杀死了,音乐停止了。这时候就要提高后台进程的优先级。

1、设置service.startForeground方法,将服务组件与通知组件绑定到一起,给service打开一扇与用户交互的窗口。
2、控制Service.onStartCommend返回值,设置为START_STICKY,这样在进程被强制回收后,会再次调用onStartCommend恢复service,

……
市面上很多保活service方法,这里就不详细谈论了,有兴趣可以查询相关资料

0 0