首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从零到一开发鸿蒙 6 原生时钟应用:uni-app x 完全实战指南

从零到一开发鸿蒙 6 原生时钟应用:uni-app x 完全实战指南

作者头像
徐建国
发布2025-11-29 14:52:54
发布2025-11-29 14:52:54
5130
举报
文章被收录于专栏:个人路线个人路线

🚀 从零到一开发鸿蒙 6 原生时钟应用:uni-app x 完全实战指南

前言

鸿蒙 6 时代已来,纯血鸿蒙应用开发正当时!

在移动应用开发的新纪元,鸿蒙 6(HarmonyOS 6)作为华为全新一代操作系统,已经完全摆脱了安卓内核,实现了真正的"纯血鸿蒙"。本文将详细介绍如何使用 uni-app x 框架,从零开发一款功能完整、界面精美的鸿蒙 6 原生时钟应用,集成时钟、闹钟、秒表、计时器四大核心功能。

为什么选择鸿蒙 6?

  • 🎯 纯血鸿蒙系统,性能提升 30%+
  • 🎯 全新的分布式架构,跨设备协同
  • 🎯 更强大的安全机制
  • 🎯 完善的开发者生态
image-20251028080111473
image-20251028080111473

image-20251028080111473

🌟 项目亮点

  • 🎨 Material Design 深色主题:符合鸿蒙 6 设计规范,夜间使用友好
  • 📱 鸿蒙 6 原生应用:使用 uni-app x 编译为纯血鸿蒙原生应用
  • 🚀 完全离线可用:无需网络连接,数据本地存储
  • 🎯 代码结构清晰:模块化设计,易于维护和扩展
  • 极致性能:鸿蒙 6 平台原生性能,启动速度提升 50%
  • 🔥 一次开发,多端部署:支持 HarmonyOS 6、Android、iOS、H5、小程序
  • 🌐 分布式能力:充分利用鸿蒙 6 的跨设备协同特性
  • 🔐 安全可靠:符合鸿蒙 6 的安全标准

🛠️ 技术栈

代码语言:javascript
复制
- 核心框架:uni-app x(专为鸿蒙6优化)
- 开发语言:UTS(TypeScript 超集,编译为鸿蒙原生代码)
- 前端框架:Vue 3 Composition API
- 样式方案:SCSS + Material Design
- 数据存储:uni.storage → 鸿蒙6 Preferences API
- 目标平台:HarmonyOS 6(纯血鸿蒙系统)
- API版本:HarmonyOS API 18+

🤔 为什么选择 uni-app x 开发鸿蒙 6 应用?

uni-app x 是专为鸿蒙 6 量身打造的跨平台开发框架!

对比维度

原生开发

uni-app x

其他跨平台框架

开发语言

ArkTS

UTS(类 TypeScript)

JavaScript/Dart

性能表现

⭐⭐⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐

开发效率

⭐⭐⭐

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

跨平台能力

✅ 5 端通用

✅ 有限支持

生态支持

🟢 官方

🟢 官方+社区

🟡 社区

鸿蒙 6 适配

✅ 完美

✅ 完美

🟡 部分

5 大核心优势

  1. 🚀 真正的原生性能
    • uni-app x 编译为鸿蒙 6 原生代码(非 WebView)
    • 启动速度快 50%,运行流畅度媲美原生
    • 内存占用降低 30%
  2. **💡 开发效率提升 200%**:
    • 使用熟悉的 Vue 3 语法
    • 热重载、调试工具完善
    • 一套代码,5 端运行(HarmonyOS、Android、iOS、H5、小程序)
  3. 🌐 无缝对接鸿蒙 6 能力
    • 原生 API 直接调用(通知、振动、后台任务)
    • 支持鸿蒙 6 分布式特性
    • 完美适配折叠屏、穿戴设备
  4. 🎯 生态丰富
    • 10000+ 插件市场
    • 活跃的开发者社区
    • 完善的文档和示例
  5. 🔥 DCloud 官方支持
    • 全力支持鸿蒙生态建设
    • 及时更新适配鸿蒙最新版本
    • 提供技术支持和培训

一、鸿蒙 6 应用开发环境搭建

1.1 开发环境要求

要使用 uni-app x 开发鸿蒙 6 应用,需要准备以下环境:

硬件要求

  • CPU:Intel i5 / AMD Ryzen 5 及以上
  • 内存:16GB 及以上(推荐 32GB)
  • 硬盘:至少 50GB 可用空间(SSD 推荐)

软件环境

代码语言:javascript
复制
✅ 操作系统:
   - Windows 10/11(64位)
   - macOS 12.0+

✅ 开发工具:
   - HBuilderX 4.0+(内置 uni-app x + 鸿蒙6支持)
   - 下载地址:https://www.dcloud.io/hbuilderx.html

✅ 鸿蒙开发套件:
   - HarmonyOS 6 SDK(API Level 18+)
   - DevEco Studio(可选,用于查看API文档)
   - 下载地址:https://developer.huawei.com

✅ 开发语言:
   - UTS(uni-app TypeScript,编译为鸿蒙原生代码)

✅ 运行时:
   - Node.js 18.0+(LTS版本)
   - npm 9.0+ 或 pnpm 8.0+

