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

前言

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

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

相关推荐
sanzk4 小时前
华为鸿蒙应用开发
华为·harmonyos
SoraLuna8 小时前
「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
macos·ui·harmonyos
ClkLog-开源埋点用户分析9 小时前
ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力
华为·开源·开源软件·harmonyos
mg6689 小时前
鸿蒙系统的优势 开发 环境搭建 开发小示例
华为·harmonyos
lqj_本人10 小时前
鸿蒙next选择 Flutter 开发跨平台应用的原因
flutter·华为·harmonyos
lqj_本人10 小时前
使用 Flutter 绘制一个棋盘
harmonyos
lqj_本人13 小时前
Flutter&鸿蒙next 状态管理框架对比分析
flutter·华为·harmonyos
青瓷看世界14 小时前
华为HarmonyOS打造开放、合规的广告生态 - 插屏广告
华为·harmonyos·广告投放
青瓷看世界14 小时前
华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力2-管理AR会话
华为·ar·harmonyos·虚拟现实
2301_7955586415 小时前
鸿蒙的进化史
华为·harmonyos