跳转到内容
Go back

安卓开发 - 四大组件

Edit page

安卓开发 - 四大组件 -2025-4-30

当然可以!下面我用生动比喻 + 图解思维的方式,讲解 Android 中最核心的概念之一:四大组件(Activity、Service、BroadcastReceiver、ContentProvider)*及它们的*生命周期


🌟 四大组件是什么?—— 类比”安卓的超级英雄团队”

组件名作用类比角色
Activity管理用户界面(UI)和交互📱 屏幕的”主持人”
Service执行后台任务,不需要界面🔧 幕后的”工人”
BroadcastReceiver响应系统或应用间的消息广播📢 公共”收音机”
ContentProvider跨应用共享数据(如联系人、图片)📂“资料管理员”

🎬 1. Activity:屏幕主持人

作用:代表一个用户界面(页面)。你打开一个 App,看到的就是 Activity 的呈现。

🧠 生命周期(像一个舞台演出):

onCreate()     -> 演出筹备(初始化舞台、道具)
onStart()      -> 正式登台
onResume()     -> 开始演出(观众能看到你)
onPause()      -> 暂停演出(可能来了个电话)
onStop()       -> 退到后台(观众看不见了)
onDestroy()    -> 演出结束(拆舞台)

📌 小贴士:onRestart() 是从后台重新登台的时刻。


🛠️ 2. Service:后台工人

作用:在后台执行耗时操作,比如播放音乐、下载、上传。

🧠 生命周期简化版:

onCreate()     -> 工人上岗前准备
onStartCommand() -> 正式开始工作(可重复多次)
onDestroy()    -> 工人下班

📌 通常和 IntentServiceForegroundService 联合使用。


📡 3. BroadcastReceiver:系统广播监听者

作用:监听系统或应用发送的”广播事件”,如电量低、网络连接等。

🧠 生命周期超短(几乎一闪而过):

onReceive()    -> 收到广播时调用(几秒内完成)

📌 例子:你插上充电器,系统广播一个”充电了”的消息,某个 App 的 BroadcastReceiver 会响应该消息。


📂 4. ContentProvider:资料管理员

作用:提供一种标准方式来访问和共享数据(数据库、媒体等)。

🧠 生命周期(由系统托管,开发者很少接触):

onCreate()    -> 初始化数据库、资源等
query()       -> 查询数据
insert()      -> 插入数据
update()      -> 更新数据
delete()      -> 删除数据

📌 常用于访问手机联系人、短信、媒体文件等。


🧩 总结:四大组件适合做什么?

任务场景组件
展示界面Activity
播放音乐Service
接收网络变化BroadcastReceiver
读取联系人ContentProvider

如果你愿意,我可以为你画一张”Android 四大组件生命周期流程图”图示帮助记忆。需要吗?

很好的问题!在 Android 或 Java 架构中,DAO(Data Access Object)Repository(仓库) 经常一起出现,但它们职责不同,各司其职。我们来详细说明它们的区别与合作关系


✅ 一、DAO 和 Repository 的区别