获取开发者账号

  1. 注册华为开发者账号:https://developer.huawei.com
  2. 实名认证(个人或企业)
  3. 申请应用签名证书

1.2 鸿蒙 6 应用配置

manifest.json 中配置鸿蒙 6 应用信息(关键配置):

代码语言:javascript
复制
{
  "name": "simpleclock",
"appid": "your_app_id",
"description": "多功能时钟应用",
"versionName": "1.0.0",
"versionCode": "100",
"uni-app-x": {
    "harmony": {
      "minAPIVersion": "12",
      "targetAPIVersion": "12",
      "compatibleAPIVersion": "12",
      "abilities": [
        {
          "name": "MainAbility",
          "description": "时钟应用主界面"
        }
      ],
      "permissions": [
        "ohos.permission.KEEP_BACKGROUND_RUNNING",
        "ohos.permission.NOTIFICATION_CONTROLLER",
        "ohos.permission.VIBRATE"
      ]
    }
  }
}

1.3 项目架构设计

应用采用经典的 Tab Bar 导航结构,完美适配鸿蒙设计规范:

代码语言:javascript
复制
simpleclock/
├── pages/
│   ├── index/         # 时钟页面(世界时钟)
│   ├── alarm/         # 闹钟页面
│   ├── stopwatch/     # 秒表页面
│   ├── timer/         # 计时器页面
│   └── settings/      # 设置页面
├── App.uvue           # 应用入口(.uvue 是 uni-app x 专用格式)
├── pages.json         # 页面配置
├── uni.scss           # 全局样式变量
└── manifest.json      # 应用配置(含鸿蒙配置)

1.4 uni-app x 与传统 uni-app 的核心区别

特性

传统 uni-app

uni-app x(鸿蒙 6)

优势

编译方式

JavaScript 运行时

编译为鸿蒙原生代码

性能提升 50%

渲染引擎

WebView

鸿蒙原生渲染

流畅度大幅提升

性能表现

接近原生(80%)

100%原生性能

与原生开发一致

文件格式

.vue

.uvue

支持鸿蒙特性

开发语言

JavaScript/TypeScript

UTS

类型安全,性能更好

鸿蒙 6 支持

支持纯血鸿蒙

✅ 完美支持,未来演进方向

无缝对接鸿蒙 API

包体积

较大(含运行时)

更小(30%↓)

启动更快

热更新

✅ 支持

⚠️ 受限

鸿蒙安全限制

重要说明

  • 🔥 鸿蒙 6 应用必须使用 uni-app x
  • 🔥 传统 uni-app 只能运行在 HarmonyOS 兼容模式(非纯血)
  • 🔥 新项目强烈推荐直接使用 uni-app x

1.5 配置 pages.json(鸿蒙适配)

首先配置底部导航栏,这里特别注意鸿蒙平台的样式适配:

代码语言:javascript
复制
{
  "tabBar": {
    "color": "#999999",
    "selectedColor": "#FF6B00",
    "backgroundColor": "#2C2C2C",
    "borderStyle": "black",
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "时钟"
      },
      {
        "pagePath": "pages/alarm/alarm",
        "text": "闹钟"
      },
      {
        "pagePath": "pages/stopwatch/stopwatch",
        "text": "秒表"
      },
      {
        "pagePath": "pages/timer/timer",
        "text": "计时器"
      }
    ]
  }
}

1.6 鸿蒙平台条件编译

uni-app x 提供了强大的条件编译能力,可以针对鸿蒙平台做特殊处理:

代码语言:javascript
复制
// #ifdef APP-HARMONY
// 鸿蒙平台特有代码
import { vibrator } from '@kit.SensorServiceKit'
import { notificationManager } from '@kit.NotificationKit'
// #endif

// #ifdef APP-ANDROID
// Android 平台代码
// #endif

// #ifndef APP-HARMONY
// 非鸿蒙平台代码
// #endif

1.7 Material Design 深色主题配置(鸿蒙适配)

uni.scss 中定义全局颜色变量,完美适配鸿蒙深色模式:

代码语言:javascript
复制
/* Material Design 深色主题颜色 */
$primary-color: #FF6B00;        // 主色调(橙色)
$background-dark: #212121;      // 深色背景
$background-card: #2C2C2C;      // 卡片背景
$background-elevated: #3A3A3A;  // 高亮背景

$text-primary: #FFFFFF;         // 主要文本
$text-secondary: #CCCCCC;       // 次要文本
$text-disabled: #999999;        // 禁用文本

二、核心功能实现(鸿蒙原生 API 集成)

2.1 时钟页面 - 实时时间与多时区显示

2.1.1 实时时间更新(鸿蒙优化版)

在鸿蒙平台上,我们可以使用更高效的定时器机制。uni-app x 的 setInterval 会被编译为鸿蒙原生定时器:

