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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Activity 逻辑代码}
}
Fragment 示例:
public class MyFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 膨胀 Fragment 的布局return inflater.inflate(R.layout.fragment_my, container, false);}@Overridepublic void onViewCreated(@NonNull View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// Fragment 逻辑代码}
}
7. 最佳实践建议
-
单 Activity 多 Fragment 架构(推荐):
- 使用 Navigation 组件管理 Fragment
- Activity 作为容器,Fragment 处理具体界面
-
避免 Fragment 直接通信:
- 通过 ViewModel 或 Activity 中介通信
-
正确处理生命周期:
- Fragment 的生命周期比 Activity 更复杂,需特别注意
-
平板适配:
- 使用 Fragment 可以轻松实现不同屏幕尺寸的布局适配