安卓应用是由Java程序语言编写。“安卓软件开发包工具”把你的代码——同任何数据和资源文件一起——编译进一个APK文件:一个安卓文件包,带有”.apk”后缀的存档文件。APK文件包含了安卓应用的所有内容,是装备卓系统的设备用来安装应用的文件。
一旦安装到设备上,每个安卓应用都在自己的安全沙箱里:
通过这种方式,安卓系统实现了最小权限原则。即,默认情况下,每个应用除了拥有完成工作所需组件的访问权限,不再有其他的访问权限。这样创建了一个非常安全的环境,在这里每个应用都不能访问未获许可的系统部分。
但是,有办法来让一个应用与其他应用共享数据或让一个应用访问系统服务:
这篇文档的剩余部分将向你介绍,有关安卓应用如何存在于系统之中的基础知识:
应用组件
应用组件是安卓应用的重要组成部分。每个组件都是系统进入应用的一个不同的入口点。实际上不是所有的组件都是用户的入口点,有些是彼此的依赖,但是每个都作为自己的一个实体存在,并具有一个特定的作用——每个组件都是帮助定义应用总体行为一个独特的组成部分。
有四中不同的应用组件类型。每种类型都提供了不同的目的,拥有不同的生命周期,用来定义它是如何被创建和删除。
这里有四种不同的应用组件类型。
活动活动用界面来表示一个单独的屏幕。例如,电子邮件应用可能有一个显示新邮件列表的活动,一个写邮件的活动,一个读邮件的活动。尽管这些活动一起构成了邮件应用的一个连贯的用户体验,但每个活动都是独立于其他的。因此,不同的应用可以启动这些活动中的任意一个(如果邮件应用允许的话)。例如,相机应用可以启动邮件应用中的写邮件活动,来让用户共享一张图片。
活动由Activity的子类来实现。你可以到活动开发者引导去了解更多信息。
服务服务是运行在后台的组件,执行长期运行的操作或执行远端处理的工作。服务不提供界面。例如,服务可能在后台播放音乐当用户在不同的应用中时,或者可能通过 络来获取数据而不会阻塞用户交互的活动。另一个组件,如另一个活动,可以启动这个服务并让它运行或绑定到它的上面来与其交互。
服务由Service的子类实现。你可以到服务开发者引导去了解更多信息。
内容提供者内容提供者管理一组共享的应用数据。你可以在文件系统,数据库, 络,或任何应用可以访问到的持久存贮数据的地方。其他的应用可以通过内容提供者访问甚至修改数据(如果内容提供者允许)。例如,安卓系统提供了一个管理用户联系人的内容提供者。因此,任何具有适当权限的应用查询内容提供者的一部分来读写特定人的信(例如ContactsContract.Data)。
内容提供者也用于读取私有或非共享数据。例如,笔记本实例应用使用内容提供者保存笔记。
内容提供者由ContentProvider的子类实现,并且必须实现让其他应用执行事务的一套API的标准接口集。更多信息,请参考内容提供者开发者引导。
广播接收者由BroadcastReceiver的子类实现,每个广播都作为一个Intent对象传递。更多信息,请参考BroadcastReceiver类。
安卓系统的一个独特方面是任何应用都可以启动另一个应用的组件。例如,你想要用户使用相机拍摄照片,也许有其他的应用可以做到,你的应用可以直接使用而不用自己开发一个拍摄照片的活动。你不用集成,甚至不用连接相机应用的代码。相反,你可以简单的启动相机应用的活动来拍摄照片,完成后,照片会传回你的应用以供使用。对用户来说,好像相机应用其实就是你的应用的一部分。
当系统启动组件后,为其应用启动进程(如果还未运行)并初始化组件所需的类。例如,如果你的应用启动了相机应用的活动拍摄相片,进程中的活动属于相机应用,而不是在你的应用的进程中。因此,不像大多数其他系统的应用,安卓应用没有一个单独的入口(比如没有main() 函数)。
应为系统在带有限制其他应用访问许可的独立进程中运行每一个应用,你的应用不能直接激活其他应用的组件。但是,系统可以。所以,为了激活其他应用的组件,你必须递给系统一个消息来指定一个启动特定组件的意图。然后,系统为你激活这个组件。
激活组件
其中4种组件类型的3个——活动,服务,广播接收者——由一种叫意图的异步消息激活。意图在运行期间绑定彼此独立的组件(你可以把他们想象为向其他组件请求操作的消息),无论这个组件是属于你的应用,还是其他的。
意图由一个Intent对象创建,它定义了一个激活一种组件或一类组件的消息——意图可以分为显示或隐式的。
对于活动和服务,意图定义了要执行的操作(如,要”查看“或”发送“的东西),可能指定数据要使用的URI。例如,可能通知活动显示图片或打开 页的请求。在某些情况下,你可以启动一个活动来接收结果,这种情况下,也在意图中返回结果(例如,你可以发出一个意图让用户选择一个私人联系人返回给你——返回的意图包含了指向选择联系人的URI)。
对于广播接收者,意图简单的定义了要广播的通知(例如,指示电量低的广播,其中仅包含了表明“电量低”的一个已知的动作字符串)。
另一种组件类型,内容提供者不由意图激活。相反,它在被ContentResolver请求时激活。内容解析器处理所有与内容提供者的直接交易,使正与提供者交易的组件不必与其交互,相反直接调用ContentResolver对象的方法。这在内容提供者与组件请求信息间留下了一层抽象(为了安全)。
几种类型的组件有各自激活的方法:
更多关于意图的信息请参考意图和意图过滤器文档。更多关于启动特定组件的信息也由下列文档提供:活动,服务,内容提供者。
清单文件
在安卓系统可以启动应用组件之前,系统必须知道那些组件存在,靠读取应用的AndroidManifest.xml文件(“清单”文件)。你的应用必须在这个文件里声明所有的组件,并把它放到你的应用项目的根目录。
清单除了声明应用组件还做了许多事情,例如:
声明组件
清单的主要作用是告知系统应用的组件。例如,清单可以如下声明一个活动:
...
在<application>元素中,android:icon 属性指定标识应用的图标资源。
在<activity>元素中,android:name属性指定了Activity子类的全路径名称,android:label属性指定了用来显示用户可见的活动标题的字符串。
你必须使用这种方式声明所有的应用组件:
你包含在代码中但没在清单中声明的活动,服务和内容提供者是不被系统所见的,因此,永远不能运行。但是,广播接收者既可以在清单中声明,也可以在代码中动态的创建(作为BroadcastReceiver对象),通过调用regisiterReceiver来在系统中注册。
更多关于如何为你的应用构建清单,参考AndroidManifest.xml文件文档。
声明组件功能
如上所述,在激活组件中,你可以使用Intent启动活动,服务,广播接收者。你可以通过在意图中显示为目标组件命名(使用组件的类名)来启动。但是,意图真正强大的地方在于隐式意图的概念。隐式意图简单的描述要执行操作的类型(还可以选择想要执行操作的数据),让系统来找到可以执行这个操作的组件并启动它。如果有多个可以执行该意图所述操作,那么让用户来选择一个来使用。
系统识别可以响应意图的方法是通过拿收到的意图与设备上其他应用在清单中所提供的意图过滤器进行比较。
当在你应用的清单中声明一个活动时,你可以选择包含声明活动功能的意图过滤器,来让它能响应其他应用的意图。你可以通过在组件的声明元素的子节点中添加<intent-filter>元素来为组件声明意图过滤器。
例如,你已经创建了一个带有写邮件的电子邮件应用,可以像这样声明一个响应“发送”意图(为了发送一封新邮件)的意图过滤器:
...
然后,如果其他应用创建了带有ACTION_SEND的操作的意图,并传给startActivity,系统可能启动你的应用来让用户来草拟和发送一封邮件。
更多关于创建爱你意图过滤器的信息,请参考意图和意图过滤器文档。
声明应用需求
有许多种设备装备了安卓系统,但并不是所有都提供了相同的特性和功能。为了让你的应用不会安装到缺失应用所需特性的设备上,通过在清单中声明设备和软件所需来清晰的为应用支持设备类型清晰的定义一个配置文件是重要的。这些声明中的大多数仅是提供信息的,系统不会读取他们,但,额外的服务如Google Play确实读取他们,在设备上搜索应用时为用户提供过滤器。
例如,如果你的应用需要摄像头,使用安卓2.1引入的API,你应该像这样在清单中声明这些需求:
...
现在,没有摄像头,安卓版本低于2.1的设备,不能从Google Play安装你的应用。
但是,你也可以声明你的应用使用摄像头,但不需要它。这种情况,你的应用必须设置required属性为”false”并在运行时检测设备是否有摄像机,禁用任何相应的摄像头特性。
更多关于如何管理应用如何兼容不同设备的信息由设备兼容文档提供。
应用资源
安卓应用不仅由代码组成——它还需要独立于代码的资源,如图片,声音文件,和任何应用视觉展现有关的东西。例如,你应该用XML文件定义动画,菜单,央视,颜色,和活动界面的布局。使用应用资源使得更新应用的各种特性变得容易,不用修改代码,并且——通过提供一组替换资源——让你能够为各种设备配置优化应用(如不同的语言,屏幕尺寸)
SDK构建工具为每个资源定义一个整数ID,你可以在代码中或XML中定义的其他资源中引用。例如,如果你的应用包含了一张图形文件叫logo.png(保存在res/drawable/目录),SDK构建工具包会生成一个叫R.drawalbe.logo的资源ID,你可以用来引用那张图片并插入到你的界面中。
提供独立于代码的资源最重要的一个概念是为不同的设备配置提供替换资源的能力。例如,通过在XML中定义一个UI字符串,你可以把它翻译成不同的语言并保存在各自的文件中。然后,根据你附加到资源目录名称(例如res/values-fr/ 代表法语字符串值)和用户语言设置的语言修饰符,安卓系统会应用相应的语言字符串到你的UI中。
安卓系统为替换资源提供了许多不同的修饰符。修饰符是一个缩略字符串,包含在资源目录中,用来定义应该为其使用那些替换资源的设备配置。再举一个例子,你经常应该根据设备朝向和大小来为活动创建不同的布局。例如,当设备屏幕处于纵向(高),你可以想要一个按钮垂直排列的布局,但是,当屏幕处于横向时(宽),按钮应该按照水平对齐。要根据朝向改变布局,你可以定义两套不同的布局并为每个布局资源目录名称应用相应的修饰符。然后,系统会自动根据当前的朝向来应用合适的布局。
更多关于应用可以使用的不同资源种类,和如何根据不同的设备配置创建替换资源的信息,请阅读提供资源。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!