Android的进程与单线程模型浅析
2011-12-10汪源,刘芳
汪 源,刘 芳
(大连交通大学教务处,大连116021)
0 引言
Android一词本义指机器人,Google于2007年11月发布了以Android命名的开源移动设备综合平台,包括其基于Linux的操作系统、中间件和关键的手机应用。并且组建了开放手机联盟,其成员囊括了全球著名的各大手机生产商和移动运营商。2008年8月,Google又发布了网上应用商店Android Market。任何一个开发者只需要借助Android发布的SDK开发手机应用,即可把开发的应用在Android Market上销售。目前Android Market上已经有一万多的应用程序,大大丰富了Android手机用户的功能。一个完整的产业链已经形成。
1 基本概念
1.1 Android
Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写[2]。
2010年末数据显示,仅正式推出两年的操作系统Android已经超越称霸十年的诺基亚(Nokia)Symbian OS系统,采用Android系统主要手机厂商包括宏达电子(HTC)、三星(SAMSUNG)、摩托罗拉(MOTOROLA)、LG、Sony Ericsson、魅族 M9、联想(LENOVO)、中兴通讯(ZTE)、华为等,使之跃居全球最受欢迎的智能手机平台,Android系统不但应用于智能手机,也在平板电脑市场急速扩张。
1.2 Android 的进程
当一个程序第一次启动的时候,什么是素质模型,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用,也能保证用户正在访问的当前进程有足够的资源去及时的响应用户的事件[3]。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别:
1)前台进程
前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说,在这种情况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。
2)可见进程
可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程,其重要程度很高,除非前台进程需要获取它的资源,不然不会被中止[4]。
3)服务进程
运行着一个通过 startService方法启动的 service,这个service不属于上面提到的2种更高重要性的进程。service所在的进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务(比如播放mp3,下载数据等)。只要前台进程和可见进程有足够的内存,系统不会回收他们。
4)后台进程
运行着一个对用户不可见的activity。这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进程需要内存的时候回收。通常系统中会有很多不可见进程在运行,他们被保存在LRU(least recently used)列表中,以便内存不足的时候被第一时间回收。如果一个activity正确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响[5]。
5)空进程
未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓存的平衡。
Android对进程的重要性评级的时候,选取它最高的级别。另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服务的进程重要级低。因为服务进程比后台activity进程重要级高,因此一个要进行耗时工作的activity最好启动一个service来做这个工作,而不是开启一个子进程。特别是这个操作需要的时间比activity存在的时间还要长的时候。例如,在后台播放音乐,向网上上传图片等。使用service可以使进程最少获取到“服务进程”级别的重要级,而不用考虑activity目前是什么状态。
2 Android的单线程模型
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行[6]。
应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序[7]。
如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信。
3 结束语
本文首先介绍了Android的进程与单线程模型及其原则。进一步认识和理解Android的单线程模型及其原则。由于更多地关注Android的进程与单线程模型,本文或许不足以帮助读者全面的认识Android技术,关于文中提到的其他技术细节以及Android的其他相关技术可以访问Android的官方网站进行进一步的了解和学习。
[1]田亚平.智能终端OS之博愈烈Android能否分一杯羹[J].今日电子,2009,(3):23.
[2]http://baike.baidu.com/view/3091265.htm(网络资料)
[3] http://www.cnmsdn.com/html/201010/1287295341ID8320.html(网络资料)
[4]孙晓宇.Android手机界面管理系统的设计与实现[D].北京:北京邮电大学,2009.
[5]许翠苹.手机操作系统列强争霸进行时[J].通讯世界,2010,(7):24-25.
[6]王军伟,武岩,易勇.浅论Android线程模型[J].中国电子商务,2009,(9):72.
[7]张诚洁.Android在线图书阅读器设计与实现[J].微计算机应用,2010,31(10):77-80.