【51CTO独家特稿】在继《李洋谈Android安全框架》系列文章之后,本文李洋老师将向我们介绍《Android应用程序管理》。
1. 简介
Android一词的本义指“机器人”,谷歌的基于Linux平台的开源手机操作系统以“Android”命名,以机器人为标志。Android系统早期由谷歌开发,后由开放手持设备联盟(Open Handset Alliance,OHA)开发。OHA由谷歌与34家厂商一起于2007年11月5日创立,包括手机制造商、电信运营商和芯片制造商,如下表。OHA创立的同时,谷歌发布了Android系统。
Android采用了软件堆层(Software stack,又名以软件叠层)的架构,主要分为三部分,包括底层Linux内核、Android中间件和系统关键应用程序。Android中间件以Dalvik虚拟机为基础构成,这是由谷歌自己设计开发的Java Virtual Machine。Android上的应用使用Java语言开发,Android SDK为在Android系统上开发Java应用提供了一整套开发工具和API。
2. 应用程序组成
Android的每个应用程序都对应一个安装包,称之为APK (Android Package), 在系统运行时每一个APK对应一个操作系统进程。
下图所示为APK中所包含的组件
(1)Activity:Activity就是一个界面,这个界面里面可以放置各种控件,如短信编辑框等;
(2)Service:服务是运行在后台的功能模块。如文件下载、音乐播放程序等;
(3)Content Provider:它是Android平台应用程序间数据共享的一种标准接口,它以类似于URI(Universal Resources Identification)的方式来表示数据,如:content://contacts/people/1101;
(4)Broadcast Receiver:与此组件相关的概念是Intent,Intent是一个对动作和行为的抽象描述,负责一个程序的组件之间、不同程序之间进行消息传递,Intent包括目标组件地址和消息数据。Broadcast Receiver组件负责实现侦听Intent消息并对其作出反应。
下图为APK中各组件之间的典型关系示例。
3. 应用程序生命周期管理
Android的每个应用程序以一个Linux进程运行,默认情况下,在进程中执行一个单一的线程,应用程序所有的组件均在这个进程的这个线程中运行。当然也可以为任意进程衍生出其它线程。Android系统会尽可能长的延续一个应用程序进程执行,确保其正常执行结束。除了应用程序执行结束后,正常释放内存外,在内存过低超过阀值时,系统仍然会不可避免需要移除旧的进程。为决定保留或移除一个进程,Android将每个进程都放入一个“重要性层次”中,依据则是它其中运行着的组件及其状态。重要性***的进程首先被消灭,然后是较低的,依此类推。重要性共分五层,依据重要性列表如下:
(1)前台进程是用户操作所必须的, 任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。
(2)可视进程没有前台组件,但仍可被用户在屏幕上所见。可视进程依然被视为是很重要的,非到不杀死它们便无法维持前台进程运行时,才会被杀死。
(3)服务进程是由startService() 方法启动的服务,它不会变成上述两类。尽管服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比如在后台播放mp3 或者从网上下载东西)。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。
(4)背景进程包含目前不为用户所见的activity。这些进程与用户体验没有直接的联系,可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。
(5)空进程不包含任何活动应用程序组件。这种进程存在的唯一原因是作为缓存以改善组件再次于其中运行时的启动时间。系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。
Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。比如说,如果一个进程中同时有一个服务和一个可视的activity,则进程会被判定为可视进程,而不是服务进程。
此外,一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供服务的进程级别永远高于使用它服务的进程。
4. 实现应用程序开机自动启动
任何一个Android应用程序要实现开机自动启动, 必须做到如下两点:
1) 继承BroadcastReceiver类,并实现onReceive()方法,在此方法中启动应用程序。
2) 在应用程序的AndroidManifest.xml文件中订阅BOOT_COMPLETED消息,如下:
- <receiver android:name="HelloWorldStartupIntentReceiver" >
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- </intent-filter>
- </receiver>