代码语言:javascript
复制
export default {
  data() {
    return {
      currentTime: '9:23',
      period: 'a.m.',
      currentDate: 'Mon, 18 January',
      timeFormat: 12,
      timer: null
    }
  },
  onLoad() {
    this.updateTime()
    this.startTimer()
  },
methods: {
    updateTime() {
      const now = newDate()
      const hours = now.getHours()
      const minutes = now.getMinutes()

      if (this.timeFormat === 12) {
        const displayHours = hours % 12 || 12
        this.currentTime = displayHours + ':' +
          (minutes < 10 ? '0' : '') + minutes
        this.period = hours >= 12 ? 'p.m.' : 'a.m.'
      } else {
        this.currentTime = (hours < 10 ? '0' : '') + hours + ':' +
          (minutes < 10 ? '0' : '') + minutes
        this.period = ''
      }
    },
    startTimer() {
      this.timer = setInterval(() => {
        this.updateTime()
      }, 1000)
    }
  }
}
2.1.2 时间格式切换与鸿蒙数据持久化

使用 uni.storage API,在鸿蒙平台上会自动映射到鸿蒙的 Preferences 数据存储:

代码语言:javascript
复制
setTimeFormat(format) {
  this.timeFormat = format
  this.updateTime()
  // 在鸿蒙平台会自动使用 Preferences API
  uni.setStorageSync('timeFormat', format)
}

// 鸿蒙平台的存储路径
// /data/storage/el2/base/preferences/时钟应用/
2.1.3 鸿蒙系统时间获取优化
代码语言:javascript
复制
// #ifdef APP-HARMONY
import { systemDateTime } from '@kit.BasicServicesKit'

// 获取鸿蒙系统时间(更精确)
const harmonyTime = systemDateTime.getCurrentTime()
// #endif

2.2 闹钟页面 - 鸿蒙通知与后台任务

2.2.1 鸿蒙权限申请

在开发闹钟功能前,需要申请鸿蒙相关权限:

代码语言:javascript
复制
// manifest.json - 鸿蒙权限配置
{
  "uni-app-x": {
    "harmony": {
      "permissions": [
        "ohos.permission.NOTIFICATION_CONTROLLER",  // 通知权限
        "ohos.permission.VIBRATE",                  // 振动权限
        "ohos.permission.KEEP_BACKGROUND_RUNNING"   // 后台运行
      ],
      "backgroundModes": ["dataTransfer", "audioPlayback"]
    }
  }
}
代码语言:javascript
复制
// 运行时请求权限(鸿蒙平台)
// #ifdef APP-HARMONY
import { abilityAccessCtrl } from'@kit.AbilityKit'

asyncfunction requestPermissions() {
const atManager = abilityAccessCtrl.createAtManager()
try {
    await atManager.requestPermissionsFromUser(getContext(), [
      'ohos.permission.NOTIFICATION_CONTROLLER',
      'ohos.permission.VIBRATE'
    ])
  } catch (err) {
    console.error('权限申请失败', err)
  }
}
// #endif
2.2.2 数据结构设计

闹钟数据结构设计如下:

代码语言:javascript
复制
{
  time: '08:00',              // 时间
label: '起床',              // 标签
repeat: [false, true, ...], // 重复(周日到周六)
ringtone: 0,                // 铃声索引
vibrate: true,              // 振动
gradualVolume: true,        // 音量渐增
snooze: 10,                 // 贪睡时长(分钟)
enabled: true               // 是否启用
}
2.2.3 鸿蒙本地存储实现

uni.storage 在鸿蒙平台会自动使用 Preferences API,提供高性能的键值对存储:

代码语言:javascript
复制
methods: {
  // 加载闹钟
  loadAlarms() {
    const saved = uni.getStorageSync('alarms')
    if (saved) {
      this.alarms = JSON.parse(saved)
    }
  },

// 保存闹钟
  saveAlarms() {
    uni.setStorageSync('alarms', JSON.stringify(this.alarms))
  },

// 添加/编辑闹钟
  saveAlarm() {
    if (this.editIndex >= 0) {
      // 编辑现有闹钟
      this.alarms[this.editIndex] = this.editAlarmData
    } else {
      // 添加新闹钟
      this.alarms.push(this.editAlarmData)
    }
    this.saveAlarms()
    this.closeDialog()
  },

// 删除闹钟
  deleteAlarm() {
    uni.showModal({
      title: '确认删除',
      content: '确定要删除这个闹钟吗?',
      success: (res) => {
        if (res.confirm) {
          this.alarms.splice(this.editIndex, 1)
          this.saveAlarms()
        }
      }
    })
  }
}
2.2.4 鸿蒙通知发送

使用鸿蒙原生通知 API 发送闹钟提醒:

代码语言:javascript
复制
// #ifdef APP-HARMONY
import notificationManager from'@ohos.notificationManager'

// 发送鸿蒙通知
asyncfunction sendAlarmNotification(alarmData) {
const notificationRequest = {
    id: alarmData.id,
    content: {
      contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
      normal: {
        title: '闹钟提醒',
        text: alarmData.label || '该起床了!',
        additionalText: newDate().toLocaleTimeString()
      }
    },
    actionButtons: [
      {
        title: '贪睡',
        wantAgent: createSnoozeWantAgent()
      },
      {
        title: '关闭',
        wantAgent: createCloseWantAgent()
      }
    ]
  }

try {
    await notificationManager.publish(notificationRequest)
  } catch (err) {
    console.error('通知发送失败', err)
  }
}
// #endif

