Android应用及应用管理简介
平台基础知识
一、概述
07年,Google公司推出了基于Java语言的Android平台,引起了IT业界的一致关注,同年,播思通讯公司开始研发基于其的OPhone平台。
08年,第一款Android手机G1面世,这款Google为HTC量身打造的滑盖手机由T Mobile发行,获得了用户的极大好评,也为整个Android平台的正式商用作出了榜样。
09年,将是OPhone/Android手机的第一个井喷年,播思通讯联合中国移动和各个手机厂商即将推出多款触屏手机。同时,Android社区也日趋壮大,已拥有各种应用五百多个,并在快速增长之中。
本文将对Android应用结构及Android系统的应用管理加以介绍。
本文面对的读者是对Android应用的研发人员、或有过Android开发经验的入门者。
二、Android应用结构
什么是Android应用?
理解什么是Android应用是Android入门所必须的,也是了解应用管理的前提。
那什么是Android应用呢?即指基于Android开发,编译,运行在Android平台的应用。这种应用在编译阶段被打成一个jar包,以.apk 结尾,包内包含了所有运行阶段需要的代码与资源,其中主要分为三块:描述文件AndroidManifest.xml、代码段和运行时资源。
AndroidManifest.xml
AndroidManifest.xml是Android应用的描述文件,它描述了该应用的相关信息,主要包括以下各个元素。
包名(package)
指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。
认证(certificate)
指定本应用程序所授予的信任级别,目前有的认证级别有platform(system)、shared、media以及应用自定义的认证。不同的认证可以享受不同的权限。
权限组(permission-group)
权限组的定义是为了描述一组具有共同特性的权限。Android系统中预订了一些组,它们是:
* android.permission-group.COST_MONEY
* android.permission-group.MESSAGES
* android.permission-group.MESSAGES
* android.permission-group.PERSONAL_INFO
* android.permission-group.LOCATION
* android.permission-group.NETWORK
* android.permission-group.ACCOUNTS
* android.permission-group.HARDWARE_CONTROLS
* android.permission-group.PHONE_CALLS
* android.permission-group.SYSTEM_TOOLS
* android.permission-group.DEVELOPMENT_TOOLS
从字面意思我们就可以理解每个组的特性。具体含义可以参考SDK文档。
权限(permission)
权限用来描述是否拥有做某件事的权力。Android系统中权限是分级的,前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。
系统中所有预定义的权限根据作用的不同,分别属于不同的级别。
对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用拥有platform级别的认证才能申请。
当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。
系统应用可以使用任何权限。权限的声明者可无条件使用该权限。
目前Android系统定义了许多权限,通过SDK文档用户可以查询到哪些操作需要哪些权限,然后按需申请。
权限树(permission-tree)
权限树的设置是为了统一管理一组权限,声明于该树下的权限所有者归属该应用。系统提供了API,应用可以在运行时动态添加。
? PackageManager.addPermission()
使用权限(uses-permission)
应用需要的权限应当在此处申请,所申请的权限应当被系统或某个应用所定义,否则视为无效申请。
同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用无法申请高级权限。
SDK(uses-sdk)
标识本应用运行的SDK版本。高兼容性的应用可以忽略此项。
application
application是Android应用内最高级别(top level)的模块,每个应用内最多只能有一个application,如果应用没有指定该模块,一个默认的application将被启用。
application将在应用启动时最先被加载,并存活在应用的整个运行时生命周期。因此一些初始化的工作适合在本模块完成。
Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存,“enable”表示本应用当前是否应当被加载。
其它相关属性请参考SDK文档,开发者可以根据需要添加。
在AndroidManifest.xml文件中,运行时模块的定义都作为本模块的子元素。
当运行时模块被调度时,如果应用没有启动,将首先启动应用进行初始化,然后调度对应模块。
activity
activity是application模块的运行时子元素,标识了一个UI。除了application,一个应用可以声明并实现零至多个其它运行时模块,activity也同样。
activity也包含了许多定义它工作状态的属性,其中:“name”是必须的,它指定了该activity所在的文件名,如果该文件所属包不同于该应用的包名(即本描述文件的最开始处),那么名字前面需要加入所在包名。
activity通过增加intent-fliter来标识哪些intent可以被处理,同时intent也是调度activity的主要参数。
作为一个运行时的对象,activity的调度方式大致分为两种:一种是指定activit所在类名直接调度,另一种是利用activity可以处理的intent进行调度。
同一种intent可以被不同应用的不同activity处理。当出现此种情况时,用户需要选择具体的activity。
receiver
receiver也是application的运行时子元素。
receiver通过增加intent-fliter来标识它需要接受哪些intent。当收到intent后,receiver将根据不同的intent进行不同的处理。
当一个Intent发出后,所有注册了该intent的receiver都将会收到,系统会根据receiver在系统中的注册次序顺序发送。当一个receiver处理完该Intent后,系统才会向下一个receiver发送。
当一个receiver有多个未接收的intent时,将按照intent发送的次序顺序接收。
service
service也是application的运行时子元素。Service属于后台模块,启动后将长时间运行,除非停止该service或所在应用进程被杀死。
service从功能上分为两种,一种是服务于本应用,此时的service是一个普通的运行时模块,另一种是服务于所有应用或对应应用,此时需要定义API并将之公布来与其它应用进行交互。
service需要通过API:startService()添加到service管理器中,添加后即在后台运行。它接受外界信息的方式分两种:一种是增加IntentFilter来接收intent,一种是外界应用调用该service所定义的API。
provider
provider也是application的运行时子元素。它继承于ContentProvider,是对该应用管理的用户数据的结构化接入,是基于数据库操作方式的封装。
如果应用允许外部应用访问/管理它的用户数据,provider是Android平台提供的最佳方式。
activity-alias
顾名思义,是已有activity的别名。
uses-library
标识应用启动所必须的共享库。
代码段
应用所有的java文件被放入一个包结构,该包命名为classes.dex。
运行时资源
Android应用运行时所需的各种资源有layout,drawable,string,style等类型。编译后所有资源统一存放在项目路径/res里,按照用途的不同存放在各个子文件夹中。
编译阶段,所有resource将被排序,每个resource在程序包中都拥有唯一的标识,同时一个名为resources.arsc的文件生成并被置入安装包中,该文件包含了所有索引以供运行时快速查询。而resource以同样目录结构组织放入安装包中。
应用管理
应用管理是对系统中所有应用整个生命周期的管理。Android系统中,应用都是以.apk文件的形式存在,因此应用管理也可以简单理解为对.apk文件的管理。
从一个应用在系统中的生命周期来看,应用管理可以分为安装,卸载和使用等部分。
应用安装
Android系统中,安装应用时不能指定安装目录,所有的应用都只能装在预置文件夹下。
Android系统支持数种安装方式,而播思通讯的Ophone平台在此基础上支持更多方式。
使用预置安装工具
Android系统中,应用安装包.apk文件属于默认支持的文件类型,它的的mime type被定义为"application/vnd.android.package-archive"。
系统内置了安装工具来解析并安装.apk文件。你可以从OPhone平台的文件管理器中找到对应安装包,点击即可启动安装步骤。这里给出了相应的代码,有兴趣的开发者可以尝试使用。
Intent apkintent = new Intent(Intent.ACTION_VIEW); final Uri puri = Uri.fromFile(new File(path)); //path is the path of source apk apkintent.setDataAndType(puri, "application/vnd.android.package-archive"); startActivity(apkintent);
Uri packageURI = Uri.parse("package:"+packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); startActivity(uninstallIntent);