Skip to content

Android - 应用组件

应用组件是 Android 应用的基本构建块。每个组件都是系统或用户进入应用的入口点。这些组件通常通过应用清单文件(AndroidManifest.xml)松散耦合,清单文件描述了每个组件及其交互方式。一些组件还依赖 Jetpack 库(如 ViewModel 或 LiveData)来实现现代架构模式。

应用组件主要有四种类型:

编号组件 & 描述
1Activity
表示带有用户界面(UI)的单一屏幕。它们处理用户交互并显示信息。例如,设置屏幕或照片库。
2Service
在后台执行长时间运行的操作,不提供 UI。示例包括播放音乐、获取数据或同步文件。现代 Android 更推荐使用 WorkManager 执行大多数后台任务。
3Broadcast Receiver
响应系统范围的广播通知或其他应用的自定义广播。示例包括对低电量警告或下载完成做出反应。
4Content Provider
管理一组共享的应用数据。它们允许其他应用查询或修改数据(如果允许)。常用于结构化数据,如联系人或媒体。

Activity 是用户与应用交互的主要方式。它通常呈现全屏 UI。例如,一个电子邮件应用可能有一个 Activity 显示新邮件列表,另一个用于撰写邮件,第三个用于阅读邮件。每个 Activity 都是独立的,但可以协同工作以形成连贯的用户体验,通常由 Jetpack Navigation 组件管理。

Activity 是作为 androidx.appcompat.app.AppCompatActivity(或非常基础的场景下使用 android.app.Activity,但推荐使用 AppCompatActivity 以获得兼容性和主题等特性)的子类实现的:

package com.example.myapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 你的 UI 初始化代码在这里
}
}

Activity 通过回调方法(如 onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy())管理其生命周期。

Service 是一个在后台运行的组件,用于执行长时间运行的操作或为其他应用提供功能。它不提供用户界面。例如,Service 可以在用户处于不同应用时播放音乐,或者在不阻塞用户与 Activity 交互的情况下通过网络获取数据。

Service 有不同类型:

  • 前台 Service: 执行对用户可见的操作(例如,音乐播放)。它们必须显示一个持久性通知。
  • 后台 Service: 执行用户不直接注意到的操作。在现代 Android 版本中,后台执行受到更严格的限制。
  • 绑定 Service: 提供客户端-服务器接口,允许组件(如 Activity)与 Service 交互、发送请求并获取结果,有时甚至跨进程使用 IPC。

Service 是作为 android.app.Service 的子类实现的:

package com.example.myapp;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import androidx.annotation.Nullable;
public class MyMusicService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null; // 用于绑定 Service
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 开始播放音乐、下载数据等。
return START_STICKY; // 或其他标志,如 START_NOT_STICKY
}
@Override
public void onDestroy() {
super.onDestroy();
// 清理资源
}
}

重要提示: 对于大多数后台任务,尤其是可延迟的任务,Google 现在强烈推荐使用 Android Jetpack 中的 WorkManager。WorkManager 处理系统约束,并确保即使应用退出或设备重启,任务也能运行。

Broadcast Receiver 是一个监听并响应来自其他应用或系统本身的广播消息(Intent)的组件。例如,应用可以注册在设备启动时、拍摄新照片时或网络连接状态改变时接收广播。

Broadcast Receiver 是作为 android.content.BroadcastReceiver 的子类实现的。每条消息都会在其 onReceive() 方法中作为 Intent 对象接收。

package com.example.myapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MySystemEventReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Toast.makeText(context, "Device Boot Completed!", Toast.LENGTH_LONG).show();
}
// 处理其他 Intent,例如网络变化
}
}

接收器可以静态注册在 AndroidManifest.xml 中(用于特定的系统广播),也可以在代码中使用 Context.registerReceiver() 动态注册(对于大多数应用特定的广播,推荐使用此方法以限制应用唤醒)。

Content Provider 管理对结构化数据集的访问,充当数据存储和应用之间的抽象层。它们使应用能够安全地共享数据。例如,Android 系统提供了用于联系人、媒体存储和用户字典的 Content Provider。你也可以创建自己的 Content Provider 来共享应用中的数据。

Content Provider 是作为 android.content.ContentProvider 的子类实现的,并且必须实现一组标准方法(query()、insert()、update()、delete()、getType()、onCreate()),这些方法使其他应用能够执行事务。

package com.example.myapp.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyCustomDataProvider extends ContentProvider {
@Override
public boolean onCreate() {
// 初始化你的数据源(例如,数据库)
return true;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
@Nullable String[] selectionArgs, @Nullable String sortOrder) {
// 处理查询请求并返回 Cursor
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
// 返回给定 URI 数据的 MIME 类型
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
// 插入数据并返回新行的 URI
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
// 删除数据并返回删除的行数
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
@Nullable String[] selectionArgs) {
// 更新数据并返回更新的行数
return 0;
}
}

尽管功能强大,但实现 Content Provider 可能很复杂。对于应用内部数据,Jetpack Room 是推荐的持久化库。如果不需要数据共享,Room 提供了一种更简单、更健壮的数据管理解决方案。

除了这些核心组件之外,还有几个其他元素对于构建 Android 应用至关重要:

编号元素 & 描述
1Fragment
表示应用 UI 的可复用部分。Fragment 具有自己的生命周期,可以与 Activity 结合使用来构建多面板 UI。常与 Jetpack Navigation 组件一起使用。
2View 和 ViewGroup (布局)
View 是 UI 元素,如按钮、文本字段和图像。ViewGroup(LinearLayout、ConstraintLayout 等布局)是组织 View 的不可见容器。现代 UI 也可以使用 Jetpack Compose 声明式构建。
3Intent
异步消息,允许组件请求其他 Android 组件的功能。用于启动 Activity、Service、传递广播等。
4Resources
外部元素,如字符串、常量、图像、布局和动画,存储在 res/ 目录中。将资源与代码解耦有助于更轻松地进行本地化和主题化。
5AndroidManifest.xml
清单文件是应用的控制中心。它声明所有应用组件、权限、硬件/软件特性、API 级别要求等。
6Jetpack Architecture Components
一组库(例如,ViewModel、LiveData、Room、Navigation、WorkManager),通过遵循推荐的架构模式,帮助你构建健壮、可测试和可维护的应用。

理解这些组件和元素以及它们如何交互,是掌握 Android 开发的关键。