可以,这条演变线非常适合从 Java Android 经验迁移到 Compose。
1. 最早:多 Activity
早期很多 App 是:
```text
LoginActivity
HomeActivity
DetailActivity
SettingsActivity
```
跳转靠:
```java
startActivity(new Intent(...))
```
特点:
-
每个页面都是一个 Activity
-
生命周期清晰
-
页面间传参靠 Intent extras
问题:
-
页面多了 Activity 很散
-
共享 UI 壳(底部导航、统一 Toolbar)麻烦
-
返回栈、动画、状态管理比较分散
2. 后来:单 Activity + 多 Fragment
后来主流变成:
```text
MainActivity
-> FragmentContainerView
-> HomeFragment
-> DetailFragment
-> SettingsFragment
```
跳转靠:
```java
FragmentTransaction.replace(...)
addToBackStack(...)
```
或后来用 Jetpack Navigation:
```xml
navigation graph
```
特点:
-
Activity 做宿主
-
Fragment 表示页面
-
FragmentContainerView 承载页面
-
可以共享 Toolbar、BottomNavigation
优点:
-
页面模块化
-
统一壳更容易
-
返回栈比多 Activity 更集中
问题:
-
Fragment 生命周期复杂
-
View 生命周期和 Fragment 生命周期不是一回事
-
容易内存泄漏、重复初始化
-
XML + ViewBinding + Adapter + Fragment 代码量大
3. 现代:单 Activity + Compose + Navigation
现在像这个项目:
```text
MainActivity
-> setContent
-> NiaApp
-> Scaffold / NavigationSuiteScaffold
-> NavDisplay
-> ForYouScreen()
-> SearchScreen()
-> TopicScreen()
```
跳转靠:
```kotlin
navigator.navigate(SearchNavKey)
```
或标准 Compose Navigation 中:
```kotlin
navController.navigate("search")
```
特点:
-
Activity 仍然是宿主
-
页面不再是 Fragment,而是 `@Composable Screen`
-
返回栈是导航状态
-
UI 由 state 驱动重组
-
`NavDisplay` / `NavHost` 承载页面
三代对照
| 时代 | 页面单位 | 容器 | 跳转方式 | UI 更新 |
|---|---|---|---|---|
| 多 Activity | Activity | 系统 task stack | Intent | 手动改 View |
| Activity + Fragment | Fragment | FragmentContainerView | FragmentTransaction/NavController | 手动改 View/LiveData |
| Compose + Navigation | Composable Screen | NavHost/NavDisplay | NavKey/NavController | State -> Recompose |
最大变化是什么
旧时代:容器里装对象
以前你真的有:
```text
Activity 对象
Fragment 对象
View 对象
```
你会持有引用、找控件、调用方法。
Compose:状态决定显示什么
现在更多是:
```text
当前导航状态 = SearchNavKey
NavDisplay 根据 key 调用 SearchScreen()
```
你不再想着"替换一个 Fragment 对象",而是想着:
**导航状态变了,所以应该显示另一个 Composable。**
相同点
其实核心目的没变:
-
都要有页面
-
都要有返回栈
-
都要传参数
-
都要共享全局壳(Toolbar/BottomBar)
-
都要处理生命周期
不同点
1. 页面形态变了
-
以前:页面是 Activity/Fragment 类
-
现在:页面是 Composable 函数
2. UI 更新方式变了
-
以前:拿 View 引用改属性
-
现在:状态变,Composable 重新执行
3. 导航方式变了
-
以前:执行事务 replace/add
-
现在:改变导航栈状态
4. 生命周期复杂度下降
-
以前 Fragment 有 Fragment 生命周期 + View 生命周期
-
Compose 少了这层 View 生命周期,但多了 Composition/Recomposition 的概念
用当前项目类比
以前你可能写:
```text
MainActivity
-> FragmentContainerView
-> ForYouFragment
-> SearchFragment
```
现在这个项目是:
```text
MainActivity
-> setContent
-> NiaApp
-> NavDisplay
-> ForYouScreen
-> SearchScreen
```
所以 `NavDisplay` 在现代架构里的角色,基本就像以前的 `FragmentContainerView`,但它承载的是 **Composable 页面**。
一句话总结:
**Android 页面演变从"Activity 管页面"到"Fragment 管页面",再到"Navigation 状态驱动 Composable 页面"。**