目录

鸿蒙的生命周期、路由和网络

前言

本篇文章我在学习的过程中出现了一些问题,最主要的就是在UIAbility跳转部分不是很好理解。通过视频老师讲解和官方文档查阅我感觉知识点还是有一点散乱,现在我自己感觉总结出来的还是不错,当然带点主观原因在里面我看到很顺🤭。开始干货分享!!!

1. UIAbility的生命周期函数

UIAbility的生命周期函数是指对于这个应用整体 的生命周期函数,生命周期函数在src/main/ets/entryability/EntryAbility.ts的EntryAbility.ts文件中

  1. onCreate:Create状态,在UIAbility实例创建时触发,系统会调用onCreate回调。可以在onCreate回调中进行相关初始化操作。
  2. onDestroy:在UIAbility销毁时触发。可以在onDestroy回调中进行系统资源的释放、数据的保存等操作。
  3. onWindowStageCreate:可以在onWindowStageCreate回调中,设置UI页面加载、设置WindowStage的事件订阅。
  4. onWindowStageDestroy:在UIAbility实例销毁之前,则会先进入onWindowStageDestroy回调,我们可以在该回调中释放UI页面资源。
  5. onForeground:onForeground回调,在UIAbility的UI页面可见之前,即UIAbility切换至前台时触发。 可以在onForeground回调中申请系统需要的资源,或者重新申请在onBackground中释放的资源。
  6. onBackground:onBackground回调,在UIAbility的UI页面完全不可见之后,即UIAbility切换至后台时候触发。
javascript 复制代码
// Create状态,在UIAbility实例创建时触发,系统会调用onCreate回调。可以在onCreate回调中进行相关初始化操作。
onCreate(want, launchParam) {
  //例如用户打开电池管理应用,在应用加载过程中,在UI页面可见之前,可以在onCreate回调中读取当前系统的电量情况,用于后续的UI页面展示。
}
​
// 可以在onWindowStageCreate回调中,设置UI页面加载、设置WindowStage的事件订阅。
onWindowStageCreate(windowStage: window.WindowStage) {
  // 在onWindowStageCreate(windowStage)中通过loadContent接口设置应用要加载的页面
  windowStage.loadContent('pages/Index', (err, data) => {
  });
}
// onBackground回调,在UIAbility的UI页面完全不可见之后,即UIAbility切换至后台时候触发。
// 可以在onBackground回调中释放UI页面不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。
onBackground() {
  // 当地图应用切换到后台状态,可以在onBackground回调中停止定位功能,以节省系统的资源消耗。
}
// onForeground回调,在UIAbility的UI页面可见之前,即UIAbility切换至前台时触发。
// 可以在onForeground回调中申请系统需要的资源,或者重新申请在onBackground中释放的资源。
onForeground() {
}
// 在UIAbility实例销毁之前,则会先进入onWindowStageDestroy回调,我们可以在该回调中释放UI页面资源。
onWindowStageDestroy() {
}
// 在UIAbility销毁时触发。可以在onDestroy回调中进行系统资源的释放、数据的保存等操作。
onDestroy() {
}

2. 页面的生命周期函数

对于@Entry装饰器装饰的组件,就代表一个页面,会有以下几个页面生命周期函数:

  • onPageShow:页面每次显示时触发。
  • onPageHide:页面每次隐藏时触发一次。
  • onBackPress:当用户点击返回按钮时触发。(是手机下方的返回按钮,不是页面的路由返回)

3. 组件的生命周期函数

对于@Component装饰器装饰的组件,就代表一个组件,会有以下几个组件生命周期函数:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • aboutToDisappear:在自定义组件即将析构销毁时执行。

4. UIAbility跳转

4.1 UIAbility跳转

当Ability A需要启动Ability B并传入一些数据时, 可使用Want作为载体将这些数据传递给Ability B。就是需要跳转其他应用时就需要传递want参数

csharp 复制代码
// 获取context
const context = getContext(this) as common.UIAbilityContext
// 声名want
let want:Want = {
deviceId: '',  //设备ID
bundleName: 'com.example.myapplication', // 包名
abilityName: 'PageAbility' // 跳转的UIAbility名
}
// 开始跳转
context.startAbility(want)

4.2 UIAbility跳转携带参数传递

want参数中有个parameters属性可以携带传递的参数 ,进入另一个ability中在应用的生命周期中能取存参数

javascript 复制代码
Button('点击').onClick(() => {
                promptAction.showToast({message: AppStorage.Get('private')})
                const context = getContext(this) as common.UIAbilityContext
                let want:Want = {
                  deviceId: '',
                  bundleName: 'com.example.myapplication',
                  abilityName: 'PageAbility',
                  parameters: {
                    indexInfo: '首页ability传递的参数'
                  }
                }
                context.startAbilityForResult(want)
              })
