问过的问题

main_pages.json里src里只需要写@entry标记的页面吗?

是的,@entry标记的组件才是“页面”,其他组件只是普通的组件,同时,@ohos.routerpushUrl方法跳的页面确实是需要在main_pages.json里配置,但是通过 NavigationNavPathStack内部跳转的目标页面,其路由由 route_map.json管理,并且是普通@Component就行了,不需要是一个“页面”

@Entry页面会触发完整的页面生命周期(如 (Private) onPageShow/onPageHide

回忆下使用 Navigation 和 NavPathStack 时,完整的配置流程:

  1. 配置 main_pages.json:将作为应用入口、包含 @EntryNavigation根容器的页面路径配置在此文件中。
  2. 创建并注册路由表 (route_map.json):这是 Navigation 路由机制的核心。你需要创建一个 route_map.json文件(通常在 resources/base/profile/目录下),用于注册所有通过 NavPathStack跳转的目标页面。路由表主要包含以下信息:
    • name: 页面的路由标识符,用于跳转时指定目标。
    • pageSourceFile: 页面组件的源代码文件路径。
    • buildFunction: 页面对应的 @Builder构建函数名称。
  3. module.json5中启用路由表:在模块的 module.json5文件中的 "module"属性下,添加 "routerMap": "$profile:route_map"配置项,以启用上一步创建的路由表

扩展一下,UIAbility是显示页面的舞台 当用户点击应用图标时,系统会创建指定的 UIAbility 实例。UIAbility 在完成自身初始化(如 onCreate)后,会创建窗口(WindowStage)。在 onWindowStageCreate回调中,它会加载指定的 Page(即 @Entry组件),从而将页面内容显示在窗口中

ArkTS有没有可选类型

没有,但是有联合类型能达到相同的效果,比如 string | null 甚至在使用上也跟Swift的可选类型一致,支持可选链(?.),强制解包(!),和空值合并(??

显示Want和隐式Want

一个用于调起应用内的指定页面,一个用于委托系统来发起应用的启动和跳转,比如使用浏览器来打开一个网址

// 在首页Ability中
let want = {
  bundleName: 'com.example.shop', // 当前应用包名
  abilityName: 'ProductDetailAbility', // 详情页Ability名
  parameters: { productId: '12345' } // 携带的参数
};
context.startAbility(want);

// 在详情页Ability的onCreate生命周期中接收参数
let productId = this.want.parameters.productId;
let want = {
  action: 'ohos.want.action.VIEW',
  entities: ['entity.system.browsable'],
  uri: 'https://developer.harmonyos.com/'
};
context.startAbility(want);

系统根据(action, entities等)规则匹配,可能:未匹配到、直接启动一个、弹出选择框让用户选

HAP也可以用这种方式启动Ability,前提是自己注册skills:

// feature-order/src/main/module.json5
{
  "module": {
    "abilities": [
      {
        "name": "OrderDetailAbility",
        "visible": true,  // 允许其他模块访问
        "skills": [
          {
            "actions": ["ohos.want.action.VIEW"],
            "entities": ["entity.system.order"],
            "uris": [
              {
                "scheme": "order",
                "host": "detail"
              }
            ]
          }
        ]
      }
    ]
  }
}

使用

let want = {
    action: "ohos.want.action.VIEW",
    entities: ["entity.system.order"],
    uri: "order://detail?id=123"  // 匹配目标Ability的uri
}

真共享的HSP

// HSP模块的`module.json5`
{
  "module": {
    "name": "shared_lib",
    "type": "sharedLibrary",  // 关键配置
    "shared": true           // 声明可共享
  }
}
  • HSP会被安装到系统共享库目录(如 /system/lib/shared/)。
  • 多个App通过动态链接调用同一份HSP,节省存储空间。 只有系统厂商(如华为)、设备制造商或获得系统签名的开发者才能注册系统级共享库,限制很多,还只能随系统升级,基本不需要考虑这种情况,还是打包到app里。考虑使用企业级共享和公共HSP仓库
# 1. 构建HSP
ohpm build

# 2. 发布到企业私有OHPM仓库
ohpm publish --registry http://internal-ohpm.company.com