UIAbility和module.json5配置文件

UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。一般是一个UIAbility

  • 任务视图中看到一个任务,则建议使用一个UIAbility,多个页面的方式
  • 任务视图中看到多个任务,或者需要同时开启多个窗口,则建议使用多个UIAbility开发不同的模块功能

需要在module.json5配置文件abilities标签中声明UIAbility的名称、入口、标签等相关信息。

kotlin 复制代码
"abilities": [
      {
        "name": "EntryAbility", // UIAbility组件的名称
        "srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
        "description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
        "icon": "$media:icon", // UIAbility组件的图标
        "label": "$string:EntryAbility_label", // UIAbility组件的标签
        "startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
        "startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
        "exported": true,// 是否可以导出,一般 需要外部打开的 就需要时true
        "launchType": "singleton",// 启动模式


      }
  ]

Ability是UIAbility基类

UIAbilityExtensionAbility的基类

  • onConfigurationUpdate 当系统配置更新时调用
  • onMemoryLevel 当内存到达不同级别时系统回调该方法。

UIAbility生命周期状态

  • onCreate 应用创建,UIAbility实例创建完成时触发
  • onWindowStageCreate 主Window创建完成 windowStage.loadContent 加载第一个组件
  • onForeground 在前台
  • onBackground 应用退到后台
  • onWindowStageWillDestroy 即将被销毁
  • onWindowStageDestroy window销毁,释放UI资源,例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件
  • onDestroy 应用销毁
  • onWindowStageRestore Window重新创建的时候
  • onNewWant 重新启动,不会走onCreate和onWindowStageCreate ,如果已经打开,再打开,就会走这里,比如按home键,之后桌面打开,或者其他应用打开这个

启动模式

上下文 UIAbilityContext

可以拿到如包代码路径、Bundle名称、Ability名称和应用程序需要的环境状态等属性信息,以及可以获取操作UIAbility实例的方法(如startAbility()、connectServiceExtensionAbility()、terminateSelf()等)。

  • 在UIAbility中,使用 this.context
  • 在Component中使用 let context = getContext(this) as common.UIAbilityContext;

启动自己应用内或者第三方的UIAbility

UIAbilityContext.startAbility() 或者 UIAbilityContext.startAbilityForResult()

Want

  • deviceId:deviceId为空表示本设备
  • bundleName:在AppScope中app.json5中定义的
  • moduleName:// moduleName非必选
  • abilityName // 要打开的name module.json5中定义的
  • parameters // 传递的参数 parameters?: Record<string, Object>,直接.就可以拿 data.want?.parameters?.result

terminateSelf 和 terminateSelfWithResult

关闭当前的UIAbility,context.startAbilityForResult(want) 关闭方法停止当前UIAbility实例时,默认会保留该实例的快照,最近任务中还能发现,如果需要完全消失,在其对应UIAbility的module.json5配置文件中,将abilities标签的removeMissionAfterTerminate字段配置为true

ts 复制代码
let wantInfo: Want = {
  deviceId: '', // deviceId为空表示本设备
  bundleName: 'com.example.myapplication',
  moduleName: 'entry', // moduleName非必选
  abilityName: 'EntryAbilityTwo',
  parameters: {
    // 自定义信息
    info: '11111',
    name: '第一个'
  },
};

let context = getContext(this) as common.UIAbilityContext;
// context为调用方UIAbility的UIAbilityContext
context.startAbility(wantInfo).then(() => {
  console.info('startAbility success.');
}).catch((error: BusinessError) => {
  console.error('startAbility failed.');
});
context.startAbilityForResult(wantInfo).then((data) => {
  console.log(`----${data.resultCode} ---- ${data.want?.parameters?.result}`)

}).catch(() => {
})

启动第三方的

  • 指定应用链接(推荐):通过openLinkstartAbility接口来指定应用链接,拉起目标应用页面。
  • 指定Ability(不推荐):通过startAbility接口指定具体的Ability,显式拉起目标应用页面 从API 12开始,已不再支持三方应用使用该方式拉起其他应用

比如启动应用设置页面

ts 复制代码
let wantInfo: Want = {
  bundleName: 'com.huawei.hmos.settings',
  abilityName: 'com.huawei.hmos.settings.MainAbility',
  uri: 'application_info_entry',
  parameters: {
    pushParams: 'com.example.myapplication' // 打开指定应用的详情页面
  }
}
context.startAbility(wantInfo)

判断是否可以打开某个应用,也就是某个应用是否安装

在entry模块的module.json5文件中的querySchemes字段中,最多允许配置50个URL scheme,使用canOpenLink是bundleManager提供的支持判断目标应用是否可访问的接口

推荐使用隐士调整

在 UIAbility 的module.json5中加入,推荐使用 openLink 和 startAbility 使用 uri 下面是调用的地方

ts 复制代码
try {
  // 必须有:// ,否则就走到catch里面了, The specified link is invalid
  let link: string = 'zhiyang://hostZhiYang'
  let isExist = bundleManager.canOpenLink(link);
  this.isExist = isExist;
  promptAction.showToast({ message: `是否存在${isExist}` })
  if (isExist) {
    this.context.openLink(link, { parameters: { parame1: '来自外部', parame2: 100 } }, (error) => {
      console.log(`json = > ${error}`)
    })
   // startAbility 方式
this.context.startAbility({ uri: 'zhiyang://hostZhiYang', parameters: { parame1: '来自外部', parame2: 100 } })

  }
} catch (e) {
  console.error(`错误了 ${e}`)
  promptAction.showToast({ message: `错误了${e}` })
}

接受的UIAbility,在onCreateonNewWant 中都要去接受,如果应用已经打开,在打开就会走onNewWant

ts 复制代码
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  this.from = want.parameters?.parame1 as string
  this. code = want.parameters?.parame2 as number

}
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  let from = want.parameters?.parame1
  let code = want.parameters?.parame2
  promptAction.showToast({message:`${from} - ${code} 新的 onNewWant `})
  console.log(`from onNewWant ${from} - ${code}`)
}
ts 复制代码
"uris": [
  {
    "scheme": "zhiyang",
    "host": "hostZhiYang",
  },
相关推荐
珹洺1 小时前
从 HTML 到 CSS:开启网页样式之旅(三)—— CSS 三大特性与 CSS 常用属性
前端·javascript·css·网络·html·tensorflow·html5
T^T尚5 小时前
uniapp H5上传图片前压缩
前端·javascript·uni-app
出逃日志6 小时前
JS的DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)
开发语言·前端·javascript
XIE3926 小时前
如何开发一个脚手架
前端·javascript·git·npm·node.js·github
山猪打不过家猪6 小时前
React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo
前端·javascript·react.js
前端青山6 小时前
React事件处理机制详解
开发语言·前端·javascript·react.js
科技D人生6 小时前
Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
前端·vue.js·vue ref·vue ref 响应式·vue reactive
对卦卦上心6 小时前
React-useEffect的使用
前端·javascript·react.js
练习两年半的工程师6 小时前
React的基本知识:事件监听器、Props和State的区分、改变state的方法、使用回调函数改变state、使用三元运算符改变state
前端·javascript·react.js
啵咿傲6 小时前
在React中实践一些软件设计思想 ✅
前端·react.js·前端框架