​
onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    const res : Want = want
    AppStorage.SetOrCreate('indexAbilityInfo', res.parameters.indexInfo)
  }

4.3 两个ability互相传参

启动一个Ability。Ability被启动后通过调用terminateSelfWithResult接口使之终止并且返回结果给调用方,需要使用context.startAbilityForResult(want)

停止当前的Ability。如果该Ability是通过调用startAbilityForResult接口被拉起的,调用terminateSelfWithResult接口时会将结果返回给调用者,如果该Ability不是通过调用startAbilityForResult接口被拉起的,调用terminateSelfWithResult接口时不会有结果返回给调用者。

php 复制代码
Button('点击').onClick(async () => {
                promptAction.showToast({message: AppStorage.Get('private')})
                const context = getContext(this) as common.UIAbilityContext
                let want:Want = {
                  deviceId: '',
                  bundleName: 'com.example.myapplication',
                  abilityName: 'PageAbility',
                  parameters: {
                    indexInfo: '首页ability传递的参数'
                  }
                }
                const res = await context.startAbilityForResult(want) as Want
                this.abilityInfo = res
              })
              
Button('回上个ability')
          .onClick(() => {
            const context = getContext(this) as common.UIAbilityContext
            context.terminateSelfWithResult({
              resultCode: 1,
              want: {
                bundleName: "com.example.myapplication",
                abilityName: 'EntryAbility',
                parameters: {
                  pageInfo: "这是pageAbility传递的参数"
                },
              }
            })
          })

注意:startAbilityForResult和terminateSelfWithResult一起使用,才可以互相传参。

4.4 启动不同模块module的ability

和上面UIAbility跳转一样,只是want参数中需要加上moduleName属性

javascript 复制代码
Button('启动第二个模块')
                .onClick(() => {
                  const context = getContext(this) as common.UIAbilityContext
                  let want : Want = {
                    bundleName: 'com.example.myapplication',
                    abilityName: 'SecondModuleAbility',
                    moduleName: 'secondModule'
                  }
                  context.startAbility(want)
                })

5. 路由

使用路由router是要导入,然后就能直接使用方法了。

语法:router.方法({url,params}) ,例如:router.pushUrl(),router.replaceUrl(),router.back()

当路由有传递参数时,可以通过router.getParams()[参数名] 得到参数

注意:当使用back()返回时,如果需要传递参数,必需把路径url也加上

php 复制代码
router.pushUrl({
            url: 'pages/secondPage',
            params: {
              info: '传递参数'
            }
          })
          
@State info :string = router.getParams()['info']

6.发起网络请求

鸿蒙的网络模块提供HTTP数据请求能力。应用可以通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。

使用方法:

  1. 导入import http from '@ohos.net.http'
  2. 创建http模块,let request = http.createHttp()
  3. 调用request方法,发起请求request.request(url,{method,extraData,header}, (err,data) => {})
vbscript 复制代码
Button('获取接口数据').onClick(async (event: ClickEvent) => {
        let request = http.createHttp()
        const res = await request.request('https://api.oioweb.cn/api/search/FoodHeat',
          {
            method: http.RequestMethod.POST,
            extraData: {
              keyword: "香蕉"
            }
          }
        )
        console.log(res.result.toString())
      })

传智博学谷鸿蒙 课程中,我认为跟着直播课是一个非常不错的选择,首先在学习中自己的思维在一直跟着老师走,其次遇到的问题能及时提出并得到老师的解惑。我的分享希望大家喜欢,😏有错望指正!!!

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
前端菜鸟日常12 小时前
鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续
华为·harmonyos
HMS Core12 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)
华为·harmonyos
前端菜鸟日常1 天前
鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能
华为·harmonyos
鸿蒙布道师2 天前
鸿蒙NEXT开发数值工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
塞尔维亚大汉2 天前
鸿蒙南向开发 ——轻量系统芯片移植指南(二)
物联网·嵌入式·harmonyos
别说我什么都不会2 天前
OpenHarmony内核系统调用hats测试用例编写指南
物联网·嵌入式·harmonyos
90后的晨仔2 天前
鸿蒙ArkTS是如何实现并发的?
harmonyos
鸿蒙布道师2 天前
鸿蒙NEXT开发日期工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
HMSCore2 天前
在应用内购票、寄件时,如何一键填充所需信息?
harmonyos
HarmonyOS_SDK2 天前
在应用内购票、寄件时,如何一键填充所需信息?
harmonyos