[TOC]
Android的四大组件是构成安卓应用的主心骨,该四大组件均需要在AndroidManifest文件中进行注册才能正常运作,四大组件中文翻译过来分别是:
* 活动
* 服务
* 广播接收器
* 内容提供器
## 检测方法
只需要检测AndroidManifest.xml文件中的`<activity>`,`<service>`,`<receiver>`,`<provider>`标签中的`android:name`即可。可以参考下面是例子。
```
<application>
...
<activity></activity>
<service></service>
<receiver></receiver>
<provider></provider>
...
</application>
```
![四大组件](http://wiki-1252789527.picsh.myqcloud.com/scan_model/%E5%9B%9B%E5%A4%A7%E7%BB%84%E4%BB%B6.png)
## Activity
Activity中文翻译为活动,那么活动的概念在Android的世界中不是我们理解的平日里参加的那种`活动`,它是指一种与用户交互的窗口。在Web前端开发中,我们知道使用HTML来绘制与用户交互的UI界面,例如用户进入一个淘宝商城的购物车的界面中中,点击付款的链接后,进入到扫二维码付款的界面。**简单来说,安卓的一个活动就是Web应用中的一个界面。**
而且,安卓里的移动应用体验与桌面版本不同,因为用户与应用的互动并不总是在同一个地方开始。相反,用户旅程通常是非确定性的。例如,如果您从主屏幕打开电子邮件应用程序,则可能会看到电子邮件列表。相比之下,如果您使用社交媒体应用程序然后启动您的电子邮件应用程序,您可能会直接进入电子邮件应用程序的屏幕撰写电子邮件。
`Activity`旨在促进这种模式。当一个应用程序调用另一个应用程序时,调用应用程序将调用另一个应用程序中的活动,而不是作为原子整体的应用程序。通过这种方式,活动可以作为应用与用户交互的入口点。您将活动实现为`Activity`的子类。
活动为应用程序绘制UI的窗口。此窗口通常填充屏幕,也可能小于屏幕并浮动在其他窗口的顶部。通常,一个活动在应用程序中实现一个屏幕。例如,应用程序的某个活动可能会实现主屏幕,而另一个活动会实现“选择照片”的屏幕。
大多数应用程序包含多个屏幕,这意味着它们包含多个活动。通常,应用程序中的一个活动被指定为主要活动,这是用户启动应用程序时显示的第一个屏幕。然后,每个活动可以启动另一个活动以执行不同的操作。例如,某个简单的电子邮件程序的主活动显示邮件的收件箱。然后把这个主活动作为起始点,可以启动其他的活动,比如写邮件和打开个人电子邮件等任务。
虽然活动协同工作以在应用程序中形成一个有凝聚力的用户体验,但每个活动只是松散地绑定到其他活动; 应用程序中的活动通常存在最小的依赖关系。实际上,活动通常会启动属于其他应用程序的活动。例如,浏览器应用可能会启动社交媒体应用的共享活动。
语法:
```
<activity android:allowEmbedded=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:autoRemoveFromRecents=["true" | "false"]
android:banner="drawable resource"
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale",
"uiMode", "orientation", "screenSize",
"smallestScreenSize"]
android:documentLaunchMode=["intoExisting" | "always" |
"none" | "never"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["standard" | "singleTop" |
"singleTask" | "singleInstance"]
android:maxRecents="integer"
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:parentActivityName="string"
android:permission="string"
android:process="string"
android:relinquishTaskIdentity=["true" | "false"]
android:resizeableActivity=["true" | "false"]
android:screenOrientation=["unspecified" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
"sensorLandscape" | "sensorPortrait" |
"userLandscape" | "userPortrait" |
"sensor" | "fullSensor" | "nosensor" |
"user" | "fullUser" | "locked"]
android:stateNotNeeded=["true" | "false"]
android:supportsPictureInPicture=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
. . .
</activity>
````
包含它的文件:`<application>`
可包含:`<intent-filter>`,`<meta-data>`
## Service
Service也就是所谓的`服务`,是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
语法:
```
<service android:description="string resource"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</service>
```
包含它的文件:`<application>`
可包含:`<intent-filter>`,`<meta-data>`
## BroadcastReceiver
BroadcastReceiver即`广播接收器`。Android应用可以从Android系统和其他Android应用发送或接收广播消息,类似于[发布 - 订阅](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern)设计模式。当感兴趣的事件发生时,发送这些广播。例如,Android系统在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。例如,应用程序还可以发送自定义广播,以通知其他应用程序他们可能感兴趣的内容(例如,已下载了一些新数据)。
应用可以注册以接收特定广播。当发送广播时,系统自动将广播路由到已订阅接收该特定类型广播的应用。
一般而言,广播可以用作跨应用程序和普通用户流程之外的消息传递系统。但是,您必须小心,不要滥用机会(资源)去响应广播,或者在后台运行可能导致系统性能降低的作业.
语法:
```
<receiver android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</receiver>
```
包含它的文件:`<application>`
可包含:`<intent-filter>`,`<meta-data>`
## ContentProvider
ContentProvider中文可以翻译为`内容提供程序`。可以对结构化数据集进行访问,还可以封装数据,并提供用于定义数据安全性的机制。内容提供程序是连接一个进程中的数据与另一个进程中运行的代码的标准界面。
如果您想要访问内容提供程序中的数据,可以将应用的Context中的ContentResolver对象用作客户端来与提供程序通信。ContentResolver对象会与提供程序对象(即实现ContentProvider的类实例)通信。 提供程序对象从客户端接收数据请求,执行请求的操作并返回结果。
如果您不打算与其他应用共享数据,则无需开发自己的提供程序。不过,您需要通过自己的提供程序在您自己的应用中提供自定义搜索建议。 如果您想将复杂的数据或文件从您的应用复制并粘贴到其他应用中,也需要创建您自己的提供程序。
Android 本身包括的内容提供程序可管理音频、视频、图像和个人联系信息等数据。
语法:
```
<provider android:authorities="list"
android:directBootAware=["true" | "false"]
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:grantUriPermissions=["true" | "false"]
android:icon="drawable resource"
android:initOrder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readPermission="string"
android:syncable=["true" | "false"]
android:writePermission="string" >
. . .
</provider>
```
包含它的文件:`<application>`
可以包含:`<meta-data>`,`<grant-uri-permission>`,`<path-permission>`
## 查阅更多
更多内容请查阅Google官方文档的说明:
1. Manifest(<https://developer.android.google.cn/guide/topics/manifest/manifest-intro>)
2. Acticity(<https://developer.android.google.cn/guide/components/activities/intro-activities>)
3. Service(<https://developer.android.google.cn/guide/components/services>)
4. Broadcast(<https://developer.android.google.cn/guide/components/broadcasts>)
5. ContentProvider(<https://developer.android.google.cn/guide/topics/providers/content-providers>)