Android 四大组件
目录
一、Activity(活动)
1.1 什么是Activity?
1.2 Activity四种基本状态
1.3 Activity状态转换
1.4 Activity的生命周期
1.5 示例
页面场景描述
生命周期方法的具体应用
用户操作与生命周期的对应关系
二、Service(服务)
2.1 什么是Service?
2.2 Service的生命周期
2.3 Service的启动方式
三、BroadcastReceiver(广播接收器)
3.1 什么是BroadcastReceiver
3.2 BroadcastReceiver的类型
3.3 BroadcastReceiver的生命周期
3.4 BroadcastReceiver的实现原理
四、ContentProvider(内容提供者)
4.1 什么是ContentProvider?
4.2 ContentProvider的特点
4.3 ContentProvider的核心方法
在Android开发的世界里,有四个核心组件如同四根支柱,支撑着整个APP大厦。分别是Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和 ContentProvider(内容提供者)。
(1)Activity:通俗来讲其实就是APP上用户看到的一个个页面,Activity组件负责界面展示、处理用户交互、进行数据传递等。
(2)Service:无界面的后台组件,用于执行长期运行的操作。比如说应用商店后台下载东西、后台播放QQ音乐等等。
(3)BroadcastReceiver:手机里的“消息喇叭”,用于监听系统或者应用发出的全局事件的组件,比如网络状态的变化、充电状态的变化等等。
(4)ContentProvider:应用间的“数据共享存储桥”,是管理跨应用访问的组件,通过URI来标识数据,比如说咱们的手机通讯录是不是可以被多个应用访问读取。
这四大组件各自承担着不同的职责,彼此之间协同工作,共同为用户提供一个流畅的APP体验。那么废话不多说,接下来我将带领大家一一认识并且熟悉这四大组件。
一、Activity(活动)
1.1 什么是Activity?
Activity是Android应用中用于展示用户界面的组件。通俗来说,每个Activity就代表咱们的一个屏幕,我们可以通过它与应用程序进行交互。
你可以把Activity想象成手机屏幕上的一个“页面”。比如,当你打开一个App时,看到的第一个界面就是一个Activity;点击某个按钮跳转到另一个界面,那就是另一个Activity。每个Activity就是一个独立的“屏幕”,负责展示内容和与用户交互。
举例:
打开微信,首页是一个Activity。
点击跟你朋友的聊天窗口,跳转到聊天界面,这是另一个Activity。
点击“发现”按钮,跳转到“发现”页面,这又是一个新的Activity。
1.2 Activity四种基本状态
(1)Active/Running
一个新 Activity 启动入栈后,它显示在屏幕最前端,处于栈的最顶端(Activity栈顶),此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态。
(2)Paused
当 Activity失去焦点, 被一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶,此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接,Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见,但已经失去了焦点故不可与用户进行交互。
(3)Stopped
如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。
(4)Killed
如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。
1.3 Activity状态转换
当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。
1.4 Activity的生命周期
在Android应用开发中,Activity作为单个屏幕上的一个应用程序组件,是用户交互的主要窗口。每个Activity都有其生命周期,它描述了Activity从创建到销毁的一系列状态和转换。理解Activity生命周期的重要性不言而喻,它确保了用户界面(UI)能正确响应各种系统和用户的操作。
Activity的生命周期是指从创建到销毁的整个过程,Android系统通过一系列回调方法来管理Activity的生命周期。涉及的几个关键回调函数如下:
-
onCreate():Activity被创建时调用。比如,当你点击CSDN,系统会创建CSDN的MainActivity,并且调用OnCreate()这个方法。通常会在这里初始化界面和变量,这时候我们看到的是一片空白。
-
onStart():Activity即将可见时调用。比如,CSDN的首页即将显示在屏幕上。
-
onResume():Activity获得焦点,用户可以与之交互时调用。比如,CSDN首页面完全显示出来,用户可以点击各种按钮进行操作。
-
onPause():Activity失去焦点时调用。比如,用户按了Home键回到桌面,或者跳转到另一个页面。
-
onRestart():Activity从停止状态重新启动时调用。首页Activity从后台回到前台。
-
onStop():Activity不再可见时调用。比如,你点击文章详情页跳转到了文章里面。首页面被完全覆盖。
-
onDestroy():Activity被销毁时调用。比如,用户关闭了页面。
1.5 示例
页面场景描述
让我们通过一个 在线音乐播放器的主页面 来具体理解 Activity 生命周期的实际应用。这个页面包含播放控制、歌曲列表和专辑封面等元素,用户可以随时切换到其他应用或返回。
假设我们有一个音乐播放器的 MainActivity
,布局包含:
-
顶部导航栏(搜索框、用户头像)
-
中间专辑封面(带旋转动画)
-
底部播放控制栏(播放/暂停、进度条)
-
背景音频服务(即使切后台也能继续播放)
生命周期方法的具体应用
生命周期方法 | 触发时机描述 | 关键操作 |
| 用户首次打开 App 时,Activity 第一次创建 | 1. 初始化布局( 2. 绑定视图组件(如 3. 初始化 ViewModel 或数据加载器 |
| Activity 即将可见,但还未获取焦点(处于“可见但不可交互”状态过渡 ) | 1. 注册广播接收器(如监听耳机插拔事件) 2. 建立数据库连接或启动本地服务 |
| Activity 获取焦点,进入“前台可交互”状态,用户可直接操作界面 | 1. 启动动画(如专辑封面旋转) 2. 恢复暂停的音频播放(若之前因切后台等暂停过 ) 3. 刷新 UI 状态(如更新当前播放时间、同步最新数据展示 ) |
| 用户切换到其他 Activity(如点击通知栏打开新页面、按 Home 键回到桌面 ),当前 Activity 失去焦点但尚未完全不可见 | 1. 暂停动画 2. 保存临时数据(如当前播放进度、表单填写的未提交内容 ) |
| Activity 完全不可见(如用户打开新 App 占满屏幕、设备锁屏 ) | 1. 停止长时间运行的操作(如正在进行的网络请求、轮询任务 ) 2. 注销广播接收器(避免不必要的事件监听,减少资源占用 ) |
| Activity 从“停止状态”恢复(如用户从后台任务列表切回之前打开的 App ) | 无需手动实现复杂逻辑,系统自动调用 |
| Activity 被销毁,常见于用户按返回键退出页面、系统因内存不足回收该 Activity 实例 | 释放所有资源(如解除与服务的绑定、关闭数据库连接、释放图片缓存等 ),确保无内存泄漏等问题 |
用户操作与生命周期的对应关系
用户操作 | 触发的生命周期方法 | 播放器行为 |
首次打开 App |
| 加载专辑封面、显示播放控制按钮、开始播放音乐(如果上次退出时正在播放)。 |
按 Home 键切到后台 |
| 暂停专辑封面动画,音乐继续在后台播放(由 Service 管理)。 |
从后台切回 App |
| 恢复专辑封面动画,UI 刷新当前播放状态。 |
点击通知栏中的“暂停”按钮 |
| 暂停音乐播放,UI 更新播放按钮图标(但 Activity 未进入后台)。 |
按返回键退出 App |
| 停止音乐播放,释放所有资源。 |
系统内存不足,回收 Activity |
| 音乐服务继续运行,但 Activity 被销毁,下次打开时需重新 |
通过这个音乐播放器的例子,可以直观理解 Activity 生命周期在实际开发中的应用,以及如何根据用户操作合理管理资源和状态。
二、Service(服务)
2.1 什么是Service?
你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面,默默地在后台干活,比如播放音乐、下载文件、处理网络请求等。即使你退出了App,Service也可以继续运行。
举例:
你在听QQ音乐时,切换到微信聊天,音乐还在播放,这就是Service在后台工作。
你在应用商店下载王者荣耀时,即使你退出了应用商店,下载任务仍然在继续,这也是Service的功劳。
简单总结就是,Service就是一个无界面的后台组件,用来执行需要长期运行的操作。
2.2 Service的生命周期
service整体的生命时间是从onCreate()被调用开始,到onDestroy()方法返回为止。和activity一样,service在onCreate()中进行它的初始化工作,在onDestroy()中释放残留的资源。
service积极活动的生命时间(active lifetime)是从onStartCommand()或onBind()被调用开始,它们各自处理由startService()或bindService()方法传过来的Intent对象。
-
如果service是被开启的,那么它的活动生命周期和整个生命周期一同结束。
-
如果service是被绑定的,那么它的活动生命周期是在onUnbind()方法返回后结束。
2.3 Service的启动方式
Service有两种主要类型:
-
Started Service(启动式Service)
特点:通过startService()启动,会一直运行,直到任务完成或调用stopSelf()。
适用场景:执行一次性任务,比如下载文件、播放音乐。
生命周期:onCreate() -> onStartCommand() -> onDestroy()。
-
Bound Service(绑定式Service)
特点:通过bindService()启动,允许多个组件(比如Activity)绑定到同一个Service。当所有组件解绑后,Service会被销毁。
适用场景:提供长期服务,比如后台计算、数据同步。
生命周期:onCreate() -> onBind() -> onUnbind() -> onDestroy()。
三、BroadcastReceiver(广播接收器)
3.1 什么是BroadcastReceiver
你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“广播消息”,并在收到消息后执行相应的操作。简单来说,广播接收器就是用来接收和处理广播消息的组件。
举例:
手机电量低时,系统检测到了,会发出一个“低电量”的广播,广播接收器可以接收到这个消息,并提醒你充电。
你下载一个App时,下载完成后,系统会发出一个“下载完成”的广播,广播接收器可以接收到这个消息,并通知你安装。
3.2 BroadcastReceiver的类型
广播分为两种类型:
-
系统广播
特点:由系统发出,比如电池电量低、网络状态变化、屏幕开关等。
比如:ACTION_BATTERY_LOW电池电量低,ACTION_BOOT_COMPLETED设备启动完成。
-
自定义广播
特点:由应用发出,用于应用内部或应用之间的通信。
比如:在App中定义一个广播,比如“任务完成”,然后在其他地方接收并处理。
3.3 BroadcastReceiver的生命周期
广播接收器的生命周期非常简单,主要包括以下两个阶段:
-
接收广播:当广播发出时,系统会创建广播接收器的实例,并调用它的onReceive()方法。
-
完成任务:onReceive()方法执行完毕后,广播接收器的实例就会被销毁。
也就是说,广播接收器的生命周期非常短暂,它只存在于接收到广播并处理完广播的这段时间内。
3.4 BroadcastReceiver的实现原理
Android
中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。模型中主要有 3
个角色:
-
消息订阅者( 广播接收者 )
-
消息发布者( 广播发布者 )
-
消息中心(
AMS
,即Activity Manager Service
)
四、ContentProvider(内容提供者)
4.1 什么是ContentProvider?
Content Provider属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider为存储和读取数据提供了统一的接口。Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口
Android系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的Content Provider,这些都位于android.provider包下。持有特定的许可,可以在自己开发的应用程序中访问这些Content Provider。
ContentProvider其实就是应用间的“数据共享桥”,是管理跨应用访问的组件,通过URI来标识数据。简单来说,ContentProvider就是用来共享和管理数据的组件。
举例:你手机里的通讯录,存储了所有联系人的信息。如果你想把这些联系人信息分享给其他App,就可以通过ContentProvider来实现。
4.2 ContentProvider的特点
-
数据共享:可以让不同应用之间共享数据。比如,通讯录App可以通过ContentProvider将联系人信息共享给其他App。
-
统一接口:提供了一套标准化的接口(比如query()、insert()、update()、delete()),其他应用可以通过这些接口访问数据。
-
数据安全:可以通过权限控制来保护数据。比如,你可以设置只有特定应用才能访问你的数据。
4.3 ContentProvider的核心方法
-
query():查询数据。
-
insert():插入数据。
-
update():更新数据。
-
delete():删除数据。
-
getType():返回数据的MIME类型。