从Java演变到Kotlin下的jet pack

可以,这条演变线非常适合从 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 代码量大


现在像这个项目:

```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 页面"。**

相关推荐
警醒与鞭策6 小时前
【无标题】
android·unity·性能优化·游戏引擎·perforce
传奇开心果编程8 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
李游Leo10 小时前
《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】
android·harmonyos
方白羽13 小时前
Android APK安全防护
android·安全·apk
小黄人软件13 小时前
AndroidStudio老项目 macOS运行BlueTooth蓝牙串口助手(Android+Studio源码).rar
android·macos
00后程序员张13 小时前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview
天神哥哥啊13 小时前
cocos联调注意事项-安卓
android
TDengine (老段)14 小时前
TDengine TSDB 实战排障四(升级与兼容)
android·java·大数据·数据库·物联网·时序数据库·tdengine
蓝速科技14 小时前
政务自助终端信创选型与无人值守落地方案
android·大数据·数据库·人工智能·科技·技术分享·政务
硫酸锌0116 小时前
在手机上运行Python增量备份手机数据到PC电脑
android·windows·python