HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知
HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知 学习应用需要实现成就系统,当用户达成特定条件时自动解锁成就并通知用户。
3 回复
原理解析
成就系统核心逻辑:
- 定义成就列表和解锁条件
- 在关键操作后检查是否满足解锁条件
- 解锁新成就时通知用户
- 持久化已解锁的成就
解决步骤
步骤1:定义成就接口和列表
export interface Achievement {
id: string;
name: string;
description: string;
icon: string;
condition: string;
unlockedAt?: number;
}
export const ACHIEVEMENT_DEFINITIONS: Achievement[] = [
{ id: 'first_browse', name: '初次翻阅', description: '翻阅第一条内容', icon: '🎯', condition: '翻阅1条内容' },
{ id: 'browse_10', name: '学习新手', description: '翻阅10条内容', icon: '📖', condition: '翻阅10条内容' },
{ id: 'browse_50', name: '勤奋学员', description: '翻阅50条内容', icon: '📚', condition: '翻阅50条内容' },
{ id: 'browse_100', name: '百条达人', description: '翻阅100条内容', icon: '🏆', condition: '翻阅100条内容' },
{ id: 'streak_3', name: '三天坚持', description: '连续打卡3天', icon: '🔥', condition: '连续学习3天' },
{ id: 'streak_7', name: '一周坚持', description: '连续打卡7天', icon: '💪', condition: '连续学习7天' },
{ id: 'quiz_first', name: '首次测验', description: '完成第一次测验', icon: '✏️', condition: '完成1次测验' },
{ id: 'quiz_perfect', name: '满分达人', description: '测验获得满分', icon: '💯', condition: '测验得分100%' },
{ id: 'favorite_10', name: '收藏爱好者', description: '收藏10条内容', icon: '⭐', condition: '收藏10条内容' },
{ id: 'note_5', name: '笔记达人', description: '写5条笔记', icon: '📒', condition: '写5条笔记' }
];
步骤2:解锁成就方法
export async function unlockAchievement(achievementId: string): Promise<boolean> {
if (!store) return false;
try {
const achievements = await getAchievements();
const exists = achievements.some(a => a.id === achievementId);
if (!exists) {
const definition = ACHIEVEMENT_DEFINITIONS.find(d => d.id === achievementId);
if (definition) {
const newAchievement: Achievement = {
...definition,
unlockedAt: Date.now()
};
achievements.push(newAchievement);
await safeWrite(KEY_ACHIEVEMENTS, JSON.stringify(achievements));
// 显示解锁通知
promptAction.showToast({
message: `🎉 解锁成就:${definition.name}`,
duration: 2000
});
return true;
}
}
return false;
} catch (error) {
return false;
}
}
步骤3:检查并解锁成就
export async function checkAndUnlockAchievements(): Promise<void> {
// 获取各项统计数据
const browseStats = await getBrowseStats();
const streakDays = await getStreakDays();
const quizStats = await getQuizStats();
const favorites = await getFavorites();
const notes = await getNotes();
// 检查浏览相关成就
if (browseStats.total >= 1) await unlockAchievement('first_browse');
if (browseStats.total >= 10) await unlockAchievement('browse_10');
if (browseStats.total >= 50) await unlockAchievement('browse_50');
if (browseStats.total >= 100) await unlockAchievement('browse_100');
// 检查连续打卡成就
if (streakDays >= 3) await unlockAchievement('streak_3');
if (streakDays >= 7) await unlockAchievement('streak_7');
// 检查测验成就
if (quizStats.total >= 1) await unlockAchievement('quiz_first');
if (quizStats.bestScore === 100) await unlockAchievement('quiz_perfect');
// 检查收藏和笔记成就
if (favorites.length >= 10) await unlockAchievement('favorite_10');
if (notes.length >= 5) await unlockAchievement('note_5');
}
步骤4:在关键操作后调用检查
// 浏览内容后
export async function recordBrowse(...): Promise<boolean> {
// ... 保存浏览记录
await checkAndUnlockAchievements();
return true;
}
// 完成测验后
async finishQuiz(): Promise<void> {
await saveQuizRecord(record);
await checkAndUnlockAchievements();
}
效果图
用户完成操作 → 检查成就条件 → 满足条件 → 解锁成就 → Toast通知"🎉 解锁成就:xxx"
更多关于HarmonyOS鸿蒙Next中如何实现成就系统?解锁条件检测和通知的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,可通过AbilityKit框架实现成就系统。使用分布式数据管理存储成就状态,通过分布式任务调度检测解锁条件。状态变化时,使用通知服务触发系统通知。具体涉及FormKit创建成就卡片,NotificationKit发送成就解锁提醒。
在HarmonyOS Next中实现成就系统,主要涉及解锁条件检测和成就通知两大模块。以下是核心实现思路和关键API:
1. 成就数据管理与存储
- 使用
[@ohos](/user/ohos).data.relationalStore(关系型数据库)或[@ohos](/user/ohos).data.preferences(首选项)持久化存储成就状态(如未解锁/已解锁、解锁时间)。 - 建议数据库表结构包含:成就ID、成就名称、描述、图标资源、解锁条件类型、当前进度、状态等字段。
2. 解锁条件实时检测
- 主动触发检测:在用户完成关键操作(如学习时长累计、章节完成、答题正确率达标)后,调用业务逻辑更新成就进度。
- 被动状态监听:利用Ability生命周期回调、UI状态变化或
[@ohos](/user/ohos).app.ability.common中的事件订阅,监听应用状态变化。 - 进度计算:在检测到条件相关事件时,查询当前成就进度,计算是否满足解锁阈值。例如:
// 示例:更新学习时长成就进度 async updateStudyTimeAchievement(duration: number) { const achievement = await this.getAchievementFromDB('achievement_study_time'); achievement.currentProgress += duration; if (achievement.currentProgress >= achievement.unlockThreshold && !achievement.unlocked) { await this.unlockAchievement(achievement.id); } }
3. 成就解锁与通知
- 解锁触发:当条件满足时,更新数据库成就状态为“已解锁”,并记录解锁时间。
- 即时通知:使用
[@ohos](/user/ohos).notificationManager发送即时通知:import notificationManager from '[@ohos](/user/ohos).notificationManager'; async sendAchievementNotification(achievement: Achievement) { const notificationRequest: notificationManager.NotificationRequest = { content: { title: '成就解锁!', text: `恭喜获得「${achievement.name}」:${achievement.description}`, // 可设置成就图标等 }, id: achievement.id // 使用成就ID作为通知ID避免重复 }; await notificationManager.publish(notificationRequest); } - 应用内提示:可结合
[@ohos](/user/ohos).arkui.advanced.Components(如Dialog或自定义弹窗)在UI层展示成就解锁动效。
4. 状态同步与防重复
- 使用数据库事务确保成就状态更新的原子性。
- 通过成就状态标志位(如
unlocked)和通知记录,避免重复解锁和重复通知。
5. 扩展建议
- 条件抽象:可设计通用的“条件检测器”接口,便于扩展多种成就类型(如连续登录、社交互动)。
- 云同步:若支持多设备,通过
[@ohos](/user/ohos).data.distributedData实现成就状态跨设备同步。
此方案通过本地数据管理、事件驱动检测和系统通知服务,即可实现轻量高效的成就系统。注意合理规划检测频率以平衡性能与实时性。

