KMP 实现鸿蒙跨端:Kotlin 每日时间分配与效率分析工具

目录
- 概述
- 功能设计
- Kotlin 实现代码(KMP)
- JavaScript 调用示例
- ArkTS 页面集成与调用
- 数据输入与交互体验
- 编译与自动复制流程
- 总结
概述
本案例在 Kotlin Multiplatform (KMP) 工程中实现了一个 每日时间分配与效率分析工具:
- 输入:一行文本,包含一天中主要活动及其时长,例如:
学习 3, 工作 8, 娱乐 2, 睡眠 7。 - 输出:
- 每个活动的时长明细
- 学习/工作/睡眠等核心统计数据
- 时间结构分析(是否接近 24 小时、是否缺失记录)
- 关于效率与睡眠的建议
- 技术路径:Kotlin → Kotlin/JS → JavaScript 模块 → ArkTS 页面调用。
这个工具可以帮助你快速复盘“一天都去哪儿了”,是一个典型的生活效率类小工具,同时也非常适合作为 Kotlin 集合操作与跨端调用的示例。
功能设计
输入格式
- 使用逗号
,分隔不同的活动记录。 - 每个记录由“活动名称 + 时长(小时)”组成,中间用空格隔开。
- 示例:
学习 3, 工作 8, 娱乐 2, 睡眠 7
输出结构
工具返回一段结构化的多行文本,包含:
- 活动明细:逐项列出每个活动名称和时长。
- 核心统计:总时长、学习相关时长、工作相关时长、睡眠相关时长。
- 结构分析:判断总记录时长是否接近 24 小时,并给出记录完整度的提示。
- 效率建议:基于学习+工作总时长给出对效率的评价。
- 睡眠建议:基于睡眠时长判断是否偏少/偏多、是否需要调整。
Kotlin 实现代码(KMP)
关键实现位于 src/jsMain/kotlin/App.kt,并通过 @JsExport 暴露给 JS/ArkTS 调用:
@OptIn(ExperimentalJsExport::class)
@JsExport
fun dailyTimeUsageAnalyzer(inputText: String = "学习 3, 工作 8, 娱乐 2, 睡眠 7"): String {
// 输入格式: "活动1 时长, 活动2 时长, ...",时长单位为小时
if (inputText.trim().isEmpty()) {
return "❌ 错误: 请输入活动名称和小时数,例如: 学习 3, 工作 8, 娱乐 2, 睡眠 7"
}
val entries = inputText.split(",")
.map { it.trim() }
.filter { it.isNotEmpty() }
.mapNotNull { part ->
val pieces = part.split(" ").filter { it.isNotEmpty() }
if (pieces.size < 2) return@mapNotNull null
val name = pieces[0]
val hours = pieces[1].toDoubleOrNull() ?: return@mapNotNull null
name to hours
}
if (entries.isEmpty()) {
return "❌ 错误: 没有解析到有效的活动和时长\n示例: 学习 3, 工作 8, 娱乐 2, 睡眠 7"
}
val totalHours = entries.sumOf { it.second }
val workHours = entries.filter { it.first.contains("工") }.sumOf { it.second }
val studyHours = entries.filter { it.first.contains("学") }.sumOf { it.second }
val sleepHours = entries.filter { it.first.contains("睡") || it.first.contains("眠") }.sumOf { it.second }
val lines = entries.map { (name, hours) ->
" - $name: ${hours} 小时"
}
val balanceComment = when {
totalHours < 20 -> "记录总时长偏少,建议补全一天 24 小时的主要活动,便于全面分析。"
totalHours in 22.0..26.0 -> "整体时间接近 24 小时,结构较为完整,可以作为每日时间账单参考。"
else -> "记录总时长明显超出或少于 24 小时,可能包含跨天或遗漏记录,请注意核对。"
}
val efficiencyComment = when {
studyHours + workHours >= 10 -> "高效的一天,学习/工作投入时间较多,注意适当休息。"
studyHours + workHours in 6.0..9.9 -> "学习/工作时长适中,可以考虑为深度任务预留整块时间。"
else -> "学习/工作时间偏少,若有长期目标,建议为重点任务预留固定时段。"
}
val sleepComment = when {
sleepHours in 7.0..9.0 -> "睡眠时长较为理想,有利于保持良好状态。"
sleepHours < 7.0 -> "睡眠偏少,建议尽量保证 7 小时以上的睡眠时间。"
else -> "睡眠时间较长,可以适当调整,将一部分时间投入到学习或运动中。"
}
return "⏱ 每日时间分配与效率分析\n" +
"━━━━━━━━━━━━━━━━━━━━━\n" +
"原始输入: $inputText\n\n" +
"1️⃣ 活动明细:\n" +
lines.joinToString("\n") + "\n\n" +
"2️⃣ 核心统计:\n" +
" 总记录时长: ${totalHours} 小时\n" +
" 学习相关: ${studyHours} 小时\n" +
" 工作相关: ${workHours} 小时\n" +
" 睡眠相关: ${sleepHours} 小时\n\n" +
"3️⃣ 结构分析:\n" +
" $balanceComment\n\n" +
"4️⃣ 效率建议:\n" +
" $efficiencyComment\n\n" +
"5️⃣ 睡眠建议:\n" +
" $sleepComment\n\n" +
"━━━━━━━━━━━━━━━━━━━━━\n" +
"✅ 分析完成!"
}
这是每日时间分配与效率分析工具的核心实现函数。函数使用 @OptIn(ExperimentalJsExport::class) 和 @JsExport 注解,使其可以被编译成 JavaScript 并在 ArkTS 中调用。函数首先进行输入验证,检查输入是否为空。然后使用链式操作解析输入:split(",") 按逗号分割活动记录,map { it.trim() } 移除每条记录的首尾空白,filter { it.isNotEmpty() } 过滤空记录,mapNotNull 安全解析每条记录为活动名称和时长的键值对。使用 toDoubleOrNull() 安全转换时长为浮点数,避免非法输入导致崩溃。然后统计总时长、工作时长、学习时长和睡眠时长,使用 contains() 检查活动名称中是否包含特定关键字。使用 when 表达式根据不同的时长范围生成相应的分析建议。最后格式化输出包含活动明细、核心统计、结构分析、效率建议和睡眠建议的完整报告。
代码说明
- 使用
split(",")与二次split(" ")解析活动名称和时长。 - 通过
toDoubleOrNull()安全解析小时数,避免非法输入导致崩溃。 - 利用
filter+contains("学"/"工"/"睡"/"眠")粗略归类活动到学习/工作/睡眠。 - 根据总时长判断记录是否接近 24 小时,用于评估数据完整度。
- 通过简单的阈值判断给出效率和睡眠建议,便于用户快速理解一天的时间结构。
JavaScript 调用示例
在 Kotlin/JS 编译完成后,可以在 JS/TS 环境中直接调用该函数:
import { dailyTimeUsageAnalyzer } from './hellokjs.mjs';
// 默认示例
console.log(dailyTimeUsageAnalyzer());
// 自定义时间分配
const result = dailyTimeUsageAnalyzer('学习 4, 工作 7, 娱乐 3, 睡眠 8, 通勤 2');
console.log(result);
这段代码展示了如何在 JavaScript 环境中调用编译后的 Kotlin 函数。首先使用 import 语句从编译后的 JavaScript 模块中导入 dailyTimeUsageAnalyzer 函数。第一个示例调用函数时不传入参数,使用默认的示例数据 “学习 3, 工作 8, 娱乐 2, 睡眠 7”。第二个示例传入自定义的时间分配数据,包含学习 4 小时、工作 7 小时、娱乐 3 小时、睡眠 8 小时和通勤 2 小时。函数返回一个多行的分析报告字符串,可以直接在控制台输出或进一步处理。这展示了 KMP 的跨端能力,同一份 Kotlin 代码可以在 JavaScript 环境中无缝调用。
输出是一段多行文本报告,包含活动明细、统计和建议,适合直接在终端、日志或 ArkTS 页面中展示。
ArkTS 页面集成与调用
在 OpenHarmony 工程 kmp_ceshiapp 中,首页 Index.ets 已经切换为“每日时间分配与效率分析”页面:
import { dailyTimeUsageAnalyzer } from './hellokjs';
@Entry
@Component
struct Index {
@State message: string = '请输入一天内主要活动和时长';
@State inputText: string = '学习 3, 工作 8, 娱乐 2, 睡眠 7';
@State resultText: string = '';
aboutToAppear(): void {
this.analyzeTimeUsage();
}
analyzeTimeUsage(): void {
try {
const input: string = this.inputText;
const result: string = dailyTimeUsageAnalyzer(input);
this.resultText = result;
this.message = '✓ 计算完成';
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
this.message = `✗ 错误: ${errorMessage}`;
}
}
build() {
// 省略 UI 布局细节,重点展示状态与调用关系
}
}
这段 ArkTS 代码是鸿蒙应用的用户界面实现,通过 import 语句导入之前编译的 Kotlin 函数。使用 @State 装饰器定义三个响应式状态变量:message 用于显示状态信息,inputText 存储用户输入的时间分配数据(默认为示例数据),resultText 存储分析结果。aboutToAppear() 生命周期函数在组件加载时自动调用 analyzeTimeUsage() 进行初始分析。analyzeTimeUsage() 方法调用 Kotlin 编译的 JavaScript 函数 dailyTimeUsageAnalyzer(),将用户输入的文本传入,获取分析结果,然后更新 resultText 和 message。使用 try-catch 块捕获异常,如果发生错误则显示错误信息。build() 方法构建整个 UI 布局,维护输入框、输出区域和按钮的交互。
ArkTS 负责:
- 维护输入字符串
inputText与输出结果resultText的状态; - 在生命周期钩子和按钮点击时调用
dailyTimeUsageAnalyzer; - 根据调用结果更新页面提示
message。
数据输入与交互体验
首页的交互设计延续了前几个案例的风格:
- 顶部标题栏展示“KMP 鸿蒙跨端”和“每日时间分配与效率分析”。
- 输入区域包含:
- 提示文案:
输入活动和时长 (示例: 学习 3, 工作 8, 娱乐 2, 睡眠 7)。 - 文本框默认内容:
学习 3, 工作 8, 娱乐 2, 睡眠 7。 - “开始分析”按钮:点击后调用
analyzeTimeUsage()。
- 提示文案:
- 结果区域通过
Scroll容器与Text组件展示多行分析结果。 - 底部按钮:
- “默认示例”:重置输入为默认示例并立即分析;
- “清空”:清空输入与结果,将提示还原为“请输入一天内主要活动和时长”。
用户只需要轻微修改默认示例(比如调整活动名称和时长)并点击“开始分析”,即可快速看到属于自己的一天时间分配报告。
编译与自动复制流程
当你在 App.kt 中新增或修改 dailyTimeUsageAnalyzer 时,只需在项目根目录执行:
cd d:\flutter_Obj\kmp_openharmony
.\build-and-copy.bat
脚本会自动:
- 使用
gradlew build编译 Kotlin/JS 工程; - 在
build/js/packages/hellokjs/kotlin/下生成/更新hellokjs.mjs与hellokjs.d.ts; - 将它们复制到 ArkTS pages 目录:
kmp_ceshiapp/entry/src/main/ets/pages/hellokjs.d.tskmp_ceshiapp/entry/src/main/ets/pages/hellokjs.js(由.mjs复制并改名)。
这样可以保证 ArkTS 端始终使用最新的 Kotlin 逻辑,无需手动复制文件。
总结
“每日时间分配与效率分析工具”结合了 Kotlin 的字符串解析、集合统计与条件判断逻辑,通过 KMP 的 Kotlin/JS 能力,轻松在 ArkTS 页面中复用,实现了一个贴近日常生活的小工具:
- Kotlin 负责解析活动-时长列表、进行加总和分类统计,并生成结构化分析报告。
- Kotlin/JS 将函数导出为 JS 模块和类型声明文件,为 JS/TS/ArkTS 提供良好的调用体验。
- ArkTS 页面只需少量代码即可构建出一个交互式的时间分析界面,让用户方便地查看和调整自己的时间安排。
配合前面的预算分析、学习打卡、环境舒适度、随机抽奖、任务排序等案例,这个工具进一步丰富了你的 KMP + ArkTS 示例体系,覆盖了生活效率和自我管理领域。核心思路依旧是:把算法和数据分析写在 Kotlin 里,通过 KMP 连接到多端,让 ArkTS 专注于体验和展示。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)