Fragment 和 AppCompatActivity 两个核心组件设计的目的和使用场景对比

237 阅读3分钟

在 Android 开发中,FragmentAppCompatActivity 是两个核心组件,它们的设计目的和使用场景有明显区别。下面以 NetworkConfigFragmentConfigurationActivity 为例,详细说明它们的用法区别:

1. 基础概念

Fragment(如 NetworkConfigFragment

  • 定位:Fragment 是依附于 Activity 的“子界面”,可以理解为“轻量级 Activity”或“模块化 UI 组件”。

  • 生命周期:依赖于宿主 Activity,Activity 销毁时,所有 Fragment 也会被销毁。

  • 使用场景

    • 实现界面的局部复用(如网络配置表单可在多个界面中复用)。
    • 支持平板等大屏设备的多面板布局。
    • 构建单 Activity + 多 Fragment 的架构(如导航组件)。

AppCompatActivity(如 ConfigurationActivity

  • 定位:Activity 是 Android 应用的基本界面单元,负责管理窗口和用户交互。

  • 生命周期:独立管理自己的生命周期(如 onCreate()onResume() 等)。

  • 使用场景

    • 作为应用的主入口(如启动页、设置页面)。
    • 管理多个相关 Fragment 的容器。

2. 核心区别

特性FragmentNetworkConfigFragmentAppCompatActivityConfigurationActivity
布局加载通过 onCreateView() 返回布局通过 setContentView() 设置布局
生命周期依赖宿主 Activity,有更细分的生命周期方法(如 onAttach()独立完整的生命周期(如 onCreate()onDestroy()
导航方式需要通过 FragmentManager 进行添加、替换等操作通过 startActivity() 启动
数据传递通过 setArguments() 传递参数,或通过接口与 Activity 通信通过 Intent 传递数据
布局复用性高,可以在多个 Activity 中复用低,通常作为独立界面存在
状态保存需要自行处理状态保存(如 onSaveInstanceState()系统自动保存部分状态(如旋转屏幕)

3. 典型使用场景对比

场景:网络配置功能

  • 使用 NetworkConfigFragment

    class NetworkConfigFragment : Fragment(R.layout.fragment_network_config) {
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            // 初始化网络配置表单
            setupNetworkForm()
        }
    }
    
    • 优点:可在不同 Activity 中复用(如设置页、首次启动向导)。
    • 缺点:需依赖宿主 Activity,逻辑不能完全独立。
  • 使用 ConfigurationActivity

    class ConfigurationActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_configuration)
            // 初始化整个配置界面
            setupConfigUI()
        }
    }
    
    • 优点:独立运行,无需依赖其他组件。
    • 缺点:无法在其他 Activity 中复用,只能通过 startActivity() 启动。

4. 交互与通信

Fragment 与 Activity 通信

  • Fragment → Activity:通过接口回调或 findParentFragment()

    interface 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 获取实例并调用方法。

    val fragment = supportFragmentManager.findFragmentById(R.id.network_fragment)
    (fragment as? NetworkConfigFragment)?.updateUI()
    

Activity 之间通信

  • 通过 Intent 传递数据:

    // 发送数据
    val intent = Intent(this, ConfigurationActivity::class.java)
    intent.putExtra("EXTRA_CONFIG", config)
    startActivity(intent)
    ​
    // 接收数据
    val config = intent.getParcelableExtra<NetworkConfig>("EXTRA_CONFIG")
    

5. 布局与资源管理

Fragment 布局

<!-- 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 布局

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