// 跨平台兼容写法
function sendNotification(alarmData) {
// #ifdef APP-HARMONY
  sendAlarmNotification(alarmData)
// #endif

// #ifndef APP-HARMONY
  uni.showModal({
    title: '闹钟提醒',
    content: alarmData.label || '该起床了!'
  })
// #endif
}
2.2.5 鸿蒙振动反馈
代码语言:javascript
复制
// #ifdef APP-HARMONY
import vibrator from'@ohos.vibrator'

// 鸿蒙振动效果
function vibrateHarmony() {
try {
    // 预定义振动效果
    vibrator.startVibration({
      type: 'preset',
      effectId: 'haptic.clock.timer',
      count: 3
    })

    // 或自定义振动
    vibrator.startVibration({
      type: 'time',
      duration: 1000
    })
  } catch (err) {
    console.error('振动失败', err)
  }
}
// #endif

// 跨平台振动封装
function triggerVibration() {
// #ifdef APP-HARMONY
  vibrateHarmony()
// #endif

// #ifndef APP-HARMONY
  uni.vibrateShort()
// #endif
}
2.2.6 弹窗表单设计

使用自定义弹窗组件实现闹钟编辑界面:

代码语言:javascript
复制
<view v-if="showDialog" class="dialog-mask" @click="closeDialog">
  <view class="dialog" @click.stop>
    <view class="dialog-header">
      <text class="dialog-title">
        {{editIndex >= 0 ? '编辑闹钟' : '添加闹钟'}}
      </text>
    </view>

    <view class="dialog-content">
      <!-- 时间选择器 -->
      <picker mode="time" :value="editAlarmData.time"
              @change="onTimeChange">
        <text>{{editAlarmData.time}}</text>
      </picker>

      <!-- 周重复选择 -->
      <view class="week-selector">
        <text v-for="(day, i) in weekDays" :key="i"
              :class="{'active': editAlarmData.repeat[i]}"
              @click="toggleDay(i)">
          {{day}}
        </text>
      </view>
    </view>
</view>
</view>

2.3 秒表页面 - 高精度计时与圈数记录

2.3.1 高精度计时实现

使用 10ms 间隔实现百分之一秒精度:

代码语言:javascript
复制
export default {
  data() {
    return {
      isRunning: false,
      totalTime: 0,      // 总时间(毫秒)
      startTime: 0,
      timer: null,
      laps: []           // 圈数记录
    }
  },
computed: {
    formattedTime() {
      const totalSeconds = Math.floor(this.totalTime / 1000)
      const minutes = Math.floor(totalSeconds / 60)
      const seconds = totalSeconds % 60
      return (minutes < 10 ? '0' : '') + minutes + ':' +
             (seconds < 10 ? '0' : '') + seconds
    },
    milliseconds() {
      returnString(Math.floor((this.totalTime % 1000) / 10))
        .padStart(2, '0')
    }
  },
methods: {
    start() {
      this.isRunning = true
      this.startTime = Date.now() - this.totalTime
      this.timer = setInterval(() => {
        this.totalTime = Date.now() - this.startTime
      }, 10)  // 10ms 更新一次
    }
  }
}
2.3.2 圈数记录与排序

实现圈数记录和多种排序方式:

代码语言:javascript
复制
methods: {
  recordLap() {
    const lapTime = this.totalTime - this.lastLapTime
    this.lapCounter++

    this.laps.unshift({
      id: Date.now(),
      index: this.lapCounter,
      time: this.formatTime(lapTime),
      rawTime: lapTime
    })

    this.lastLapTime = this.totalTime
  }
},
computed: {
  sortedLaps() {
    let sorted = [...this.laps]

    // 根据排序模式排序
    if (this.sortMode === 'fastest') {
      sorted.sort((a, b) => a.rawTime - b.rawTime)
    } elseif (this.sortMode === 'slowest') {
      sorted.sort((a, b) => b.rawTime - a.rawTime)
    }

    // 标记最快和最慢
    if (sorted.length > 1) {
      const times = this.laps.map(l => l.rawTime)
      const fastest = Math.min(...times)
      const slowest = Math.max(...times)

      sorted = sorted.map(lap => ({
        ...lap,
        isFastest: lap.rawTime === fastest,
        isSlowest: lap.rawTime === slowest && fastest !== slowest
      }))
    }

    return sorted
  }
}

2.4 计时器页面 - 倒计时与进度显示

2.4.1 时间选择器实现

使用 picker-view 实现时间选择:

代码语言:javascript
复制
<view class="picker-row">
  <view class="picker-group">
    <picker-view class="picker" :value="[hours]"
                 @change="onHoursChange">
      <picker-view-column>
        <view v-for="n in 24" :key="n" class="picker-item">
          <text>{{n - 1}}</text>
        </view>
      </picker-view-column>
    </picker-view>
    <text class="picker-label">小时</text>
</view>

<!-- 分钟和秒的选择器类似 -->
</view>
2.4.2 进度条实现

实时计算并显示倒计时进度:

