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

相关推荐
wenzhangli72 小时前
在低代码设计中践行 Harness Engineering
android·低代码·rxjava
xingpanvip3 小时前
星盘接口开发文档:组合三限盘接口指南
android·开发语言·前端·python·php·lua
TechMix3 小时前
【fkw学习笔记】Android 13 AOSP 源码添加系统预置应用实战指南
android·笔记·学习
云起SAAS3 小时前
私域直播系统UniApp源码 多商户商城+直播带货 微信小程序+H5+安卓iOS
android·微信小程序·uni-app·私域直播系统
空中海4 小时前
01. 安卓逆向基础、环境搭建与授权
android
星河耀银海4 小时前
JAVA 泛型与通配符:从原理到实战应用
android·java·服务器
Ada大侦探4 小时前
新手小白学习数据分析01----数据分析师???& 数据分析思维学习
android·学习·数据分析
空中海4 小时前
安卓逆向5. 安卓风险防护、加固复测与综合
android
Mr -老鬼4 小时前
EasyClick 双端自动化智能体|Android&iOS 全平台 EC 脚本开发助手
android·ios·自动化·易点云测·#easyclick·#ios自动化