openharmony launcher 调研笔记(01)数据初始化

最近在看launcher,把自己调研的点做个笔记,持续修改更新中个人笔记酌情参考

=========================================================================

初始化MainAbility

● common 等 包以 三方库形式 被引入使用

在每个包中的oh-package.json5 文件有配置

{
  "devDependencies": {},
  "name": "@ohos/common",
  "description": "a npm package which contains common function",
  "main": "index.ts",
  "version": "1.0.0",
  "dependencies": {}
}

在module.json5文件中配置了类型

{
  "module": {
    "name": "launcher_appcenter",
    "type": "har",
    "deviceTypes": [
      "default",
      "tablet"
    ]
  }
}

可以如下方式被引入,并使用

import {
  windowManager。。。
} from '@ohos/common';

● 项目入口在product 目录下,目前分为pad和phone两个版本,我关注的是手机端

   phone/src/main/module.json5 下 配置了 起始的 MainAbility

● export default class MainAbility extends ServiceExtension 

   MainAbility 继承自ServiceExtension 

● initLauncher 函数进行了一系列 初始化

    let dbStore = RdbStoreManager.getInstance(); //获取数据库实例
    await dbStore.initRdbConfig(); // 初始化 mRdbStore
    await dbStore.createTable(); // 创建表(不存在的情况下)

    数据库在手机位置:/data/app/el1/100/database/com.ohos.launcher/phone_launcher/rdb

    数据库名字:Launcher.db

       

     手机目前没有看到sqlite3 命令,导出到pc 数据可以看到为如下图:      

● 初始化收拾导航 

  this.startGestureNavigation(); // 此函数内部根据显示的宽高设置屏幕宽高,根据配置设置导航栏是否显示

          gestureNavigationManage.initWindowSize(dis);

                  settingsDataManager.createDataShareHelper();

                        dataShare.createDataShareHelper

                                globalThis.sGestureNavigationManager.getGestureNavigationStatus();

                                        private getGestureNavigationStatus()  // applications_launcher\feature\gesturenavigation\src\main\ets\default\common\GestureNavigationManager.ts

                                                gestureNavigationStatus = this.getValue(); // settingsDataManager.getValue(this.helper, CommonConstants.NAVIGATION_BAR_STATUS_KEY, '1');

                                                        AppStorage.setOrCreate('NavigationBarStatusValue', gestureNavigationStatus === '0' ? true : false);

                                                

● 创建显示主页

//DESKTOP_WINDOW_NAME = 'EntryView'; 

//applications_launcher\product\phone\src\main\ets\pages\EntryView.ets

windowManager.createWindow(globalThis.desktopContext, windowManager.DESKTOP_WINDOW_NAME,
      windowManager.DESKTOP_RANK, 'pages/' + windowManager.DESKTOP_WINDOW_NAME, true, registerWinEvent);

● 创建最近使用应用页

    windowManager.createRecentWindow();    

    //applications_launcher\product\phone\src\main\ets\pages\RecentView.ets

● 初始化事件(点击事件等)

this.registerInputConsumer();

加入了两个事件的监听

KeyCode.KEYCODE_HOME  home键

KeyCode.KEYCODE_FUNCTION  最近使用应用键

=========================================================================

EntryView解析

//applications_launcher\product\phone\src\main\ets\pages\EntryView.ets

---------------------------------------------------------------------------------------------------------------------------------

aboutToAppear()函数中 的

         this.mStage.onCreate(); 通过BaseModulePreLoader的各个子类的load

