您的位置:首页 > 移动开发 > Android开发

Android进程线程管理机制与组件生命周期解析

2013-01-07 17:33 302 查看
前一段时间被进程和线程的问题搞的云里雾里的,下决心弄清楚Android的进程线程管理机制;另外我个人认为Android程序与Java程序的区别:基于事件的编程模型,没有单一程序入口,生命周期的管理;为了更好的理解Android程序,打算先从生命周期入手;以上就是该篇博客的写作动机。

开发过Android程序的人都知道四大组件是:Activity, Service, Content Provider, BroadcastReceiver;翻译成中文方便我们更能直观的理解他们的作用,分别是:界面组件、服务组件、数据源组件、触发器组件。这些组件都会运行在应用启动时系统启动的应用进程(ActivityThread)中。

ActivityThread对象保存了所有的组件对象和应用环境对象,是系统控制应用进程和其中组件的桥梁。在Android中,系统应用的构造与销毁都是由系统全权掌控的,这个模式被称为“应用进程托管”。进行托管的原因有两个:一是简化编程模型,二是为了全局调度以及优化进程对系统资源的使用,android只能通过终止进程的方式去换取更多内存空间。进程优先级是进程托管策略的基础。优先级的高低是由组件与用户的交互状态来确定的,进程中包含的组件与用户越密切,该进程优先级越高;相应的,系统分配给该进程的资源就越多,进程运行的时间也就越长。具体点说:进程优先级评定的主要依据是进程中界面组件、服务组件和触发器组件的运行状况(注意:没有数据源组件哦,它不作为判定的依据,所以也并没有生命周期),运行状况可以理解为组件当前走到了生命周期的哪一阶段。

我们平时使用应用时会涉及以下几种状态:

1.

2.

3.


1.用户可以直接操作的前台进程

2.后面的微博应用是可视进程

3.该微博应用home键退出后仍包含仍在后台操作的服务进程,属于服务进程或后台进程。

前台进程、可是进程、服务进程、后台进程和空进程,五种进程状态优先级逐渐降低。

个人以为常说的这五种状态有一部分划分不是特别的合理:服务进程和后台进程没有办法简单的划成两类。按home键退出的应用,后台仍有服务在执行既可以说是服务进程也可以说是后台进程。很困惑,请明白的大牛帮忙确认一下这个理解是不是正确。

Android将进程分为两大类:“体验型”(包括前台进程、可是进程、服务进程)“性能型”(后台进程、空进程)。系统对两类进程采取了不同的策略。

不管是哪类进程,所遵循的共同的回收原则是:

1. 尽量延长进程的生命周期,在资源允许的范围内,尽量不回收已创建的应用进程;

2. 组件进程按照进程优先级从低到高进行回收;

3. 同等优先级的进程,越近使用过的越晚回收。

一、对于“性能型”的进程,android为了提高全局性能,会在阈值内维持一定数量的此类进程。回收的步骤如下所示:

a. 获取上述阈值,如果“性能型”进程数量低于阈值(预设的阈值为2,但是现在好多厂商都使用定制os,这个值就不一定是2了),则无需回收

b. 若高于阈值,则先回收空进程(按照访问时间早晚的顺序),直到剩余的“性能型”进程数量低于阈值

c. 若所有空进程回收完毕,数量依然高于阈值,系统会开始回收后台进程,直到“性能型”进程数量低于阈值。

然后系统会进入下一个针对性能型进程回收的流程:后台界面组件(除了前台界面组件和可是界面组件之外的其他界面组件)的回收,该流程是在进程内部实现的,不会影响进程的数量和优先级。

那我们知道系统回收“性能型”进程的算法,那什么时候开始回收呢?触发条件是组件状态发生特定变化时:1)Activity.onDestroy被调用.2)触发器组件执行完成BroadcastReceiver.onReceive()执行完成. 3)触发器组件停止监听广播事件,Context.registerReceiver.4)系统进入待机状态。

二、系统也会时刻关注“体验型”的进程,也设定可运行的应用进程的阈值,服务进程是最易被回收的“体验型”进程。因此建议开发人员需要妥善处理好后台服务组件被回收的情况。

以上是进程的管理机制,在应用开发者有很多复杂逻辑需要耗费大量的时间,比如说网络通信和数据库操作,如果放在主线程(UI线程)执行,会导致页面不响应,因此通常采用多线程的设计,在后台线程执行耗时操作。Android的生命周期机制对多线程架构没有提供良好的支持模型。需要开发人员根据自己的需求,利用组件的生命周期合理的安排线程的构造及销毁。如果系统强行回收组件,此时可能onDestroy方法可能没有被调用,很有可能该方法内部的线程关闭操作没有执行,这样会导致线程资源泄露,一个比较好的解决办法是将线程的句柄信息当做界面组件状态缓存下来,当组件再次被构造是可根据缓存信息找到该线程,避免线程泄露。

通过看上面的内容我们可以看到,给组件指定生命周期是为了明确组件状态,下面我们分析最常用的界面组件(Activity).



Activity.onCreate(Bundle savedInstanceState), 在该组件被构造时调用, 里面的参数在一般的开发中不会用到,这个参数是可以保存组件的状态数据,当内存紧张时,系统会回收后台界面组件,在下次调用时恢复关掉前的状态。

onStart,可以说是跟onStop是对应的,组件进入可视(但是不可操作)状态以后就会调用onstart, 当程序变为不可视状态就会调用onStop方法。

onResume跟onPause是对应的,组件进入前台状态以后就会调用onResume, 当程序退出前台可直接操作状态后调用onPause方法。

当组件被销毁时调用onDestroy方法,后退键退出时自动触发。

如果按home键退出应用,界面组件由前台状态变为后台状态,中间经历了可视状态,先调用onPause()再调用onStop方法;如果按后退键退出依次调用onPause(),onStop(),onDestory()方法。

想了解更多Android机制的话,给大家推荐下面的参考资料,描述的很清楚,这次就写到这吧,等有新的学习进度再跟大家分享。

参考资料:《Android开发精要》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