【 OpenHarmony 系统应用源码解析 】-- Launcher 初体验

打印 上一主题 下一主题

主题 1070|帖子 1070|积分 3214

前言

近来因为业务需要,需要做一款 UI 定制的鸿蒙 Launcher,于是就开始了「找到代码」、「研究代码」、「魔改代码」的套路流程,仅以此文章作为知识备份和技能探究所用,也希望能给其他小伙伴提供一些源码的解析思绪,方法大家各自魔改!

一、官方简介

Gitee codes:应用子系统/Launcher
Launcher 作为系统人机交互的主要入口,提供应用图标的表现、点击启动、卸载应用,并提供桌面布局设置以及近来使命管理等功能。
Launcher 接纳扩展的 TS 语言(ArkTS)开辟
1.1 主要结构


1.2 分层说明

Module层级说明product业务形态层区分差异产品、差异屏幕的各形态桌面,含有桌面窗口、个性化业务,组件的设置,以及个性化资源包。feature公共特性层抽象的公共特性组件集合,可以被各桌面形态引用。common公共本领层基础本领集,每个桌面形态都必须依靠的模块。 1.3 目录结构

  1. /applications/standard/launcher/
  2. ├── common                    # 公共能力层目录
  3. ├── docs                      # 开发指南
  4. ├── feature                   # 公共特性层目录
  5. │   └── appcenter             # 应用中心
  6. │   └── bigfolder             # 智能文件夹
  7. │   ├── form                  # 桌面卡片管理功能
  8. │   ├── gesturenavigation     # 手势导航
  9. │   ├── pagedesktop           # 工作区
  10. │   ├── recents               # 最近任务
  11. │   ├── settings              # 桌面设置
  12. │   ├── smartdock             # dock工具栏
  13. ├── product                   # 业务形态层目录
  14. ├── signature                 # 签名证书
复制代码
1.4 开辟调试

IDE 下载:建议大家直接下载 OpenHarmony 4.1 Release DevEco-Studio 吧,API 支持 8 ~ 11

1.5 SDK

Launcher 应用的编译需使用相对应版本的 ohos-sdk-full \ mac-sdk-full 来举行开辟调试。
IDE 上是 Public SDK,故 full sdk 需要重新下载,下载地址:
新版本界面:http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist
老版本界面:http://ci.openharmony.cn/dailys/dailybuilds
具体下载及如何替换这边就不啰嗦了,大家直接看 Gitee 介绍自行替换。
1.6 签名设置

关于签名设置,也不啰嗦了,下载的代码自带的文件都已经设置好,无需自己手动签名。
1.7 替换 Launcher

使用以下下令来更新编译出来的 Launcher 部件 hap 包:
  1. ren phone_launcher-default-signed.hap Launcher.hap
  2. ren launcher_settings-phone_launcher-default-signed.hap Launcher_Settings.hap
  3. hdc target mount
  4. hdc shell rm -rf /data/misc_de/0/mdds/0/default/bundle_manager_service
  5. hdc shell rm -rf /data/accounts
  6. hdc shell mount -o remount,rw /
  7. hdc file send .\Launcher.hap /system/app/com.ohos.launcher/Launcher.hap
  8. hdc file send .\Launcher_Settings.hap /system/app/com.ohos.launcher/Launcher_Settings.hap
  9. pause
  10. hdc shell mount -o remount,rw /
  11. hdc shell rm /data/ -rf
  12. hdc shell sync /system/bin/udevadm trigger
  13. hdc shell reboot
复制代码

二、编译运行

2.1 分支选择

拉完官方示例代码后,可以看到很多分支,我选了 OpenHarmony-4.1-Release 作为魔改的基础分支,当然你也可以根据需要选择别的分支(我是着实看不懂,搞这么多分支干什么,而且基本上彼此分支的 UI 结果大差不差,险些所有 Openharmony 自带的系统应用 Demo UI 及功能逻辑都很 low,所以凡事靠自己,自己魔改吧!)

2.2 打开工程 / 编译 hap

切到对应分支后,即可打开工程,等待同步完成,如下图即可。

接下来可以编译 hap 包:

接着找到需要的 hap 包,重命名,替换后重启:

默认 Launcher 结果:(我手里有一台平板,所以就以平板为示例,结果要比手机少一点)


三、Launcher 首页

3.1 MainAbility

  1. export default class MainAbility extends ServiceExtension {
  2.   onCreate(want: Want): void {
  3.     Log.showInfo(TAG,'onCreate start');
  4.     this.context.area = 0;
  5.     this.initLauncher();
  6.   }
  7.   async initLauncher(): Promise<void> {
  8.     /**
  9.      * 1. init Launcher context
  10.      *    初始化上下文
  11.      */
  12.     globalThis.desktopContext = this.context;
  13.     /**
  14.      * 2. init global const
  15.      *    初始化全局变量
  16.      */
  17.     this.initGlobalConst();
  18.     /**
  19.      * 3. init Gesture navigation
  20.      *    初始化手势导航
  21.      */
  22.     this.startGestureNavigation();
  23.     /**
  24.      * 4. init rdb
  25.      *    初始化 rdb
  26.      */
  27.     let dbStore = RdbStoreManager.getInstance();
  28.     await dbStore.initRdbConfig();
  29.     await dbStore.createTable();
  30.     let registerWinEvent = (win: window.Window) => {
  31.       win.on('windowEvent', (stageEventType) => {
  32.         // 桌面获焦或失焦时,通知桌面的卡片变为可见状态
  33.         if (stageEventType === window.WindowEventType.WINDOW_ACTIVE) {
  34.           localEventManager.sendLocalEventSticky(EventConstants.EVENT_REQUEST_FORM_ITEM_VISIBLE, null);
  35.           Log.showInfo(TAG, `lifeCycleEvent change: ${stageEventType}`);
  36.         }
  37.       })
  38.     };
  39.    
  40.         /**
  41.          * 5. 注册窗口事件
  42.          */
  43.     windowManager.registerWindowEvent();
  44.    
  45.     /**
  46.      * 6. 注册导航栏事件
  47.      */
  48.     navigationBarCommonEventManager.registerNavigationBarEvent();
  49.     /**
  50.      * 7. create Launcher entry view
  51.      *    创建桌面窗口
  52.      *    WindowManager.ts --> DESKTOP_WINDOW_NAME = 'EntryView';
  53.      *    加载 pages/EntryView
  54.      */
  55.     windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME,
  56.       windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true, registerWinEvent);
  57.     /**
  58.      * 8. load recent,加载 Recent 窗口
  59.      */
  60.     windowManager.createRecentWindow();
  61.     this.registerInputConsumer();
  62.   }
  63.   ...
  64. }
复制代码
MainAbility 创建了桌面窗口:pages/EntryView
3.2 EntryView

[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

东湖之滨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表