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

前言

本篇文章我在学习的过程中出现了一些问题,最主要的就是在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())
      })

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

相关推荐
SameX7 小时前
HarmonyOS Next 安全生态构建与展望
前端·harmonyos
SameX7 小时前
HarmonyOS Next 打造智能家居安全系统实战
harmonyos
Random_index15 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
鸿蒙自习室18 小时前
鸿蒙多线程开发——线程间数据通信对象02
ui·harmonyos·鸿蒙
SuperHeroWu721 小时前
【HarmonyOS】鸿蒙应用接入微博分享
华为·harmonyos·鸿蒙·微博·微博分享·微博sdk集成·sdk集成
zhangjr05751 天前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
诗歌难吟4641 天前
初识ArkUI
harmonyos
SameX1 天前
HarmonyOS Next 设备安全特性深度剖析学习
harmonyos
郭梧悠1 天前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos
郝晨妤2 天前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