特性DAO(Data Access Object)Repository(仓库)
职责直接操作数据库,比如增删改查(SQL)封装多个数据来源(DAO、本地缓存、网络等)
层级位置数据层最低层(贴近数据库)数据层的中间层(Service 与 DAO 之间)
聚焦内容针对某张数据库表(如 UserDao聚合多个 DAO,提供统一的数据接口
返回值类型通常是数据库实体类(如 UserEntity通常是业务模型类(如 User
与框架关系常由 Room 或 MyBatis 自动生成或定义纯粹的业务封装,与框架无强依赖

✅ 二、关系与合作方式

📌 总体结构图(典型安卓 Room 架构)

Activity / ViewModel

    Repository (业务逻辑 + 多来源合并)

       DAO(直接数据库访问)

      Room / SQLite

📌 示例代码

1. UserDao(只负责数据库操作)

@Dao
public interface UserDao {
    @Query("SELECT * FROM user WHERE id = :id")
    UserEntity getUserById(int id);

    @Insert
    void insertUser(UserEntity user);
}

2. UserRepository(封装逻辑、整合 DAO 和网络)

public class UserRepository {
    private UserDao userDao;
    private RemoteApiService apiService;

    public UserRepository(UserDao userDao, RemoteApiService apiService) {
        this.userDao = userDao;
        this.apiService = apiService;
    }

    public User getUser(int id) {
        UserEntity entity = userDao.getUserById(id);
        return mapToUser(entity); // 转换为业务对象
    }

    public void syncUserFromServer(int id) {
        apiService.fetchUser(id, new ApiCallback() {
            @Override
            public void onSuccess(UserDto dto) {
                userDao.insertUser(mapToEntity(dto));
            }
        });
    }

    private User mapToUser(UserEntity entity) {
        return new User(entity.id, entity.name); // 转换为业务模型
    }

    private UserEntity mapToEntity(UserDto dto) {
        return new UserEntity(dto.id, dto.name);
    }
}

✅ 总结:一句话区分


是否需要我帮你生成一个完整的 Android Room + Repository 结构示例项目结构?

在 Android 中,<intent-filter>MAIN + LAUNCHER 是与启动 Activity 相关的两个概念,但它们各自承担不同的角色:


✅ 一、<intent-filter> 是什么?

<intent-filter> 是 AndroidManifest.xml 中用于声明组件(Activity、Service、BroadcastReceiver)可以响应哪些 Intent 的机制。 通过设置 actioncategorydata,系统就知道什么时候应该启动这个组件。

📌 示例:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="myapp" />
    </intent-filter>
</activity>

这个例子表示:如果有 Intent 指向了 myapp://...,系统会启动 MainActivity


✅ 二、MAIN + LAUNCHER 的作用

MAIN + LAUNCHER 是一种特殊的 Intent Filter,用于声明 哪个 Activity 是应用的主入口,也就是你点击 App 图标后第一个打开的界面。

📌 示例:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

这个组合表示:MainActivity 是启动器入口(即主页 Activity),系统会在桌面创建 App 图标并绑定这个 Activity。


✅ 三、区别对比

对比项<intent-filter>MAIN + LAUNCHER
定义位置<activity><service><receiver><activity>
作用声明组件可以响应哪些 Intent声明哪个 Activity 是主入口
是否必须不是必须至少有一个 Activity 必须有它,才能启动 App
可响应的 Intent 类型多种自定义(VIEW、SEND、CUSTOM_ACTION)仅用于启动主 Activity
对应的启动方式其他组件或应用的显式或隐式 Intent 启动点击桌面图标或启动器启动 App

✅ 四、小结一句话


是否需要我展示一个有多个 <intent-filter>(比如用于分享、浏览网页、打开文件)的实际例子?

好的,下面是一个包含多个 <intent-filter> 的实际 AndroidManifest 示例,展示一个 Activity 如何响应不同类型的 Intent,如作为主入口、接收网页链接、处理分享内容等。


📄 示例:多个 <intent-filter> 用法

<activity android:name=".MainActivity">

    <!-- 主入口,点击 App 图标打开 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- 接收网页链接(浏览器或网页跳转) -->
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="www.example.com"
            android:pathPrefix="/article" />
    </intent-filter>

    <!-- 接收文本分享内容(比如从微信、浏览器分享) -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>

</activity>

🔍 每个 intent-filter 说明:

用途描述
MAIN+LAUNCHERApp 的主入口,点击图标时启动
VIEW + scheme/host/path允许从网页或浏览器跳转到 App(如 App Links/Deep Link)
SEND + mimeType让你的 App 出现在”分享到”列表中,处理文本分享

🚀 使用方式(代码侧)

// 处理分享内容
Intent intent = getIntent();
if (Intent.ACTION_SEND.equals(intent.getAction()) && "text/plain".equals(intent.getType())) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    // 显示或处理分享内容
}

需要我为你生成一个可以直接运行的完整 Android 示例项目代码结构吗?(带 MainActivity + Manifest + DeepLink 处理)


Edit page
Share this post on:

Previous Post
安卓应用打包问题
Next Post
安卓开发-2025-4-27