在 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 之间的导航。