代码语言:javascript
复制
computed: {
  progressPercent() {
    if (this.totalSeconds === 0) return 0
    return Math.floor(
      (this.totalSeconds - this.remainingTime) /
      this.totalSeconds * 100
    )
  }
}
代码语言:javascript
复制
<view class="progress-bar">
  <view class="progress-fill"
        :style="{width: progressPercent + '%'}">
  </view>
</view>
2.4.3 倒计时完成处理
代码语言:javascript
复制
onTimerComplete() {
  this.stopTimer()
this.isRunning = false

// 振动提醒
if (this.vibrate) {
    // uni.vibrateLong()
  }

// 弹窗通知
if (this.notification) {
    uni.showModal({
      title: '计时完成',
      content: '计时器时间已到!',
      showCancel: false
    })
  }
}

2.5 设置页面 - 丰富的个性化选项

2.5.1 屏幕常亮功能
代码语言:javascript
复制
onKeepScreenOnChange(e) {
  this.keepScreenOn = e.detail.value
  uni.setStorageSync('keepScreenOn', this.keepScreenOn)

  uni.setKeepScreenOn({
    keepScreenOn: this.keepScreenOn
  })

  uni.showToast({
    title: this.keepScreenOn ?
      '屏幕常亮已开启' : '屏幕常亮已关闭',
    icon: 'none'
  })
}
2.5.2 数据清除功能
代码语言:javascript
复制
clearData() {
  uni.showModal({
    title: '确认清除',
    content: '此操作将清除所有闹钟和设置数据,无法恢复。确定要继续吗?',
    confirmText: '清除',
    confirmColor: '#F44336',
    success: (res) => {
      if (res.confirm) {
        uni.clearStorageSync()
        uni.showToast({
          title: '数据已清除',
          icon: 'success'
        })
        // 重启应用
        setTimeout(() => {
          uni.reLaunch({
            url: '/pages/index/index'
          })
        }, 1500)
      }
    }
  })
}

三、UI/UX 设计与优化

3.1 Material Design 样式实现

3.1.1 卡片阴影效果
代码语言:javascript
复制
.card {
  background-color: #2C2C2C;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
}
3.1.2 悬浮按钮(FAB)
代码语言:javascript
复制
.add-btn {
  position: fixed;
  right: 20px;
  bottom: 100px;
  width: 60px;
  height: 60px;
  background-color: #FF6B00;
  border-radius: 30px;
  display: flex;
  justify-content: center;
  align-items: center;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
}

3.2 颜色系统

深色主题配色方案:

元素

颜色值

用途

主色

#FF6B00

按钮、选中状态、导航栏

背景

#212121

页面背景

卡片

#2C2C2C

列表项、卡片背景

分隔

#3A3A3A

边框、分隔线

文本主

#FFFFFF

主要文本

文本次

#CCCCCC

次要文本

文本禁

#999999

禁用文本

3.3 交互优化

3.3.1 空状态设计
代码语言:javascript
复制
<view v-if="alarms.length === 0" class="empty-state">
  <text class="empty-text">暂无闹钟</text>
  <text class="empty-hint">点击下方 "+" 按钮添加闹钟</text>
</view>
3.3.2 加载状态与反馈
代码语言:javascript
复制
// 操作成功提示
uni.showToast({
title: '保存成功',
icon: 'success'
})

// 确认对话框
uni.showModal({
title: '确认删除',
content: '确定要删除这个闹钟吗?',
success: (res) => {
    if (res.confirm) {
      // 执行删除
    }
  }
})

四、性能优化

4.1 计时器管理

确保在页面卸载时清除定时器,避免内存泄漏:

代码语言:javascript
复制
export default {
  onUnload() {
    this.stopTimer()
  },
  methods: {
    stopTimer() {
      if (this.timer) {
        clearInterval(this.timer)
        this.timer = null
      }
    }
  }
}

4.2 数据缓存策略

  • 使用 uni.setStorageSync 同步存储关键数据
  • 页面加载时从本地读取数据,减少计算
  • 数据变更时立即保存,确保数据一致性

4.3 列表渲染优化

使用 :key 提升列表渲染性能:

代码语言:javascript
复制
<view v-for="(alarm, index) in alarms"
      :key="alarm.id || index"
      class="alarm-item">
  <!-- 内容 -->
</view>

五、鸿蒙平台深度适配

5.1 鸿蒙返回键处理

鸿蒙系统的返回键需要特殊处理,实现双击退出:

代码语言:javascript
复制
// #ifdef APP-HARMONY
let firstBackTime = 0

exportdefault {
onLastPageBackPress: function () {
    console.log('HarmonyOS 返回键按下')
    if (firstBackTime == 0) {
      uni.showToast({
        title: '再按一次退出应用',
        position: 'bottom',
      })
      firstBackTime = Date.now()
      setTimeout(() => {
        firstBackTime = 0
      }, 2000)
    } elseif (Date.now() - firstBackTime < 2000) {
      uni.exit() // 退出应用
    }
  }
}
// #endif

5.2 鸿蒙屏幕常亮

利用鸿蒙的电源管理 API 实现屏幕常亮:

代码语言:javascript
复制
// #ifdef APP-HARMONY
import { runningLock } from'@kit.BasicServicesKit'

