Android - 应用组件
Android - 应用组件
Section titled “Android - 应用组件”应用组件是 Android 应用的基本构建块。每个组件都是系统或用户进入应用的入口点。这些组件通常通过应用清单文件(AndroidManifest.xml)松散耦合,清单文件描述了每个组件及其交互方式。一些组件还依赖 Jetpack 库(如 ViewModel 或 LiveData)来实现现代架构模式。
应用组件主要有四种类型:
| 编号 | 组件 & 描述 |
|---|---|
| 1 | Activity 表示带有用户界面(UI)的单一屏幕。它们处理用户交互并显示信息。例如,设置屏幕或照片库。 |
| 2 | Service 在后台执行长时间运行的操作,不提供 UI。示例包括播放音乐、获取数据或同步文件。现代 Android 更推荐使用 WorkManager 执行大多数后台任务。 |
| 3 | Broadcast Receiver 响应系统范围的广播通知或其他应用的自定义广播。示例包括对低电量警告或下载完成做出反应。 |
| 4 | Content Provider 管理一组共享的应用数据。它们允许其他应用查询或修改数据(如果允许)。常用于结构化数据,如联系人或媒体。 |
Activity
Section titled “Activity”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
Section titled “Service”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
Section titled “Broadcast Receiver”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
Section titled “Content Provider”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 提供了一种更简单、更健壮的数据管理解决方案。
其他基础元素
Section titled “其他基础元素”除了这些核心组件之外,还有几个其他元素对于构建 Android 应用至关重要:
| 编号 | 元素 & 描述 |
|---|---|
| 1 | Fragment 表示应用 UI 的可复用部分。Fragment 具有自己的生命周期,可以与 Activity 结合使用来构建多面板 UI。常与 Jetpack Navigation 组件一起使用。 |
| 2 | View 和 ViewGroup (布局) View 是 UI 元素,如按钮、文本字段和图像。ViewGroup( LinearLayout、ConstraintLayout 等布局)是组织 View 的不可见容器。现代 UI 也可以使用 Jetpack Compose 声明式构建。 |
| 3 | Intent 异步消息,允许组件请求其他 Android 组件的功能。用于启动 Activity、Service、传递广播等。 |
| 4 | Resources 外部元素,如字符串、常量、图像、布局和动画,存储在 res/ 目录中。将资源与代码解耦有助于更轻松地进行本地化和主题化。 |
| 5 | AndroidManifest.xml 清单文件是应用的控制中心。它声明所有应用组件、权限、硬件/软件特性、API 级别要求等。 |
| 6 | Jetpack Architecture Components 一组库(例如, ViewModel、LiveData、Room、Navigation、WorkManager),通过遵循推荐的架构模式,帮助你构建健壮、可测试和可维护的应用。 |
理解这些组件和元素以及它们如何交互,是掌握 Android 开发的关键。