今天我們來(lái)聊一下Service Ability关翎,基于Service模板的Ability(以下簡(jiǎn)稱“Service”)主要用于后臺(tái)運(yùn)行任務(wù)(如執(zhí)行音樂(lè)播放、文件下載等),但不提供用戶交互界面嚷闭。Service可由其他應(yīng)用或Ability啟動(dòng)攒岛,即使用戶切換到其他應(yīng)用,Service仍將在后臺(tái)繼續(xù)運(yùn)行胞锰。
這里就不得不提到另外一個(gè)知識(shí)點(diǎn)灾锯,線程。
其實(shí)目前我們前面提到的一些UI布局的繪制都是在主線程上進(jìn)行的嗅榕,又稱UI線程挠进,默認(rèn)情況下,所有的操作都是在主線程上執(zhí)行誊册,這里如果我們系統(tǒng)通過(guò)ServiceAbility來(lái)完成后臺(tái)運(yùn)行任務(wù),我們首先要初步了解一下asyncDispatch暖璧。
(1)初識(shí)TaskDispatcher的異步派發(fā)任務(wù)asyncDispatch案怯;
那么TaskDispatcher又是什么呢?TaskDispatcher是一個(gè)任務(wù)分發(fā)器澎办,它是Ability分發(fā)任務(wù)的基本接口嘲碱,隱藏任務(wù)所在線程的實(shí)現(xiàn)細(xì)節(jié)。詳細(xì)的介紹我們放到后面局蚀,先來(lái)了解異步派發(fā)任務(wù)asyncDispatch:派發(fā)任務(wù)麦锯,并立即返回,返回值是一個(gè)可用于取消任務(wù)的接口琅绅。
Revocable revocable = globalTaskDispatcher.asyncDispatch(new Runnable() {
@Override
public void run() {
HiLog.info(label, "異步任務(wù)A執(zhí)行");
}
});
(2)創(chuàng)建Service Ability扶欣;
通過(guò)工具欄File->New->Ability->Empty Service Ability來(lái)創(chuàng)建Service Ability,這樣創(chuàng)建的好處是可以在config.json中自動(dòng)完成Service Ability的配置千扶。
(3)啟動(dòng)Service Ability料祠;
這里還可以通過(guò)Intent的構(gòu)造元素Parameters來(lái)傳遞參數(shù),進(jìn)行簡(jiǎn)單的數(shù)據(jù)傳遞澎羞。
Intent intentService = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.codermrye.day10")
.withAbilityName("com.codermrye.day10.ServiceAbility")
.build();
intentService.setOperation(operation);
startAbility(intentService);
(4)連接ServiceAbility
如果Service需要與Page Ability或其他應(yīng)用的Service Ability進(jìn)行交互髓绽,則應(yīng)創(chuàng)建用于連接的Connection。Service支持其他Ability通過(guò)connectAbility()方法與其進(jìn)行連接妆绞。在使用connectAbility()處理回調(diào)時(shí)顺呕,需要傳入目標(biāo)Service的Intent與IAbilityConnection的實(shí)例。IAbilityConnection提供了兩個(gè)方法供開(kāi)發(fā)者實(shí)現(xiàn):onAbilityConnectDone()用來(lái)處理連接的回調(diào)括饶,onAbilityDisconnectDone()用來(lái)處理斷開(kāi)連接的回調(diào)株茶。
連接時(shí)步驟(1)(2)保持不變,connectAbility中傳入intentService和connection图焰。
這里詳細(xì)的創(chuàng)建IDL文件過(guò)程可參考《IDL接口使用規(guī)范》和《定義HarmonyOS IDL接口》忌卤。這個(gè)在后續(xù)的文章中分析討論,目前官方的接口還無(wú)法成功回調(diào)onAbilityConnectDone()楞泼。
Intent intentService = new Intent();
......
intentService.setOperation(operation);
// startAbility(intentService);
// 連接Service
connectAbility(intentService, connection);
// 創(chuàng)建連接回調(diào)實(shí)例
private IAbilityConnection connection = new IAbilityConnection() {
// 連接到Service的回調(diào)
@Override
public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
// 在這里開(kāi)發(fā)者可以拿到服務(wù)端傳過(guò)來(lái)IRemoteObject對(duì)象驰徊,從中解析出服務(wù)端傳過(guò)來(lái)的信息
}
// 斷開(kāi)與連接的回調(diào)
@Override
public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
}
};
(5)最后附上其生命周期的說(shuō)明笤闯。
本文由GZH程序員小小葉發(fā)布!