let screenLock = null

// 保持屏幕常亮
function keepScreenOn() {
try {
    screenLock = runningLock.createRunningLock('screen',
      runningLock.RunningLockType.RUNNINGLOCK_SCREEN)
    screenLock.lock(0) // 0 表示永久锁定
  } catch (err) {
    console.error('屏幕常亮失败', err)
  }
}

// 释放屏幕锁
function releaseScreenLock() {
if (screenLock) {
    screenLock.unlock()
    screenLock = null
  }
}
// #endif

// 跨平台封装
function setKeepScreenOn(keep) {
// #ifdef APP-HARMONY
if (keep) {
    keepScreenOn()
  } else {
    releaseScreenLock()
  }
// #endif

// #ifndef APP-HARMONY
  uni.setKeepScreenOn({ keepScreenOn: keep })
// #endif
}

5.3 鸿蒙后台任务

实现闹钟的后台运行:

代码语言:javascript
复制
// #ifdef APP-HARMONY
import backgroundTaskManager from'@ohos.resourceschedule.backgroundTaskManager'

// 申请长时任务
asyncfunction requestBackgroundTask() {
try {
    await backgroundTaskManager.requestSuspendDelay('时钟后台任务', () => {
      console.log('后台任务即将被挂起')
      // 保存状态
    })
  } catch (err) {
    console.error('后台任务申请失败', err)
  }
}
// #endif

5.4 鸿蒙安全区域适配

考虑鸿蒙设备的刘海屏、水滴屏和折叠屏:

