ExtensionAbility
AppScope > app.json5:应用的全局配置信息
entry:HarmonyOS工程模块,编译构建生成一个HAP
oh_modules:用于存放三方库依赖信息
build-profile.json5:工程级配置信息,包括签名signingConfigs、产品配置products等。
hvigorfile.ts:工程级编译构建任务脚本。
oh-package.json5:主要用来描述全局配置,如:依赖覆盖(overrides)、依赖关系
singleton(单实例模式)
每个UIAbility只存在唯一实例。任务列表中只会存在一个相同的
UIAbility
multion(多实例模式)
每次启动UAbi心y都会创建一个新的实例。新实例创建后,旧实例
会被移除。
场景:用户在使用分屏功能时,希望使用两个不同应用(例如备忘
录应用和图库应用)之间进行分屏,也希望能使用同一个应用
(例如备忘录应用自身)进行分屏。
specified(指定实例模式)
每个UIAbiliy实例可以设置Key指示。启动UIAbility时,需要制定
key,存在key相同实例直接被拉起,不存在则创建新实例
text overflow
text input
密码框 type 值设为 password 出现小眼睛
Alignment
contain cover
justifyContent:
FlexAlign.Start
FlexAlign.Center
FlexAlign.End
FlexAlign.SpaceBetween
FlexAlign.SpaceAround
FlexAlign.SpaceEvenly
alignItems
HorizontalAlign.Start
HorizontalAlign.Center
HorizontalAlign.End
利用 Blank 组件,自动填充容器主轴方向上的空余部分
层叠布局(Stack)的alignContent属性值
Alignment.TopStart
Alignment.Top
Alignment.TopEnd
Alignment.Start
Alignment.Center
Alignment.End
Alignment.BottomStart
Alignment.Bottom
Alignment.BottomEnd
Grid
使用rowsTemplate属性和columnsTemplate属性,可以设置行列数量和尺寸占比
使用:columnStart、columnEnd、rowStart、rowEnd属性可以控制子组件所占行列数
使用rowsGap和columnsGap属性,可以控制行列间距
List
List,子组件为ListItem或者ListItemGroup
使用listDirection属性可以设置列表方向,可选值有两种:
默认值是Axis.Vertical表示垂直。
还可以设置成Axis.Horizontal表示水平。
使用alignListItem属性,可控制元素对齐方式
使用divider属性可设置分割线样式,基本效果如下
状态管理
@State @Prop @Link
@Provide 与 @Consume
@Watch
@ObjectLink 和 @Observed
@Provide和@Consume用于跨层级传递状态信息
ForEach
ForEach(arr, itemGenerator, keyGenerator)
参数1: 遍历的数组数据
参数2:遍历数组元素用于显示对应行视图ListItem的函数
(item, index)=> {ListItem()}
参数3:用来返回决定当前行界面是否需要重新构建的函数,返回值是一个唯一的key
类型: (item, index) => string
默认值:(item, index) => index + JSON.stringfy(item)
如果新的返回值key在原有所有key就能找到相同的key,则复用对应的item视图
如果没有找到相同的key, 则重新构建新的Item视图,也就是会更新item界面
ForEach总结
对于存在数组内部更新的列表
显示时使用了下标: 不传递第三个参数,或指定(item, index) => index + JSON.stringfy(item)
显示时没使用下标:传递第三个参数为:item => JSON.stringfy(item)
对于不存在数组内部更新的列表
传递item => item.id 效率会高一些(不需要做item转JSON的操作)
router
说明:HarmonyOS提供了@ohos.router模块来控制路由跳转
router.pushUrl():push模式跳转到指定路由
router.replaceUrl():replace模式跳转到指定路由
router.back(): 返回到上一个路由页面
router.params: 读取跳转路由携带的参数
数据持久化
疑问1:如何实现一个页面中所有组件的数据共享?
解决:使用LocalStorage技术
疑问2:如何实现整个应用中所有页面的所有组件的数据共享?
解决:使用AppStorage技术
疑问3:如何实现退出应用后状态数据还存在?
解决:使用PersistentStorage技术
1. LocalStorage
页面级状态内存存储
只能在一个页面中的所有组件中共享
退出应用不存在
相关API
LocalStorage({name, value}):构造函数
@Entry(storage): 将storage绑定到页面根组件
@LocalStorageLink(name):实现组件状态与LocalStorage的双向同步
@LocalStorageProp(name):实现LocalStorage到组件状态的单向同步
2. AppStorage
应用级状态内存存储
在所有页面中的所有组件中共享
退出应用不存在
相关API
AppStorage.SetOrCreate(name, value):初始化一个存储数据
@StorageLink(name): 实现组件状态与AppStorage的双向同步
@StorageProp装饰器(name):实现AppStorage到组件状态的单向同步
3. PersistentStorage
AppStorage数据的持久化
退出应用后数据还存在,再次启动后,还能操作到AppStorage中的数据
相关API
PersistentStorage.PersistProp<T>(name: string, value: T): 初始化数据
@StorageLink/@StorageProp装饰器:获取同步数据
注意
持久化的number类型数据,在应用退出后,再读取得到的string类型
Axios
9.4. 第三方工具包axios
下载
ohpm i @ohos/axios
相关API
axios(url): Promise 发GET请求
axios(options): Promise 发送GET/POST/PUT/DELETE请求
axios.get(url, options): Promise 发GET请求
axios.delete(url, options): Promise 发DELETE请求
axios.post(url, data, options): Promise 发POST请求
axios.put(url, data, options): Promise 发PUT请求
多线程Taskpool
介绍
任务池(taskpool)作用是为应用程序提供一个多线程的运行环境
注意事项
实现任务的函数需要使用装饰器@Concurrent标注,且仅支持在.ets文件中使用。
任务函数在TaskPool工作线程的执行耗时不能超过3分钟(不包含Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时),否则会被强制退出。
序列化传输的数据量大小限制为16MB。
只支持在模拟器或真机调试。
WebView
相关API
WebviewController: @ohos.web.webview模块提供的webview浏览器的控制器
loadUrl(url): 加载指定url的网页
Web组件:显示网页
src: 要加载的网页地址,远程或本地
controller: WebviewController的实例
相互通信
相关API
runJavaScript(script: string): Promise<string> 应用端调用web端JS函数
script:函数调用的JS代码,可以指定实参传递数据给web端
返回值:函数返回值的Promise对象
registerJavaScriptProxy(object: object, name: string, methodList: Array<string>) 注册应用端的函数供网页端调用
object: 饱含多个方法的对象
name: 指定web端访问对象的名称
methodList: 指定对象中可以访问的方法名
位置服务
相关操作
获取当前位置
根据经纬度得到地址
根据地址得到对应的经纬度
相关API
主要使用@ohos.geoLocationManager模块的API
manager.getLastLocation(): Location 获取当前位置
longitude 经度
latitude 纬度
manager.on(type: 'locationChange', request: LocationRequest, callback: Callback<Location>) 绑定位置改变监听,用于得到最新的位置
manager.getAddressesFromLocationName(request: GeoCodeRequest): Promise<Array<GeoAddress>> 获取指定地址对应的经纬度
manager.getAddressesFromLocation(request: ReverseGeoCodeRequest): Promise<Array<GeoAddress>> 获取指定经纬度对应的地址
通知
相关操作
发布通知
点击通知响应跳转
相关API
function publish(request: NotificationRequest): Promise<void> 发布通知
cancel(id: number): Promise<void> 取消通知
电话服务
相关操作
跳转拨号界面拨号
获取信号信息
相关API
@ohos.telephony.call模块
call.makeCall(phoneNumber: string, callback: AsyncCallback<void>) 指定号码,跳转拨号界面
显式动画(页面内)
animateTo()是ArkUI 提供的一个全局的动画函数,调用此函数实现的动画称为显式动画
animateTo(value: AnimateParam, event: () => void): void
属性动画(页面内)
animation()是ArkUI提供的组件的属性方法,调用此函数实现的动画称为属性动画
转场动画(页面内)
转场动画是指组件出现或消失时的过渡动画。ArkUI 专门提供了transition接口来配置转场动画效果,可以定义平移、透明度、旋转、缩放这几种转场样式的单个或者组合的转场效果。
Dialog
import { promptAction } from '@kit.ArkUI';
promptAction.showToast({
message: '恭喜,操作成功!',
duration: 2000,
bottom:150
});
提示信息(showToast)
对话框(showDialog)
菜单(showActionMenu)
装饰器
@Entry、@Component都是装饰器,装饰器用于装饰类、属性、方法以及变量等,并赋予其特殊的含义。
装饰器是一个函数,这个函数仅在代码加载阶段执行一次。本质就是编译时执行的函数
装饰器的语法是 @ 后跟一个函数或者一个执行后返回函数的表达式
这个函数要么不返回值,要么返回一个新对象取代所修饰的目标对象
装饰器有两个版本,一个是 2014 年通过的,一个是 2022 年通过的。ArkTS 里使用的是 2014 年通过的
@Entry表示该自定义组件为入口组件(只有@Entry装饰的组件才能被预览、才能作为应用的页面展示,一个页面只能有一个 @Entry)
@Component表示自定义组件
3.2.2. struct
是一个关键字,自定义组件必须使用 struct 定义,并且被 @Component装饰器修饰。
定义组件的首字母一般大写。
3.2.3. build
build 函数内部是 ArkTS 的声明式 UI 语法。内部使用 UI 组件完成页面的搭建。
Ability生命周期
page生命周期
自定义组件:
@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。
页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。
页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:
onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
onBackPress:当用户点击返回按钮时触发。
组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:
aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
onDidBuild:组件build()函数执行完成之后回调该接口,开发者可以在这个阶段进行埋点数据上报等不影响实际UI的功能。不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
WindowStage事件订阅
Ability启动模式
singleton(单实例模式)
每个UIAbility只存在唯一实例。任务列表中只会存在一个相同的UIAbility
multion(多实例模式)
每次启动UAbi心y都会创建一个新的实例。新实例创建后,旧实例会被移除。
场景:用户在使用分屏功能时,希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。
specified启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)。
Want
显式Want:在启动目标应用组件时,调用方传入的want参数中指定了abilityName和bundleName,称为显式Want。
显式Want通常用于应用内组件启动,通过在Want对象内指定本应用Bundle名称信息(bundleName)和abilityName来启动应用内目标组件。当有明确处理请求的对象时,显式Want是一种简单有效的启动目标应用组件的方式。
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
deviceId: '', // deviceId为空表示本设备
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
}
隐式Want:在启动目标应用组件时,调用方传入的want参数中未指定abilityName,称为隐式Want。
当需要处理的对象不明确时,可以使用隐式Want,在当前应用中使用其他应用提供的某个能力,而不关心提供该能力的具体应用。隐式Want使用skills标签来定义需要使用的能力,并由系统匹配声明支持该请求的所有应用来处理请求。例如,需要打开一个链接的请求,系统将匹配所有声明支持该请求的应用,然后让用户选择使用哪个应用打开链接。
import { Want } from '@kit.AbilityKit';
let wantInfo: Want = {
// uncomment line below if wish to implicitly query only in the specific bundle.
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.search',
// entities can be omitted
entities: [ 'entity.system.browsable' ],
uri: 'https://www.test.com:8080/query/student',
type: 'text/plain',
};
根据系统中待匹配应用组件的匹配情况不同,使用隐式Want启动应用组件时会出现以下三种情况。
未匹配到满足条件的应用组件:启动失败。
匹配到一个满足条件的应用组件:直接启动该应用组件。
匹配到多个满足条件的应用组件(UIAbility):弹出选择框让用户选择。
对于启动ServiceExtensionAbility的场景。
调用方传入的want参数中带有abilityName,则不允许通过隐式Want启动ServiceExtensionAbility。
调用方传入的want参数中带有bundleName,则允许使用startServiceExtensionAbility()方法隐式Want启动ServiceExtensionAbility,默认返回优先级最高的ServiceExtensionAbility,如果优先级相同,返回第一个。
拍照并上传
1.相机拍照cameraPicker 流程:
1.打开相机后置摄像头得到拍照结果集 cameraPicker.pick
const pickerResult = cameraPicker.pick( 配置参数)
2.根据结果集的URI属性同步打开文件 openSync
const file = fs.openSync(pickerResult.resultUri)
3.以同步方法获取文件详细属性信息 fs.statSync
const stat = fs.statSync(file.fd)
4.定义缓冲区用于保存读取的文件
const buffer = new ArrayBuffer(stat.size)
5.开始同步读取内容到缓冲区
fs.readSync(file.fd, buffer)
6.读取完毕后关闭文件流 close
fs.closeSync(file)
7.借助util工具方法把读取的文件流转成base64编码的字符串
util.Base64Helper( )
数组
Scroll
Tabs
自定义tabBar ===> @Builder
类型判断
typeof 判断基础类型
instanceof 复杂类型判断
class修饰符
修饰符 readonly, private, protected, public
接口
接口可以继承和实现
extends
implements
State模板项目结构
Ability跳转的Want