Android 中 Activity 和 Fragment 的区别

Activity 和 Fragment 是 Android 应用开发中两个核心组件,它们在应用架构中扮演不同角色,以下是它们的主要区别:

1. 基本概念

特性 Activity Fragment
定义 代表应用中的一个独立屏幕 代表 Activity 中的一部分 UI 或行为
生命周期 独立生命周期 依附于宿主 Activity 的生命周期
入口点 需要在 AndroidManifest.xml 中声明 不需要在清单文件中声明

2. 生命周期对比

Activity 生命周期
onCreate()onStart()onResume()onPause()onStop()onDestroy()

Fragment 生命周期(额外包含与 Activity 交互的方法):
onAttach()onCreate()onCreateView()onActivityCreated()onStart()onResume()onPause()onStop()onDestroyView()onDestroy()onDetach()

3. 主要功能差异

功能 Activity Fragment
UI 管理 管理完整窗口 管理部分 UI
导航 通过 Intent 启动 通过 FragmentTransaction 管理
回退栈 自动管理 需要手动添加到回退栈
复用性 复用性较低 高复用性,可在不同 Activity 中使用
多窗口支持 可作为独立窗口 必须依附于 Activity
任务和返回栈 参与应用任务栈 不直接参与

4. 使用场景

适合使用 Activity 的情况

  • 应用的主要入口点
  • 需要独立窗口的场景(如全屏播放)
  • 需要处理系统级交互(权限请求、Intent 过滤等)

适合使用 Fragment 的情况

  • 模块化 UI 组件(如 ViewPager 的页面)
  • 适应不同屏幕尺寸(平板/手机不同布局)
  • 需要动态替换的 UI 部分
  • 共享 UI 组件(多个 Activity 共用的界面部分)

5. 通信方式

Activity 通信

  • 通过 startActivity()Intent
  • 使用 startActivityForResult()(已弃用,推荐 Activity Result API)

Fragment 通信

  • 通过宿主 Activity(使用接口回调)
  • ViewModel(推荐方式)
  • Fragment 结果 API(setFragmentResult()

6. 代码示例对比

Activity 示例

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Activity 逻辑代码
    }
}

Fragment 示例

public class MyFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 膨胀 Fragment 的布局
        return inflater.inflate(R.layout.fragment_my, container, false);
    }
    
    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // Fragment 逻辑代码
    }
}

7. 最佳实践建议

  1. 单 Activity 多 Fragment 架构(推荐):

    • 使用 Navigation 组件管理 Fragment
    • Activity 作为容器,Fragment 处理具体界面
  2. 避免 Fragment 直接通信

    • 通过 ViewModel 或 Activity 中介通信
  3. 正确处理生命周期

    • Fragment 的生命周期比 Activity 更复杂,需特别注意
  4. 平板适配

    • 使用 Fragment 可以轻松实现不同屏幕尺寸的布局适配
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