




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章HarmonyOS核心概念武漢大學(xué)計算機學(xué)院趙小剛大綱Ability概念PageAbilityServiceAbilityIntent訪問后臺服務(wù)獲取電池電量Demo開發(fā)AbilityAbility是HarmonyOS應(yīng)用程序的重要組成部分,分為FA(FeatureAbility)和PA(ParticleAbility)兩種類型:FA支持PageAbility:Page模板是FA唯一支持的模板,用于提供與用戶交互的能力。PA支持ServiceAbility和DataAbility:Service模板用于提供后臺運行任務(wù)的能力;Data模板用于對外部提供統(tǒng)一的數(shù)據(jù)訪問抽象。開發(fā)UIFA需要提供UI用于與用戶進行交互,HarmonyOS提供了JavaUI和JSUI兩種UI框架:JavaUI提供了細粒度的UI編程接口,使應(yīng)用開發(fā)更加靈活;JSUI提了相對高層的UI描述,使應(yīng)用開發(fā)更加簡單。針對輕量級智能穿戴(LiteWearable),現(xiàn)階段只使用JS語言進行應(yīng)用開發(fā)。Ability是應(yīng)用所具備能力的抽象,也是應(yīng)用程序的重要組成部分。一個應(yīng)用可以具備多種能力(即可以包含多個Ability),HarmonyOS支持應(yīng)用以Ability為單位進行部署。Ability可以分為FA(FeatureAbility)和PA(ParticleAbility)兩種類型,每種類型為開發(fā)者提供了不同的模板,以便實現(xiàn)不同的業(yè)務(wù)功能。FA支持PageAbility:Page模板是FA唯一支持的模板,用于提供與用戶交互的能力。一個Page實例可以包含一組相關(guān)頁面,每個頁面用一個AbilitySlice實例表示。PA支持ServiceAbility和DataAbility:Service模板:用于提供后臺運行任務(wù)的能力。Data模板:用于對外部提供統(tǒng)一的數(shù)據(jù)訪問抽象。在配置文件(config.json)中注冊Ability時,可以通過配置Ability元素中的“type”屬性來指定Ability模板類型PA、SA和DAMo
delViewPageAbility控制器ServiceAbility模型DataAbility視圖ParticalAbilityFeatureAbility請求服務(wù)服務(wù)結(jié)果響應(yīng)請求數(shù)據(jù)數(shù)據(jù)結(jié)果響應(yīng)Layout請求數(shù)據(jù)數(shù)據(jù)結(jié)果響應(yīng)PageAbilityPage與AbilitySliceAbilitySlice路由配置Page與AbilitySlicePage模板(以下簡稱“Page”)是FA唯一支持的模板,用于提供與用戶交互的能力。一個Page可以由一個或多個AbilitySlice構(gòu)成,AbilitySlice是指應(yīng)用的單個頁面及其控制邏輯的總和。當(dāng)一個Page由多個AbilitySlice共同構(gòu)成時,這些AbilitySlice頁面提供的業(yè)務(wù)能力應(yīng)具有高度相關(guān)性。例如,新聞瀏覽功能可以通過一個Page來實現(xiàn),其中包含了兩個AbilitySlice:一個AbilitySlice用于展示新聞列表,另一個AbilitySlice用于展示新聞詳情。相比于桌面場景,移動場景下應(yīng)用之間的交互更為頻繁。通常,單個應(yīng)用專注于某個方面的能力開發(fā),當(dāng)它需要其他能力輔助時,會調(diào)用其他應(yīng)用提供的能力。例如,外賣應(yīng)用提供了聯(lián)系商家的業(yè)務(wù)功能入口,當(dāng)用戶在使用該功能時,會跳轉(zhuǎn)到通話應(yīng)用的撥號頁面。與此類似,HarmonyOS支持不同Page之間的跳轉(zhuǎn),并可以指定跳轉(zhuǎn)到目標(biāo)Page中某個具體的AbilitySlice。AbilitySlice路由配置雖然一個Page可以包含多個AbilitySlice,但是Page進入前臺時界面默認只展示一個AbilitySlice。默認展示的AbilitySlice是通過setMainRoute()方法來指定的。如果需要更改默認展示的AbilitySlice,可以通過addActionRoute()方法為此AbilitySlice配置一條路由規(guī)則。此時,當(dāng)其他Page實例期望導(dǎo)航到此AbilitySlice時,可以在Intent中指定Action。setMainRoute&addActionRoutepublicclassMyAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);//setthemainroutesetMainRoute(MainSlice.class.getName());//settheactionrouteaddActionRoute("action.pay",PaySlice.class.getName());addActionRoute("action.scan",ScanSlice.class.getName());}}addActionRoute()方法中使用的動作命名,需要在應(yīng)用配置文件(config.json)中注冊{"module":{"abilities":[{"skills":[{"actions":["action.pay","action.scan"]}]}]...生命周期PageAbility生命周期回調(diào)AbilitySlice生命周期PageAbility與AbilitySlice生命周期關(guān)聯(lián)系統(tǒng)管理或用戶操作等行為均會引起Page實例在其生命周期的不同狀態(tài)之間進行轉(zhuǎn)換。Ability類提供的回調(diào)機制能夠讓Page及時感知外界變化,從而正確地應(yīng)對狀態(tài)變化(比如釋放資源),這有助于提升應(yīng)用的性能和穩(wěn)健性。Page生命周期回調(diào)onStart()當(dāng)系統(tǒng)首次創(chuàng)建Page實例時,觸發(fā)該回調(diào)。對于一個Page實例,該回調(diào)在其生命周期過程中僅觸發(fā)一次,Page在該邏輯后將進入INACTIVE狀態(tài)。開發(fā)者必須重寫該方法,并在此配置默認展示的AbilitySlice。@OverridepublicvoidonStart(Intentintent){super.onStart(intent);super.setMainRoute(FooSlice.class.getName());}onActive()Page會在進入INACTIVE狀態(tài)后來到前臺,然后系統(tǒng)調(diào)用此回調(diào)。Page在此之后進入ACTIVE狀態(tài),該狀態(tài)是應(yīng)用與用戶交互的狀態(tài)。Page將保持在此狀態(tài),除非某類事件發(fā)生導(dǎo)致Page失去焦點,比如用戶點擊返回鍵或?qū)Ш降狡渌鸓age。當(dāng)此類事件發(fā)生時,會觸發(fā)Page回到INACTIVE狀態(tài),系統(tǒng)將調(diào)用onInactive()回調(diào)。此后,Page可能重新回到ACTIVE狀態(tài),系統(tǒng)將再次調(diào)用onActive()回調(diào)。因此,開發(fā)者通常需要成對實現(xiàn)onActive()和onInactive(),并在onActive()中獲取在onInactive()中被釋放的資源。onInactive()當(dāng)Page失去焦點時,系統(tǒng)將調(diào)用此回調(diào),此后Page進入INACTIVE狀態(tài)。開發(fā)者可以在此回調(diào)中實現(xiàn)Page失去焦點時應(yīng)表現(xiàn)的恰當(dāng)行為。onBackground()如果Page不再對用戶可見,系統(tǒng)將調(diào)用此回調(diào)通知開發(fā)者用戶進行相應(yīng)的資源釋放,此后Page進入BACKGROUND狀態(tài)。開發(fā)者應(yīng)該在此回調(diào)中釋放Page不可見時無用的資源,或在此回調(diào)中執(zhí)行較為耗時的狀態(tài)保存操作。onForeground()處于BACKGROUND狀態(tài)的Page仍然駐留在內(nèi)存中,當(dāng)重新回到前臺時(比如用戶重新導(dǎo)航到此Page),系統(tǒng)將先調(diào)用onForeground()回調(diào)通知開發(fā)者,而后Page的生命周期狀態(tài)回到INACTIVE狀態(tài)。開發(fā)者應(yīng)當(dāng)在此回調(diào)中重新申請在onBackground()中釋放的資源,最后Page的生命周期狀態(tài)進一步回到ACTIVE狀態(tài),系統(tǒng)將通過onActive()回調(diào)通知開發(fā)者用戶。onStop()系統(tǒng)將要銷毀Page時,將會觸發(fā)此回調(diào)函數(shù),通知用戶進行系統(tǒng)資源的釋放。銷毀Page的可能原因包括以下幾個方面:用戶通過系統(tǒng)管理能力關(guān)閉指定Page,例如使用任務(wù)管理器關(guān)閉Page。用戶行為觸發(fā)Page的terminateAbility()方法調(diào)用,例如使用應(yīng)用的退出功能。配置變更導(dǎo)致系統(tǒng)暫時銷毀Page并重建。系統(tǒng)出于資源管理目的,自動觸發(fā)對處于BACKGROUND狀態(tài)Page的銷毀。AbilitySlice生命周期AbilitySlice作為Page的組成單元,其生命周期是依托于其所屬Page生命周期的。AbilitySlice和Page具有相同的生命周期狀態(tài)和同名的回調(diào),當(dāng)Page生命周期發(fā)生變化時,它的AbilitySlice也會發(fā)生相同的生命周期變化。此外,AbilitySlice還具有獨立于Page的生命周期變化,這發(fā)生在同一Page中的AbilitySlice之間導(dǎo)航時,此時Page的生命周期狀態(tài)不會改變。AbilitySlice生命周期回調(diào)與Page的相應(yīng)回調(diào)類似,由于AbilitySlice承載具體的頁面,開發(fā)者必須重寫AbilitySlice的onStart()回調(diào),并在此方法中通過setUIContent()方法設(shè)置頁面。AbilitySlice實例創(chuàng)建和管理通常由應(yīng)用負責(zé),系統(tǒng)僅在特定情況下會創(chuàng)建AbilitySlice實例。例如,通過導(dǎo)航啟動某個AbilitySlice時,是由系統(tǒng)負責(zé)實例化;但是在同一個Page中不同的AbilitySlice間導(dǎo)航時則由應(yīng)用負責(zé)實例化。@OverrideprotectedvoidonStart(Intentintent){super.onStart(intent);setUIContent(ResourceTable.Layout_main_layout);}Page與AbilitySlice生命周期關(guān)聯(lián)當(dāng)AbilitySlice處于前臺且具有焦點時,其生命周期狀態(tài)隨著所屬Page的生命周期狀態(tài)的變化而變化。當(dāng)一個Page擁有多個AbilitySlice時,例如:MyAbility下有FooAbilitySlice和BarAbilitySlice,當(dāng)前FooAbilitySlice處于前臺并獲得焦點,并即將導(dǎo)航到BarAbilitySlice,在此期間的生命周期狀態(tài)變化順序為:FooAbilitySlice從ACTIVE狀態(tài)變?yōu)镮NACTIVE狀態(tài)。BarAbilitySlice則從INITIAL狀態(tài)首先變?yōu)镮NACTIVE狀態(tài),然后變?yōu)锳CTIVE狀態(tài)(假定此前BarAbilitySlice未曾啟動)。FooAbilitySlice從INACTIVE狀態(tài)變?yōu)锽ACKGROUND狀態(tài)。對應(yīng)兩個slice的生命周期方法回調(diào)順序為:FooAbilitySlice.onInactive()-->BarAbilitySlice.onStart()-->BarAbilitySlice.onActive()-->FooAbilitySlice.onBackground()在整個流程中,MyAbility始終處于ACTIVE狀態(tài)。但是,當(dāng)Page被系統(tǒng)銷毀時,其所有已實例化的AbilitySlice將聯(lián)動銷毀,而不僅是處于前臺的AbilitySlice。AbilitySlice間導(dǎo)航同一Page內(nèi)導(dǎo)航不同Page間導(dǎo)航同一Page內(nèi)導(dǎo)航當(dāng)發(fā)起導(dǎo)航的AbilitySlice和導(dǎo)航目標(biāo)的AbilitySlice處于同一個Page時,您可以通過present()方法實現(xiàn)導(dǎo)航。@OverrideprotectedvoidonStart(Intentintent){...Buttonbutton=...;button.setClickedListener(listener->present(newTargetSlice(),newIntent()));}如果開發(fā)者希望在用戶從導(dǎo)航目標(biāo)AbilitySlice返回時,能夠獲得其返回結(jié)果,則應(yīng)當(dāng)使用presentForResult()實現(xiàn)導(dǎo)航。用戶從導(dǎo)航目標(biāo)AbilitySlice返回時,系統(tǒng)將回調(diào)onResult()來接收和處理返回結(jié)果,開發(fā)者需要重寫該方法。返回結(jié)果由導(dǎo)航目標(biāo)AbilitySlice在其生命周期內(nèi)通過setResult()進行設(shè)置。源AbilitySlice@OverrideprotectedvoidonStart(Intentintent){...Buttonbutton=...;button.setClickedListener(listener->presentForResult(newTargetSlice(),newIntent(),0));...}
@OverrideprotectedvoidonResult(intrequestCode,IntentresultIntent){if(requestCode==0){//ProcessresultIntenthere.}}系統(tǒng)為每個Page維護了一個AbilitySlice實例的棧,每個進入前臺的AbilitySlice實例均會入棧。當(dāng)開發(fā)者在調(diào)用present()或presentForResult()時指定的AbilitySlice實例已經(jīng)在棧中存在時,則棧中位于此實例之上的AbilitySlice均會出棧并終止其生命周期。前面的示例代碼中,導(dǎo)航時指定的AbilitySlice實例均是新建的,即便重復(fù)執(zhí)行此代碼(此時作為導(dǎo)航目標(biāo)的這些實例是同一個類),也不會導(dǎo)致任何AbilitySlice出棧。AbilitySlice實例棧AbilitySlice1AbilitySlice1AbilitySlice2AbilitySlice1AbilitySlice2導(dǎo)航newAbilitySlice2AbilitySlice1返回AbilitySlice1AbilitySlice1AbilitySlice2poppushdestroy不同Page間導(dǎo)航不同Page中的AbilitySlice相互不可見,因此無法通過present()或presentForResult()方法直接導(dǎo)航到其他Page的AbilitySlice。AbilitySlice作為Page的內(nèi)部單元,以Action的形式對外暴露,因此可以通過配置Intent的Action導(dǎo)航到目標(biāo)AbilitySlice。Page間的導(dǎo)航可以使用startAbility()或startAbilityForResult()方法,獲得返回結(jié)果的回調(diào)為onAbilityResult()。在Ability中調(diào)用setResult()可以設(shè)置返回結(jié)果。ServiceAbility基于Service模板的Ability(以下簡稱“Service”)主要用于后臺運行任務(wù)(如執(zhí)行音樂播放、文件下載等),但不提供用戶交互界面。Service可由其他應(yīng)用或Ability啟動,即使用戶切換到其他應(yīng)用,Service仍將在后臺繼續(xù)運行。Service是單實例的。在一個設(shè)備上,相同的Service只會存在一個實例。如果多個Ability共用這個實例,只有當(dāng)與Service綁定的所有Ability都退出后,Service才能夠退出。由于Service是在主線程里執(zhí)行的,因此,如果在Service里面的操作時間過長,開發(fā)者必須在Service里創(chuàng)建新的線程來處理(詳見線程間通信),防止造成主線程阻塞,應(yīng)用程序無響應(yīng)。創(chuàng)建Service創(chuàng)建Ability的子類,實現(xiàn)Service相關(guān)的生命周期方法。Service也是一種Ability,Ability為Service提供了以下生命周期方法,用戶可以重寫這些方法來添加自己的處理。onStart()該方法在創(chuàng)建Service的時候調(diào)用,用于Service的初始化。在Service的整個生命周期只會調(diào)用一次,調(diào)用時傳入的Intent應(yīng)為空。onCommand()在Service創(chuàng)建完成之后調(diào)用,該方法在客戶端每次啟動該Service時都會調(diào)用,用戶可以在該方法中做一些調(diào)用統(tǒng)計、初始化類的操作。onConnect?()onConnect?()在Ability和Service連接時調(diào)用,該方法返回IRemoteObject對象,用戶可以在該回調(diào)函數(shù)中生成對應(yīng)Service的IPC通信通道,以便Ability與Service交互。Ability可以多次連接同一個Service,系統(tǒng)會緩存該Service的IPC通信對象,只有第一個客戶端連接Service時,系統(tǒng)才會調(diào)用Service的onConnect方法來生成IRemoteObject對象,而后系統(tǒng)會將同一個RemoteObject對象傳遞至其他連接同一個Service的所有客戶端連接,而無需再次調(diào)用onConnect方法。onDisconnect?()在Ability與綁定的Service斷開連接時調(diào)用。onStop()在Service銷毀時調(diào)用。Service應(yīng)通過實現(xiàn)此方法來清理任何資源,如關(guān)閉線程、注冊的偵聽器等。ServiceAbility實例publicclassServiceAbilityextendsAbility{@OverridepublicvoidonStart(Intentintent){super.onStart(intent);}
@OverridepublicvoidonCommand(Intentintent,booleanrestart,intstartId){super.onCommand(intent,restart,startId);}
@OverridepublicIRemoteObjectonConnect(Intentintent){super.onConnect(intent);returnnull;}
@OverridepublicvoidonDisconnect(Intentintent){super.onDisconnect(intent);}
@OverridepublicvoidonStop(){super.onStop();}}注冊ServiceService也需要在應(yīng)用配置文件中進行注冊,注冊類型type需要設(shè)置為service。{"module":{"abilities":[{"name":".ServiceAbility","type":"service","visible":true...}]}}啟動ServiceAbility為開發(fā)者提供了startAbility()方法來啟動另外一個Ability。因為Service也是Ability的一種,開發(fā)者同樣可以通過將Intent傳遞給該方法來啟動Service。不僅支持啟動本地Service,還支持啟動遠程Service。開發(fā)者可以通過構(gòu)造包含DeviceId、BundleName與AbilityName的Operation對象來設(shè)置目標(biāo)Service信息。這三個參數(shù)的含義如下:DeviceId:表示設(shè)備ID。如果是本地設(shè)備,則可以直接留空;如果是遠程設(shè)備,可以通過erwork.DeviceManager提供的getDeviceList獲取設(shè)備列表。BundleName:表示包名稱。AbilityName:表示待啟動的Ability名稱。本地Service啟動Intentintent=newIntent();Operationoperation=newIntent.OperationBuilder().withDeviceId("").withBundleName("com.huawei.hiworld.himusic").withAbilityName("com.huawei.hiworld.himusic.ServiceAbility").build();intent.setOperation(operation);startAbility(intent);遠程設(shè)備Service啟動Operationoperation=newIntent.OperationBuilder().withDeviceId("deviceId").withBundleName("com.huawei.hiworld.himusic").withAbilityName("com.huawei.hiworld.himusic.ServiceAbility").withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)//設(shè)置支持分布式調(diào)度系統(tǒng)多設(shè)備啟動的標(biāo)識.build();Intentintent=newIntent();intent.setOperation(operation);startAbility(intent);執(zhí)行上述代碼后,Ability將通過startAbility()方法來啟動Service。如果Service尚未運行,則系統(tǒng)會先調(diào)用onStart()來初始化Service,再回調(diào)Service的onCommand()方法來啟動Service。如果Service正在運行,則系統(tǒng)會直接回調(diào)Service的onCommand()方法來啟動Service。連接Service如果Service需要與PageAbility或其他應(yīng)用的ServiceAbility進行交互,則應(yīng)創(chuàng)建用于連接的Connection。Service支持其他Ability通過connectAbility()方法與其進行連接。在使用connectAbility()處理回調(diào)時,需要傳入目標(biāo)Service的Intent與IAbilityConnection的實例。IAbilityConnection提供了兩個方法供開發(fā)者實現(xiàn):onAbilityConnectDone()用來處理連接的回調(diào),onAbilityDisconnectDone()用來處理斷開連接的回調(diào)。Service生命周期與Page類似,Service也擁有生命周期。根據(jù)調(diào)用方法的不同,其生命周期有以下兩種路徑:啟動Service該Service在其他Ability調(diào)用startAbility()時創(chuàng)建,然后保持運行。其他Ability通過調(diào)用stopAbility()來停止Service,Service停止后,系統(tǒng)會將其銷毀。連接Service該Service在其他Ability調(diào)用connectAbility()時創(chuàng)建,客戶端可通過調(diào)用disconnectAbility()斷開連接。多個客戶端可以綁定到相同Service,而且當(dāng)所有綁定全部取消后,系統(tǒng)即會銷毀該Service。前臺Service一般情況下,Service都是在后臺運行的,后臺Service的優(yōu)先級都是比較低的,當(dāng)資源不足時,系統(tǒng)有可能回收正在運行的后臺Service。在一些場景下(如播放音樂),用戶希望應(yīng)用能夠一直保持運行,此時就需要使用前臺Service。前臺Service會始終保持正在運行的圖標(biāo)在系統(tǒng)狀態(tài)欄顯示。使用前臺Service并不復(fù)雜,開發(fā)者只需在Service創(chuàng)建的方法里,調(diào)用keepBackgroundRunning()將Service與通知綁定。調(diào)用keepBackgroundRunning()方法前需要在配置文件中聲明ohos.permission.KEEP_BACKGROUND_RUNNING權(quán)限,同時還需要在配置文件中添加對應(yīng)的backgroundModes參數(shù)。在onStop()方法中調(diào)用cancelBackgroundRunning?()方法可停止前臺Service。前臺Service使用范例//創(chuàng)建通知,其中1005為notificationIdNotificationRequestrequest=newNotificationRequest(1005);NotificationRequest.NotificationNormalContentcontent=newNotificationRequest.NotificationNormalContent();content.setTitle("title").setText("text");NotificationRequest.NotificationContentnotificationContent=newNotificationRequest.NotificationContent(content);request.setContent(notificationContent);
//綁定通知,1005為創(chuàng)建通知時傳入的notificationIdkeepBackgroundRunning(1005,request);配置文件中配置{"name":".ServiceAbility","type":"service","visible":true,"backgroundModes":["dataTransfer","location"]}IntentIntent是對象之間傳遞信息的載體。例如,當(dāng)一個Ability需要啟動另一個Ability時,或者一個AbilitySlice需要導(dǎo)航到另一個AbilitySlice時,可以通過Intent指定啟動的目標(biāo)同時攜帶相關(guān)數(shù)據(jù)。Intent的構(gòu)成元素包括Operation與Parameters,具體內(nèi)容如下表:Intent結(jié)構(gòu)
當(dāng)Intent用于發(fā)起請求時,根據(jù)指定元素的不同,分為兩種類型:如果同時指定了BundleName與AbilityName,則根據(jù)Ability的全稱(例如,“com.demoapp.FooAbility”)來直接啟動應(yīng)用。如果未同時指定BundleName和AbilityName,則根據(jù)Operation中的其他屬性來啟動應(yīng)用。Intent設(shè)置屬性時,必須先使用Operation來設(shè)置屬性。如果需要新增或修改屬性,必須在設(shè)置Operation后再執(zhí)行操作。根據(jù)Ability的全稱啟動應(yīng)用通過構(gòu)造包含BundleName與AbilityName的Operation對象,可以啟動一個Ability、并導(dǎo)航到該Ability。作為處理請求的對象,會在相應(yīng)的回調(diào)方法中接收請求方傳遞的Intent對象。以導(dǎo)航到另一個Ability為例,導(dǎo)航的目標(biāo)Ability可以在其onStart()回調(diào)的參數(shù)中獲得Intent對象。Intentintent=newIntent();//通過Intent中的OperationBuilder類構(gòu)造operation對象,指定設(shè)備標(biāo)識(空串表示當(dāng)前設(shè)備)、應(yīng)用包名、Ability名稱Operationoperation=newIntent.OperationBuilder().withDeviceId("").withBundleName("com.demoapp").withAbilityName("com.demoapp.FooAbility").build();//把operation設(shè)置到intent中intent.setOperation(operation);startAbility(intent);使用Intent進行數(shù)據(jù)傳遞如果FA1啟動了FA2,且FA1需要向FA2中進行數(shù)據(jù)傳遞,以控制FA2的顯示內(nèi)容,這時可以通過Intent對象來攜帶數(shù)據(jù)。典型的例子是通訊錄,通訊錄主頁上顯示多條聯(lián)系人,單擊某個聯(lián)系人,則顯示聯(lián)系人的詳情,每個人的詳情頁顯示的內(nèi)容不一樣,但實際上是同一個FA,只是其內(nèi)容受控于主頁FA。設(shè)FA1和FA2之間的Intent名為secondIntent,則數(shù)據(jù)傳輸代碼如下:FA1:secondIntent.setParam("text","passedvalue");
通過setParam可以在Intent中設(shè)置傳遞給下一個頁面的數(shù)據(jù),這里是傳遞了一個字符串,名為text,值為passedvalue。FA2:text.setText(intent.getStringParam("text"));在第二個頁面的onStart(intent)方法中可以調(diào)用getStringParam方法將字符串text值讀出來。根據(jù)Operation的其他屬性啟動應(yīng)用有些場景下,開發(fā)者需要在應(yīng)用中使用其他應(yīng)用提供的某種能力,而不感知提供該能力的具體是哪一個應(yīng)用。例如開發(fā)者需要通過瀏覽器打開一個鏈接,而不關(guān)心用戶最終選擇哪一個瀏覽器應(yīng)用,則可以通過Operation的其他屬性(除BundleName與AbilityName之外的屬性)描述需要的能力。如果設(shè)備上存在多個應(yīng)用提供同種能力,系統(tǒng)則彈出候選列表,由詢天用戶選擇由哪個應(yīng)用處理請求。以下示例展示使用Intent跨Ability查氣信息。請求方在Ability中構(gòu)造Intent以及包含Action的Operation對象,并調(diào)用startAbilityForResult()方法發(fā)起請求。然后重寫onAbilityResult()回調(diào)方法,對請求結(jié)果進行處理。privatevoidqueryWeather(){Intentintent=newIntent();Operationoperation=newIntent.OperationBuilder().withAction(Intent.ACTION_QUERY_WEATHER).build();intent.setOperation(operation);startAbilityForResult(intent,REQ_CODE_QUERY_WEATHER);}@OverrideprotectedvoidonAbilityResult(intrequestCode,intresultCode,IntentresultData){switch(requestCode){caseREQ_CODE_QUERY_WEATHER://Dosomethingwithresult....return;default:...}}處理方作為處理請求的對象,首先需要在配置文件中聲明對外提供的能力,以便系統(tǒng)據(jù)此找到自身并作為候選的請求處理者。{"module":{"abilities":[{"skills":[{"actions":["ent.QUERY_WEATHER"]}]}]}}在Ability中配置路由以便支持以此action導(dǎo)航到對應(yīng)的AbilitySlice。@OverrideprotectedvoidonStart(Intentintent){addActionRoute(Intent.ACTION_QUERY_WEATHER,DemoSlice.class.getName());}在Ability中處理請求,并調(diào)用setResult()方法暫存返回結(jié)果。@OverrideprotectedvoidonActive(){IntentresultIntent=newIntent();setResult(0,resultIntent);}訪問后臺服務(wù)獲取電池電量Demo建立前臺FA顯示電量信息前臺FA有兩個可視化元素,一個Text,用來顯示獲得的手機電量,一個Button,用來觸發(fā)調(diào)用后臺服務(wù)事件<Text
ohos:id="$+id:text_helloworld"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="$string:mainability_HelloWorld"
ohos:text_size="20vp"
/>
<Button
ohos:id="$+id:button_battery"
ohos:height="match_content"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="BatteryInfo"
ohos:text_size="30vp"
/>訪問后臺服務(wù)獲取電池電量Demo連接后臺服務(wù)調(diào)用connectAbility(intent,connection)連接后臺服務(wù),其中Intent的operation參數(shù)已經(jīng)指明服務(wù)所在設(shè)備id,包名和包含的能力名稱,參數(shù)connection為IAbilityConnection類型。privatevoidstartBatteryService(){
Operationoperation=newIntent.OperationBuilder().withDeviceId("")
.withBundleName("com.whu.batteryjavacallpa")
.withAbilityName("com.whu.batteryjavacallpa.BatteryInfo")
.build();
Intentintent=newIntent();
intent.setOperation(operation);
connectAbility(intent,connection);
}
訪問后臺服務(wù)獲取電池電量Demo建立后臺服務(wù)BatteryInfo新建Service
Ability,該服務(wù)沒有界面,純粹提供電量讀取服務(wù)功能。該服務(wù)中除了基本的電量獲取函數(shù)getBatteryInfo,最重要是完成Service
Ability的重載函數(shù)onConnect(Intentintent)。意味著當(dāng)前臺FA連接后臺服務(wù)時會觸發(fā)onConnect事件,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件升級及維護合同
- 交通協(xié)管員聘用合同協(xié)議書
- 家禽購銷合同
- 貨品抵款結(jié)算協(xié)議書
- 應(yīng)對市場變化的解決方案研究
- 蘭州房屋租賃合同
- 機械租賃協(xié)議合同
- 第19課 治學(xué)須有疑無疑不成學(xué)-《懷疑與學(xué)問》(教學(xué)設(shè)計)九年級語文上冊同步高效課堂(統(tǒng)編版)
- 第一單元學(xué)習(xí)任務(wù)《如何闡述自己的觀點》教學(xué)設(shè)計 2023-2024學(xué)年統(tǒng)編版高中語文必修下冊
- Unit 4 Fun with numbers 第二課時(教學(xué)設(shè)計)-2024-2025學(xué)年外研版(三起)(2024)英語三年級上冊
- 外貿(mào)客戶報價單中英文格式模板
- 湖南教育學(xué)會版信息技術(shù)六年級下冊教案(6課)
- JJF 1338-2012相控陣超聲探傷儀校準(zhǔn)規(guī)范
- 媒介經(jīng)營與管理-課件
- 2022年四川甘孜州州屬事業(yè)單位考調(diào)工作人員沖刺卷貳(3套)答案詳解
- 超星爾雅學(xué)習(xí)通《民俗資源與旅游》2020章節(jié)測試含答案
- 尿碘檢測臨床意義
- 2022年山東司法警官職業(yè)學(xué)院單招語文試題及答案解析
- 2023版北京協(xié)和醫(yī)院重癥醫(yī)學(xué)科診療常規(guī)
- 鋼網(wǎng)驗收報告
- 防水補漏工程合同(合同版本)
評論
0/150
提交評論