问过的问题
main_pages.json里src里只需要写@entry标记的页面吗?
是的,
@entry标记的组件才是“页面”,其他组件只是普通的组件,同时,@ohos.router的pushUrl方法跳的页面确实是需要在main_pages.json里配置,但是通过Navigation的NavPathStack内部跳转的目标页面,其路由由route_map.json管理,并且是普通@Component就行了,不需要是一个“页面”
@Entry页面会触发完整的页面生命周期(如 (Private) onPageShow/onPageHide)
回忆下使用 Navigation 和 NavPathStack 时,完整的配置流程:
- 配置
main_pages.json:将作为应用入口、包含@Entry和Navigation根容器的页面路径配置在此文件中。 - 创建并注册路由表 (
route_map.json):这是 Navigation 路由机制的核心。你需要创建一个 route_map.json文件(通常在resources/base/profile/目录下),用于注册所有通过 NavPathStack跳转的目标页面。路由表主要包含以下信息:name: 页面的路由标识符,用于跳转时指定目标。pageSourceFile: 页面组件的源代码文件路径。buildFunction: 页面对应的@Builder构建函数名称。
- 在
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