前言
本篇文章我在学习的过程中出现了一些问题,最主要的就是在UIAbility跳转部分不是很好理解。通过视频老师讲解和官方文档查阅我感觉知识点还是有一点散乱,现在我自己感觉总结出来的还是不错,当然带点主观原因在里面我看到很顺🤭。开始干货分享!!!
1. UIAbility的生命周期函数
UIAbility的生命周期函数是指对于这个应用整体 的生命周期函数,生命周期函数在src/main/ets/entryability/EntryAbility.ts的EntryAbility.ts文件中
- onCreate:Create状态,在UIAbility实例创建时触发,系统会调用onCreate回调。可以在onCreate回调中进行相关初始化操作。
- onDestroy:在UIAbility销毁时触发。可以在onDestroy回调中进行系统资源的释放、数据的保存等操作。
- onWindowStageCreate:可以在onWindowStageCreate回调中,设置UI页面加载、设置WindowStage的事件订阅。
- onWindowStageDestroy:在UIAbility实例销毁之前,则会先进入onWindowStageDestroy回调,我们可以在该回调中释放UI页面资源。
- onForeground:onForeground回调,在UIAbility的UI页面可见之前,即UIAbility切换至前台时触发。 可以在onForeground回调中申请系统需要的资源,或者重新申请在onBackground中释放的资源。
- 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方法。
使用方法:
- 导入import http from '@ohos.net.http'
- 创建http模块,let request = http.createHttp()
- 调用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())
})
在传智
博学谷 的鸿蒙 课程中,我认为跟着直播课是一个非常不错的选择,首先在学习中自己的思维在一直跟着老师走,其次遇到的问题能及时提出并得到老师的解惑。我的分享希望大家喜欢,😏有错望指正!!!