OpenHarmony之 eTS FA調(diào)用 eTS ServiceAbility
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
一、介紹
本文是ServiceAbility樣例的實踐,主要展示了eTS FA調(diào)用 eTS PA ,實現(xiàn)一個字符串排序的功能, 這里的PA 指的是ServiceAbility。Ability是應用所具備能力的抽象,也是應用程序的重要組成部分。一個應用可以具備多種能力(即可以包含多個Ability),HarmonyOS支持應用以Ability為單位進行部署。Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類型,每種類型為開發(fā)者提供了不同的模板,以便實現(xiàn)不同的業(yè)務功能。
Gitee 樣例地址:
https://gitee.com/openharmony/app_samples/tree/master/ability/ServiceAbility。
大家也可以自行下載運行,但需要在OpenHarmony的設備才能運行。
先來展示一下效果:
二、代碼講解
└─main
│ config.json
│
├─ets
│ ├─MainAbility
│ │ │ app.ets
│ │ │
│ │ ├─component
│ │ │ OperateView.ets
│ │ │ TitleBar.ets
│ │ │
│ │ ├─model
│ │ │ ServiceModel.ts
│ │ │
│ │ └─pages
│ │ Index.ets
│ │
│ └─ServiceAbility
│ service.ts
│
└─resources
PA端
一、ServiceAbility下的service.ts 服務能力類
我們先來看服務端,因為功能是服務端定義的,看它我們就能知道這個服務能力類的核心是實現(xiàn)了一個什么功能,以及如何定義一個這樣的服務能力類。
對照下面的圖來看,它都做了那些事:
- 引入rpc依賴,RPC,全稱 Remote Procedure Call(遠程過程調(diào)用),即調(diào)用遠程計算機上的服務,就像調(diào)用本地服務一樣。
- 類命名建議遵循XxxxStub,繼承rpc.RemoteObject類
- onRemoteRequest函數(shù)中,按照業(yè)務定義請求碼,實現(xiàn)響應的功能,data為輸入?yún)?shù),reply為返回結(jié)果,記得返回true。
- export的回調(diào)函數(shù)中,onConnect函數(shù)要返回當前new的實例。

FA端
一、MainAbility下的ServiceModel.ts 服務模塊
客戶端我們先來看一下 ServiceModel.ts ,注意這個也是一個ts文件,說明它也是一個class,它主要是調(diào)用服務端的服務能力類。
對照圖來看:
- 引入了featureAbility、rpc的依賴。
- 定義了rpc對象 mRemote。
- 定義了設備ID,可以支持異地設備。
- 定義了connectService、disconnectService 方法,用于連接和斷開服務能力的連接。
- 定義rpc對象的get方法,用于調(diào)用remote方法。
- 定義了幾個事件回調(diào)函數(shù),包括:onConnectCallback、onDisconnectCallback、onFailedCallback。
這里就把connectService 函數(shù)展開來看一下。
//連接的服務
connectService() {
console.log(`${TAG} onCconnectService begin`)
connection = featureAbility.connectAbility(
{
deviceId: localDeviceId,
bundleName: 'ohos.samples.etsserviceability',
abilityName: 'ohos.samples.etsserviceability.ServiceAbility',
},
{
onConnect: this.onConnectCallback,
onDisconnect: this.onDisconnectCallback,
onFailed: this.onFailedCallback,
},
)
}
二、MainAbility下的OperateView.ets 操作視圖UI組件
- 可以學習一下TextArea、Text組件的使用,例如 placeholder、onChange的使用。
- 可以學習一下@Link 裝飾器的使用。
Prop、Link、Consume、Objectlink 禁止本地初始化。是父組件直接傳過來的。(查看更多裝飾器)
我們在Index.ets 頁面再看一下是如何使用這個組件的。
@Component
export struct OperateView {
@Link before: string
@Link after: string
build() {
Column() {
TextArea({ placeholder: $r('app.string.input_placeholder') })
.fontSize(22)
.width('94%')
.constraintSize({ minHeight: 50 })
.margin({ top: 10 })
.onChange((value: string) => {
this.before = value
})
Text(this.after)
.fontSize(22)
.width('94%')
.margin({ top: 10 })
.constraintSize({ minHeight: 50 })
.padding(10)
.border({ width: 1, color: Color.Gray, radius: 20 })
}
}
}
三、MainAbility下的Index.ets 首頁
Index.ets是這個樣例工程的主頁面,和用戶交互的部分都是在這個頁面展示了,還是對照截圖來看:
- 引入了prompt、rpc 的依賴。prompt是一個信息提示對話框組件。
- 聲明一個serviceModel的實例化變量。
- 定義了一個async的排序函數(shù),里面是調(diào)用serviceModel提供的字符串排序方法。
- build代碼塊,構(gòu)建UI組件。
再來看一下 build 代碼塊的內(nèi)容:
1.調(diào)用OperateView 組件,將排序前后的兩個字符串傳給組件進行顯示,還記得OperateView組件的定義。
@Component
export struct OperateView {
@Link before: string
@Link after: string
2.ForEach 循環(huán)創(chuàng)建按鈕組件,包括: 連接服務、斷開服務、字符串排序,結(jié)合switch 的使用,避免寫很多重復代碼。
這個示例就分析完。
四、補充說明
1、為什么上面講的時候是按照服務端和客戶端分開講呢?
因為鴻蒙應用的最小單元是Ability,也就是是它是可以按照Ability進行拆分然后分發(fā)部署的。
2、包含@Link 變量的UI組件,想要預覽怎么辦?
@Link 修飾的變量禁止本地初始化,不管是加@Entry還是@Preview都還會預覽報錯,如果一定要預覽就把@Link換成其它類型裝飾器,后面記得改回去。