代码语言:javascript
复制
.container {
  // 鸿蒙安全区域
  padding-top: env(safe-area-inset-top);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

// 鸿蒙折叠屏适配
@media screen and (min-width: 600px) {
  .container {
    max-width: 600px;
    margin: 0 auto;
  }
}

5.5 鸿蒙生命周期适配

代码语言:javascript
复制
export default {
// 应用前台
  onShow() {
    // #ifdef APP-HARMONY
    console.log('HarmonyOS 应用进入前台')
    this.resumeTimers() // 恢复计时器
    // #endif
  },

// 应用后台
  onHide() {
    // #ifdef APP-HARMONY
    console.log('HarmonyOS 应用进入后台')
    this.pauseTimers() // 暂停计时器
    this.saveState() // 保存状态
    // #endif
  }
}

5.6 鸿蒙深色模式适配

鸿蒙系统的深色模式可以自动切换:

代码语言:javascript
复制
// #ifdef APP-HARMONY
import { configuration } from'@kit.AbilityKit'

// 监听系统主题变化
function watchThemeChange() {
const config = configuration.getConfiguration()
const isDark = config.colorMode === configuration.ColorMode.COLOR_MODE_DARK

// 应用深色主题
if (isDark) {
    this.applyDarkTheme()
  } else {
    this.applyLightTheme()
  }
}
// #endif

六、鸿蒙应用测试与调试

6.1 鸿蒙开发者模式

在鸿蒙设备上启用开发者模式:

  1. 进入"设置" → "关于手机"
  2. 连续点击"版本号"7 次
  3. 返回"设置" → "系统和更新" → "开发者选项"
  4. 开启"USB 调试"和"USB 安装"

6.2 HBuilderX 真机调试

代码语言:javascript
复制
# 1. 连接鸿蒙设备
# 2. 在 HBuilderX 中选择运行设备
# 3. 点击"运行" → "运行到手机或模拟器" → "运行到 HarmonyOS"

# 查看日志
hdc shell hilog | grep "simpleclock"

6.3 鸿蒙特有功能测试清单

  • [ ] 通知权限:闹钟通知是否正常显示
  • [ ] 振动权限:振动反馈是否生效
  • [ ] 后台任务:应用后台时闹钟是否正常工作
  • [ ] 屏幕常亮:前台运行时屏幕是否保持常亮
  • [ ] 数据持久化:应用重启后数据是否保留
  • [ ] 深色模式:系统切换主题时应用是否自动适配
  • [ ] 折叠屏适配:在折叠屏设备上布局是否正常
  • [ ] 返回键处理:双击返回是否正常退出

6.4 性能测试(鸿蒙平台)

代码语言:javascript
复制
// 使用鸿蒙性能追踪
// #ifdef APP-HARMONY
import hiTraceMeter from '@ohos.hiTraceMeter'

// 开始性能追踪
hiTraceMeter.startTrace('stopwatch_timing', 1001)

// 执行计时逻辑
this.updateStopwatchTime()

// 结束追踪
hiTraceMeter.finishTrace('stopwatch_timing', 1001)
// #endif

6.2 边界情况处理

代码语言:javascript
复制
// 防止重复点击
if (this.totalSeconds === 0) {
  uni.showToast({
    title: '请设置计时时间',
    icon: 'none'
  })
return
}

// 数据验证
if (!editAlarmData.time) {
  uni.showToast({
    title: '请选择时间',
    icon: 'none'
  })
return
}

七、项目总结

7.1 技术亮点

  1. 完整的功能闭环:从时间显示到提醒管理,覆盖用户全部需求
  2. 优雅的代码结构:模块化设计,职责清晰
  3. 良好的用户体验:Material Design + 深色主题
  4. 高性能实现:合理使用定时器,优化渲染性能
  5. 跨平台兼容:一套代码,多端运行

7.2 可扩展方向

  1. 云同步功能:支持多设备数据同步
  2. 更多铃声:支持自定义铃声上传
  3. 统计分析:记录使用习惯,提供数据分析
  4. 智能提醒:根据用户习惯智能推荐闹钟时间
  5. 主题定制:支持更多颜色主题

7.3 开发心得

  1. 用户体验至上:每一个交互细节都要仔细打磨
  2. 代码质量:保持代码简洁,注重可维护性
  3. 性能优化:及时清理资源,避免内存泄漏
  4. 测试驱动:充分测试各种边界情况
  5. 持续迭代:根据用户反馈不断优化改进

八、源码与资源

8.1 项目结构

代码语言:javascript
复制
simpleclock/
├── pages/
│   ├── index/index.uvue      # 264 行
│   ├── alarm/alarm.uvue      # 430 行
│   ├── stopwatch/stopwatch.uvue  # 280 行
│   ├── timer/timer.uvue      # 300 行
│   └── settings/settings.uvue    # 350 行
├── App.uvue                  # 124 行
├── pages.json                # 76 行
├── uni.scss                  # 77 行
├── README.md                 # 项目说明
└── 使用指南.md               # 用户手册

8.2 代码统计

  • 总代码量:约 1900+ 行
  • 页面数:5 个主要页面
  • 组件数:多个自定义组件
  • 功能模块:4 个核心功能

8.3 运行环境

  • 开发工具:HBuilderX 4.0+
  • uni-app x 版本:最新版
  • 鸿蒙系统:HarmonyOS 6
  • 鸿蒙 SDK:API Level 10+
  • 测试设备:
    • 华为 Mate 60 系列(HarmonyOS 6)
    • 华为 MatePad Pro(折叠屏测试)
    • 鸿蒙模拟器

8.4 鸿蒙应用发布

8.4.1 应用签名
代码语言:javascript
复制
# 在华为开发者联盟申请应用签名
# 下载签名文件并配置到 manifest.json

{
"uni-app-x": {
    "harmony": {
      "signing": {
        "profile": "path/to/profile.p7b",
        "certFile": "path/to/cert.pem",
        "keyFile": "path/to/key.p12",
        "keyPassword": "your_password"
      }
    }
  }
}
8.4.2 打包发布
代码语言:javascript
复制
# HBuilderX 中操作:
# 1. 发行 → 原生App-云打包
# 2. 选择 HarmonyOS 平台
# 3. 填写应用信息和签名配置
# 4. 点击打包,等待云端编译
# 5. 下载 .hap 安装包

# 命令行打包(可选)
npm run build:app-harmony
8.4.3 应用上架
  1. 登录华为开发者联盟
  2. 进入"应用服务" → "AppGallery Connect"
  3. 创建应用并上传 .hap 包
  4. 填写应用信息(截图、描述、分类)
  5. 提交审核
  6. 审核通过后上架

九、鸿蒙开发常见问题

9.1 权限被拒绝

问题:应用无法发送通知或振动

解决

代码语言:javascript
复制
// 在应用启动时主动请求权限
// #ifdef APP-HARMONY
asyncfunction checkAndRequestPermissions() {
const permissions = [
    'ohos.permission.NOTIFICATION_CONTROLLER',
    'ohos.permission.VIBRATE'
  ]

for (let permission of permissions) {
    const result = await checkPermission(permission)
    if (!result) {
      await requestPermission(permission)
    }
  }
}
// #endif

9.2 后台任务被终止

问题:闹钟在后台不响

解决:申请长时任务授权,确保应用在后台持续运行

9.3 数据丢失

问题:应用卸载后数据丢失

解决:使用鸿蒙云空间同步数据(需要用户登录华为账号)

9.4 性能问题

问题:页面切换卡顿

解决

  • 使用虚拟列表优化长列表渲染
  • 避免在主线程执行耗时操作
  • 使用鸿蒙的 Worker 线程处理复杂计算

结语

本文详细介绍了如何使用 uni-app x 开发一款功能完整的鸿蒙 6 原生时钟应用,从环境搭建、核心功能实现、鸿蒙 6 平台深度适配到应用发布,涵盖了鸿蒙 6 应用开发的各个方面。

🎉 这是一个真实的鸿蒙 6 原生应用开发案例!

核心要点回顾

  1. uni-app x 的优势
    • ✅ 编译为鸿蒙原生代码,性能卓越
    • ✅ 一套代码多端运行,大幅降低开发成本
    • ✅ 丰富的 API 支持,无缝对接鸿蒙能力
  2. 鸿蒙平台特性
    • ✅ 强大的通知系统
    • ✅ 完善的权限管理
    • ✅ 优秀的后台任务机制
    • ✅ 深度的系统集成
  3. 开发建议
    • 💡 充分利用条件编译,针对鸿蒙做优化
    • 💡 注意权限申请和用户体验
    • 💡 重视性能优化和内存管理
    • 💡 遵循鸿蒙设计规范

希望这篇文章能帮助你:

  • 🎯 零基础入门:从环境搭建到应用发布的完整流程
  • 🎨 深度理解鸿蒙 6:掌握鸿蒙 6 的核心特性和设计理念
  • 💡 实战经验:学习时间管理类应用的最佳实践
  • 🚀 快速上手:30 分钟开发出第一个鸿蒙 6 应用
  • 🔥 抓住机遇:在鸿蒙生态爆发期占据先机

下一步计划

  • [ ] 适配鸿蒙折叠屏设备
  • [ ] 接入华为账号系统
  • [ ] 实现华为云空间数据同步
  • [ ] 添加鸿蒙小部件(Widget)
  • [ ] 接入鸿蒙分布式能力

如果你有任何问题或建议,欢迎交流讨论!让我们一起为鸿蒙生态贡献力量!🚀


关键词:#鸿蒙 6 #HarmonyOS6 #uni-app-x #纯血鸿蒙 #原生应用开发 #Vue3 #跨平台开发 #时钟应用

作者:坚果

日期:2025 年 10 月 28 日 项目地址GitCode - simpleclock[1] 开源协议:MIT License


📢 开源说明

本项目完全开源,欢迎:

  • ⭐ Star 项目,关注后续更新
  • 🍴 Fork 项目,二次开发
  • 🐛 提交 Issue,反馈问题
  • 🤝 提交 PR,贡献代码

当前状态

  • ✅ 核心功能已完成
  • ⚠️ 部分细节待优化(如时区同步、铃声播放等)
  • 🎯 持续迭代中,欢迎贡献代码!

🔗 相关资源

  • uni-app x 官方文档[2]
  • 鸿蒙 6 开发者文档[3]
  • HBuilderX 下载[4]
  • 华为开发者联盟[5]

💬 交流讨论

如果你在开发过程中遇到问题,或有好的想法和建议:

  • 💬 欢迎在项目 Issue 区讨论[6]

让我们一起推动鸿蒙生态发展! 🚀🇨🇳

参考资料

[1]

GitCode - simpleclock: https://gitcode.com/nutpi/simpleclock

[2]

uni-app x 官方文档: https://uniapp.dcloud.net.cn/uni-app-x/

[3]

鸿蒙6开发者文档: https://developer.huawei.com/consumer/cn/

[4]

HBuilderX 下载: https://www.dcloud.io/hbuilderx.html

[5]

华为开发者联盟: https://developer.huawei.com

[6]

项目 Issue 区讨论: https://gitcode.com/nutpi/simpleclock

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大前端之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀 从零到一开发鸿蒙 6 原生时钟应用:uni-app x 完全实战指南
    • 前言
      • 🌟 项目亮点
      • 🛠️ 技术栈
      • 🤔 为什么选择 uni-app x 开发鸿蒙 6 应用?
    • 一、鸿蒙 6 应用开发环境搭建
      • 1.1 开发环境要求
      • 1.2 鸿蒙 6 应用配置
      • 1.3 项目架构设计
      • 1.4 uni-app x 与传统 uni-app 的核心区别
      • 1.5 配置 pages.json(鸿蒙适配)
      • 1.6 鸿蒙平台条件编译
      • 1.7 Material Design 深色主题配置(鸿蒙适配)
    • 二、核心功能实现(鸿蒙原生 API 集成)
      • 2.1 时钟页面 - 实时时间与多时区显示
      • 2.2 闹钟页面 - 鸿蒙通知与后台任务
      • 2.3 秒表页面 - 高精度计时与圈数记录
      • 2.4 计时器页面 - 倒计时与进度显示
      • 2.5 设置页面 - 丰富的个性化选项
    • 三、UI/UX 设计与优化
      • 3.1 Material Design 样式实现
      • 3.2 颜色系统
      • 3.3 交互优化
    • 四、性能优化
      • 4.1 计时器管理
      • 4.2 数据缓存策略
      • 4.3 列表渲染优化
    • 五、鸿蒙平台深度适配
      • 5.1 鸿蒙返回键处理
      • 5.2 鸿蒙屏幕常亮
      • 5.3 鸿蒙后台任务
      • 5.4 鸿蒙安全区域适配
      • 5.5 鸿蒙生命周期适配
      • 5.6 鸿蒙深色模式适配
    • 六、鸿蒙应用测试与调试
      • 6.1 鸿蒙开发者模式
      • 6.2 HBuilderX 真机调试
      • 6.3 鸿蒙特有功能测试清单
      • 6.4 性能测试(鸿蒙平台)
      • 6.2 边界情况处理
    • 七、项目总结
      • 7.1 技术亮点
      • 7.2 可扩展方向
      • 7.3 开发心得
    • 八、源码与资源
      • 8.1 项目结构
      • 8.2 代码统计
      • 8.3 运行环境
      • 8.4 鸿蒙应用发布
    • 九、鸿蒙开发常见问题
      • 9.1 权限被拒绝
      • 9.2 后台任务被终止
      • 9.3 数据丢失
      • 9.4 性能问题
    • 结语
      • 核心要点回顾
      • 下一步计划
      • 📢 开源说明
      • 🔗 相关资源
      • 💬 交流讨论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档