在 Android 开发中,Fragment 和 AppCompatActivity 是两个核心组件,它们的设计目的和使用场景有明显区别。下面以 NetworkConfigFragment 和 ConfigurationActivity 为例,详细说明它们的用法区别:
1. 基础概念
Fragment(如 NetworkConfigFragment)
-
定位:Fragment 是依附于 Activity 的"子界面",可以理解为"轻量级 Activity"或"模块化 UI 组件"。
-
生命周期:依赖于宿主 Activity,Activity 销毁时,所有 Fragment 也会被销毁。
-
使用场景:
- 实现界面的局部复用(如网络配置表单可在多个界面中复用)。
- 支持平板等大屏设备的多面板布局。
- 构建单 Activity + 多 Fragment 的架构(如导航组件)。
AppCompatActivity(如 ConfigurationActivity)
-
定位:Activity 是 Android 应用的基本界面单元,负责管理窗口和用户交互。
-
生命周期 :独立管理自己的生命周期(如
onCreate()、onResume()等)。 -
使用场景:
- 作为应用的主入口(如启动页、设置页面)。
- 管理多个相关 Fragment 的容器。
2. 核心区别
| 特性 | Fragment (NetworkConfigFragment) |
AppCompatActivity (ConfigurationActivity) |
|---|---|---|
| 布局加载 | 通过 onCreateView() 返回布局 |
通过 setContentView() 设置布局 |
| 生命周期 | 依赖宿主 Activity,有更细分的生命周期方法(如 onAttach()) |
独立完整的生命周期(如 onCreate()、onDestroy()) |
| 导航方式 | 需要通过 FragmentManager 进行添加、替换等操作 |
通过 startActivity() 启动 |
| 数据传递 | 通过 setArguments() 传递参数,或通过接口与 Activity 通信 |
通过 Intent 传递数据 |
| 布局复用性 | 高,可以在多个 Activity 中复用 | 低,通常作为独立界面存在 |
| 状态保存 | 需要自行处理状态保存(如 onSaveInstanceState()) |
系统自动保存部分状态(如旋转屏幕) |
3. 典型使用场景对比
场景:网络配置功能
-
使用
NetworkConfigFragment:kotlinclass NetworkConfigFragment : Fragment(R.layout.fragment_network_config) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 初始化网络配置表单 setupNetworkForm() } }- 优点:可在不同 Activity 中复用(如设置页、首次启动向导)。
- 缺点:需依赖宿主 Activity,逻辑不能完全独立。
-
使用
ConfigurationActivity:kotlinclass ConfigurationActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_configuration) // 初始化整个配置界面 setupConfigUI() } }- 优点:独立运行,无需依赖其他组件。
- 缺点 :无法在其他 Activity 中复用,只能通过
startActivity()启动。
4. 交互与通信
Fragment 与 Activity 通信
-
Fragment → Activity :通过接口回调或
findParentFragment()。kotlininterface OnNetworkConfigSavedListener { fun onConfigSaved(config: NetworkConfig) } class NetworkConfigFragment : Fragment() { private var listener: OnNetworkConfigSavedListener? = null override fun onAttach(context: Context) { super.onAttach(context) listener = context as? OnNetworkConfigSavedListener } private fun saveConfig() { listener?.onConfigSaved(config) } } -
Activity → Fragment :通过
FragmentManager获取实例并调用方法。scssval fragment = supportFragmentManager.findFragmentById(R.id.network_fragment) (fragment as? NetworkConfigFragment)?.updateUI()
Activity 之间通信
-
通过
Intent传递数据:kotlin// 发送数据 val intent = Intent(this, ConfigurationActivity::class.java) intent.putExtra("EXTRA_CONFIG", config) startActivity(intent) // 接收数据 val config = intent.getParcelableExtra<NetworkConfig>("EXTRA_CONFIG")
5. 布局与资源管理
Fragment 布局
ini
<!-- fragment_network_config.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/et_ip_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="IP地址" />
</LinearLayout>
Activity 布局
xml
<!-- activity_configuration.xml -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
6. 何时选择 Fragment 或 Activity?
| 场景 | 选择 Fragment | 选择 Activity |
|---|---|---|
| 界面局部复用 | ✅(如网络配置表单可在多个页面复用) | ❌(Activity 不可直接嵌入其他 Activity) |
| 多面板布局(平板适配) | ✅(左侧导航栏,右侧内容区) | ❌(需多个 Activity 管理,复杂度高) |
| 单 Activity 架构 | ✅(通过 Fragment 切换实现多页面) | ❌(需频繁启动新 Activity,性能开销大) |
| 独立功能模块(如设置页) | ❌(Fragment 需依赖 Activity) | ✅(可独立启动,无需依赖) |
总结
- Fragment 适合构建可复用、模块化的 UI 组件,依赖于 Activity 存在。
- Activity 适合作为独立界面,管理完整的用户交互流程。
在实际开发中,建议采用"单 Activity + 多 Fragment"的架构,以提高代码复用性和可维护性。例如,使用 Android 导航组件(Navigation Component)管理 Fragment 之间的导航。