Android学习 – Android应用介绍
上一篇我们简单介绍了Android的概念,我们知道它自带发邮件功能就是一个Android应用,而做为开发人员,我们最终就是为了开发Android的第三方应用,所以必须对Android应用的本质有所了解。
Android应用是使用Java语言开发的,当你敲完代码,Android SDK Tools负责将这些代码连同数据以及资源文件一起打包编译成一个后缀为.apk的文件,然后这个apk文件被安装到支持Android系统的移动设备上,就变成了一个Android应用。每一个被安装到设备中的Android应用都有各自的安全沙箱:
- Android操作系统是个基于Linux的多用户系统,每一个Android应用都是不同的用户
- 每一个Android应用在系统中有唯一的UserID,这个ID只有系统知道而应用本身是不知道的。系统为设置了一个应用所有文件的访问权限,只有被分配到的UserID的应用才能访问他们。
- Linux的每个进程有自己的VM,因此不同应用的代码是隔离运行的。
- 默认情况下,每个应用运行在自己的进程中,当应用的任何一个组件需要运行时,Android会启动进程;当进程不再需要或者系统需要为其他程序恢复内存时,会关闭进程。
所以,Android系统是实现了一个最小特权原则,就是说每个应用只能访问自己工作所需要的组件。但事实上,Android为不同应用间共享数据以及应用访问系统服务提供了方法:
- 系统可以为两个应用安排同样UserID,这样他们可以互相访问对方的数据以及资源,甚至为可节省系统资源,他们也可能被安排到同一个进程中运行,共享同一个VM。
- 应用程序可以请求访问其他应用的数据如Android默认应用的联系人、短信、摄像头等。
以上内容说明了一个Android应用是如何在系统中存在的,接下来将介绍以下内容:
- 一个应用的核心组件
- 为声明应用组件以及生命应用所需设备特性的manifest文件
- 独立于应用程序代码的资源文件,籍此让你可以通过配置使应用更优雅的呈现给众多不同终端设备
Android应用的核心组件
这些组件是构建个一个应用的基石,系统通过这些组件进入到一个应用。每种组件发挥着不同的功能,有着不同的生命周期,你可以根据需要去使用这些组件来完成一个应用所要实现的功能。以下是4种不同的核心组件:
-
Activity
简单的说,一个Activity展现了一个用户界面,就像我们在PC中的一个应用程序的一个窗口。比如Android核心应用中的邮件,其中发邮件这个界面就是一个Activity。Android应用呈现给用户的就是一系列Activity,一个Activity可以去启动同一应用中的其他Activity,甚至不同应用中的Activity。
-
Service
从字面意思上理解,Service是服务,它没有用户界面,在后台长时间运行。比如你在浏览一个Activity的时候,后台正在播放音乐或者正在从网络上获取数据。
-
Content Provider
Content Provider管理着Android应用的数据,你可以将应用的数据存放在文件系统,SQLite数据库,或者网络上,通过Content Provider可以查询和更改这些数据。
-
Broadcast receivers
用于接收广播的组件,比如系统广播的电池电量不足。
Android设计的一个独特的地方就是任何应用都可以激活另一个不同应用的组件,所以说Adroid应用的组件可以单独启动,当你需要激活一个应用的某个组件,系统会实例化该组件所需要的类然后启动,从这点上来说,跟PC的应用程序不同,Android应用并没有单一的启动入口(没有main函数)。我们上边说过,每个Android应用工作在各自的带有文件权限的进程中,所以一个应用不能直接激活另一个应用的组件,你需要向系统发送一个消息,来说明你想要激活哪个组件,系统会为你激活。
激活组件
上边提到的Activity、Service、Broadcast receinvers由一个叫做intent的异步消息激活,Intent绑定了需要交互的两个组件。
对Activity和Service来说,Intent定义了需要执行的操作(比如查看或发送什么东西),并且可能指定了操作数据的URI。e.g. 一个Intent可以像一个Activity传达打开图片的请求。另一种情况,当你激活一个Activity并要求返回结果,这个返回结果也将包含在Intent中。e.g.激活联系人列表的Activity并返回选中的联系人,Intent将包含了指向选中联系人的URI。
对Broadcast receivers而言,Intent定义了接收的通知。
Content Provider不是由intent激活,当它成为ContentResolver的请求目标时被激活。
下面是几种分别激活不同组件的方法:
- 向startActivity()或startActivityResult()传递Intent对象,用于激活Activity
- 向startService()传递Intent,用于激活Service. 向bindService()传递Intent用于绑定Service
- 向sendBroadcast(), sendOrderedBroadcast(), or sendStickyBroadcast()传递Intent用于初始化Broadcast
- 调用ContentResolver的query()方法用于执行Content Provider的查询操作
Manifest文件
在Android系统启动一个应用组件之前,它需要读取该应用的AndroidManifest.xml文件来知道该组件的存在。这个文件位于每个应用的根目录下,其中声明了该应用的所有组件。除了声明组件,AndroidManifest.xml还负责以下事情:
指定应用开通的系统权限,如访问Internet、读取联系人列表的权限
声明应用所需的最低API Level
声明应用所需或者用到的软硬件功能
其他
声明组件
AndroidManifest.xml最主要的任务就是声明组件,如下声明一个Activity:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application
android:icon="@drawable/app_icon.png" ... >
<activity
android:name="com.example.project.ExampleActivity"
android:label="@string/example_label" ... >
</activity>
...
</application>
</manifest>
<activity>
<service>
<receiver>
<provider>
所有包含在应用中的组件都要像这样声明,否则系统将不能运行组件。例外的是Broadcast receiver也可以在代码中动态创建和注册。
Application Resources
一个Android应用不只由代码构成,还包含一些资源文件,比如图片、配置文件,你可以通过这些资源文件更加灵活的控制应用的视觉呈现效果。
以上只是简单的对Android应用进行介绍,这些是做Android开发的基础,可能看的有点晕,但是相信会对接下来做Android开发有所帮助。
浙公网安备 33010602011771号