(loadConfig,loadData),初始化了各种配置和数据

         初始化的配置和数据有:

                 1.initPhoneConfig

                        初始化配置:

                            a.PhoneSmartDockLayoutConfig // dock栏数据:联系人,图片,设置,短信

                                // 此类中会在父类,子类各种调用,最终数据还是构造中的数据

                                        protected constructor() {
                                            super();
                                            this.mDockLayoutInfo = phonePresetDockItem;
                                          }

                                const phonePresetDockItem = [
                                          {
                                            itemType: CommonConstants.TYPE_APP,
                                            bundleName: 'com.ohos.contacts',
                                            abilityName: 'com.ohos.contacts.MainAbility',
                                            moduleName: 'entry',
                                            editable: true,
                                          } 。。。

                                ]

                                后面SmartDock类中最终调用getResidentList()对上述数据更新

                             b.PhoneFolderLayoutConfig  // 桌面文件夹比例: 桌面3×3 打开 4×3 。。。

                                同上, // 此类中会在父类,子类各种调用,最终数据还是构造中的数据

                                  protected constructor() {
                                    super();
                                    this.mFolderLayoutInfo = phoneFolderLayoutInfo;
                                  }

                                const phoneFolderLayoutInfo = {
                                  folderLayoutTable: {
                                    id: 0,
                                    layout: '3X3',
                                    name: '3X3',
                                    row: 3,
                                    column: 3,
                                    area: [2, 2],
                                    checked: false,
                                  }。。。

                                ]

                             c.PhoneFormLayoutConfig // 桌面卡片大小: 1×2,2×2 。。。

                                同上, // 此类中会在父类,子类各种调用,最终数据还是构造中的数据

                                protected constructor() {
                                    super();
                                    this.mFormLayoutInfo = phoneFormLayoutInfo;
                                }

                                const phoneFormLayoutInfo = {
                                  formLayoutDimension1X2: {
                                    id: 0,
                                    layout: '1X2',
                                    name: '1X2',
                                    row: 1,
                                    column: 2,
                                    area: [1, 2],
                                    checked: false,
                                  }。。。

                                ]

                 2.LauncherLayoutPreLoader

                          load(): void {
                              this.loadConfig();
                              this.loadData();
                          }

                        初始化配置(loadConfig):

                        addConfigToManager

                        //此处根本上 是globalThis.PhoneLauncherLayoutStyleConfigInstance

                          = new PhoneLauncherLayoutStyleConfig(); 并插入到全局存储中

                        初始化数据(loadData):

                        LayoutViewModel.getInstance().setDevice(CommonConstants.DEFAULT_DEVICE_TYPE); //  此处是initScreen配置基础数据  setDevice // AppStorage.setOrCreate('isPad', this.mIsPad); 此处为何是 isPad 当做 key 不太清楚

                        initScreen:

                                初始化了屏幕宽高,状态栏、导航栏 高度等数据

                 3.SmartDockPreLoader

                  初始化配置:    

                   a.SmartDockLayoutConfig 同 PhoneSmartDockLayoutConfig

                   globalThis.SmartDockLayoutConfig = new SmartDockLayoutConfig();

                   globalThis.SmartDockLayoutConfig.initConfig();

                   b.SmartDockModeConfig //目前看无意义

                    globalThis.SmartDockModeConfig = new SmartDockModeConfig();
                    globalThis.SmartDockModeConfig.initConfig(); 

                   c.SmartDockStyleConfig // 初始化dock 栏显示数据 高度,背景等

                    globalThis.SmartDockStyleConfig = new SmartDockStyleConfig();    

                    globalThis.SmartDockStyleConfig.initConfig();

                   初始化数据:无

                4.PageDesktopPreLoader

                 初始化配置:    

                  a.PageDesktopLayoutConfig // 桌面布局配置

                        private static readonly DEFAULT_LAYOUT_INFO: any = {
                            layoutDescription: {
                              pageCount: PageDesktopLayoutConfig.DEFAULT_PAGE_COUNT, //  1
                              row: PageDesktopLayoutConfig.DEFAULT_ROW_COUNT, // 5
                              column: PageDesktopLayoutConfig.DEFAULT_COLUMN_COUNT //4
                            },
                            layoutInfo: []
                          };

                    b.PageDesktopModeConfig // 桌面模式配置

                        const persistConfig = {
                              appStartPageType: this.mAppStartPageType, // Grid
                              gridConfig: this.mGridConfig, // 0
                              deviceType: this.mDeviceType // phone
                        };

                     c.PageDesktopAppModeConfig // 桌面应用程序模式

                                private static readonly DEFAULT_LAYOUT_INFO: any = [];

                                private mAppListInfo: any =

                                         PageDesktopAppModeConfig.DEFAULT_LAYOUT_INFO;

                                // 通过数据库查询获取的为空

                                loadPersistConfig(): void {
                                    let defaultConfig = super.loadPersistConfig();
                                    globalThis.RdbStoreManagerInstance.queryDesktopApplication()
                                      .then((config) => {
                                        Log.showDebug(TAG, 'loadPersistConfig configFromRdb success.');
                                        this.mAppListInfo = config;
                                    }).catch((err) => {
                                      Log.showError(TAG, ` err: ${err.toString()}`);
                                      this.mAppListInfo = defaultConfig;
                                    });
                                  }

                        d.PageDesktopGridStyleConfig // 桌面 桌面布局配置   行数列数等        

                                 /**
                                   * 列数
                                */
                                mColumns = StyleConstants.DEFAULT_APP_GRID_COLUMN;

                                  /**
                                   * 行数
                                   */
                                  mRows = StyleConstants.DEFAULT_APP_GRID_ROW;

                                  。。。

                    4.PhonePageDesktopGridStyleConfig

                            第3项的d为此函数父类,重新计算上述中的一些基本数据项

                    5.BigFolderPreLoader

                            a.FolderLayoutConfig 为 第一项 b.PhoneFolderLayoutConfig  父类

                            b.BigFolderStyleConfig 大文件夹的配置项

                    6.FormPreLoader

                            a.FormLayoutConfig 为第一项 c.PhoneFormLayoutConfig 的父类 

                            b.FormStyleConfig 为卡片配置项

                     7.NumBadgeManager.getInstance().registerNumBadge();

                          角标注册(??不太确定     

        this.getWindowSize();  // 获取屏幕宽高

        this.navigationBarStatus = SettingsModel.getInstance().getValue(); // 获取导航栏状态

        this.updateScreenSize(); // 更新屏幕宽高等

        this.registerPageDesktopNavigatorStatusChangeEvent(this.mLocalEventListener); 

        // 注册导航栏状态变化函数,触发时调用updateScreenInfo更新各种配置及显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/599873.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 部署 Epusdt - 独角数卡 dujiaoka 的 usdt 支付插件

部署 部署说明 部署之前必须注意的几点事项,该教程不一定适合所有用户: 本教程主要是使用 docker 部署,宝塔用户或宿主机直接安装的用户请直接参考官网教程.本教程是独立部署 epusdt,使用独立的mysql和redis,与dujiaoka项目分开. 在研究的过程中发现 epusdt 也需要用到 mys…

SpringCloud Alibaba Sentinel 规则持久化

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十七篇,即使用 Sentinel 实现规则持久化。 二、概述 从前面我们做的实验可知,…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十四篇,即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…

uniapp vue2 时钟 循环定时器

效果展示: 时钟 写在前面:vue2有this指向,没有箭头函数 实验操作:封装一个时钟组件 uniapp vue2 封装一个时钟组件 核心代码: this指向的错误代码,在下: start() { this.myTimer setInterval(…

ctfshow web入门 文件包含 web151--web161

web151 打算用bp改文件形式(可能没操作好)我重新试了一下抓不到 文件上传不成功 改网页前端 鼠标右键&#xff08;检查&#xff09;&#xff0c;把png改为php访问&#xff0c;执行命令 我上传的马是<?php eval($_POST[a]);?> 查看 web152 上传马 把Content-Type改为…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

全面解析十七种数据分析方法,具象数据分析思维

一、介绍 在当今数据驱动的商业环境中&#xff0c;数据分析已经成为了企业获取竞争优势的关键工具。无论是为了优化运营效率&#xff0c;提高客户满意度&#xff0c;还是推动产品创新&#xff0c;企业都需要通过分析大量数据来做出明智的决策。数据分析方法多种多样&#xff0c…

Android详细介绍POI进行Word操作(小白可进)

poi-tl是一个基于Apache POI的Word模板引擎&#xff0c;也是一个免费开源的Java类库&#xff0c;你可以非常方便的加入到你的项目中&#xff0c;并且拥有着让人喜悦的特性。 一、使用poi前准备 1.导入依赖&#xff1a; 亲手测过下面Android导入POI依赖的方法可用 放入这个 …

3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?

HOOPS Visualize是一个开发平台&#xff0c;可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括&#xff1a; 高性能、以工程为中心的可视化&#xff0c;使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口&#xff0c;内部利用…

回顾闰年问题——基础

复习一下闰年问题&#xff1a; 定义&#xff1a;闰年是为了调整日历年与回归年之间的差异而设立的。由于地球绕太阳运行的周期是365天5小时48分46秒&#xff08;即365.24219天&#xff09;&#xff0c;而我们通常使用的公历年只有365天&#xff0c;所以每四年会累积大约一天的差…

深入理解GO语言——GC垃圾回收二

文章目录 前言一、Go V1.5的三色并发标记法总结 前言 书接上回&#xff0c;无论怎么优化&#xff0c;Go V1.3都面临这个一个重要问题&#xff0c;就是mark-and-sweep 算法会暂停整个程序 。 Go是如何面对并这个问题的呢&#xff1f;接下来G V1.5版本 就用 三色并发标记法 来优…

libVLC 音频立体声模式切换

在libVLC中&#xff0c;可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道&#xff0c;例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…