自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS Sample 之 ServiceAbility 跨設(shè)備接口調(diào)用

系統(tǒng) OpenHarmony
本示例演示了Service Ability的啟動(dòng)、停止、連接、斷開連接等操作,支持對(duì)跨設(shè)備的Service Ability進(jìn)行操作。

[[409955]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

ServiceAbility 跨設(shè)備接口調(diào)用

介紹

本示例演示了Service Ability的啟動(dòng)、停止、連接、斷開連接等操作,支持對(duì)跨設(shè)備的Service Ability進(jìn)行操作。

你將學(xué)會(huì)以下三個(gè)知識(shí)點(diǎn):

1.IDL的使用,以及IPC方法的調(diào)用

2.前臺(tái)Service的使用方法

3.EventHandle事件處理的使用方法

搭建環(huán)境

安裝DevEco Studio,詳情請(qǐng)參考DevEco Studio下載。

設(shè)置DevEco Studio開發(fā)環(huán)境,DevEco Studio開發(fā)環(huán)境需要依賴于網(wǎng)絡(luò)環(huán)境,需要連接上網(wǎng)絡(luò)才能確保工具的正常使用,可以根據(jù)如下兩種情況來配置開發(fā)環(huán)境:

  • 如果可以直接訪問Internet,只需進(jìn)行下載HarmonyOS SDK操作。
  • 如果網(wǎng)絡(luò)不能直接訪問Internet,需要通過代理服務(wù)器才可以訪問,請(qǐng)參考配置開發(fā)環(huán)境。

代碼結(jié)構(gòu)解讀

后臺(tái)邏輯

  1. │  config.json #全局配置文件 
  2. │ 
  3. ├─idl 
  4. │  └─ohos 
  5. │      └─samples 
  6. │          └─serviceability 
  7. │                  IRemoteAgent.idl #提供遠(yuǎn)程接口idl文件 
  8. │ 
  9. ├─java 
  10. │  └─ohos 
  11. │      └─samples 
  12. │          └─serviceability 
  13. │              │  ForegroundServiceAbility.java #前臺(tái)Service Ability 
  14. │              │  LocalServiceAbility.java #模擬本地的Service Ability 
  15. │              │  MainAbility.java   
  16. │              │  RemoteAbility.java    #模擬遠(yuǎn)端的Service Ability 
  17. │              │ 
  18. │              └─slice 
  19. │                      MainAbilitySlice.java #主能力頁 

 頁面布局文件只有一個(gè) main_slice.xml

頁面布局

三個(gè)知識(shí)點(diǎn)

1.IDL的使用,以及IPC方法的調(diào)用

術(shù)語:

當(dāng)客戶端和服務(wù)器通信時(shí),需要定義雙方都認(rèn)可的接口,以保障雙方可以成功通信,HarmonyOS IDL(HarmonyOS Interface Definition Language)則是一種定義此類接口的工具。

跨進(jìn)程調(diào)用(IPC)inter-process communication 或 跨設(shè)備調(diào)用(RPC)remote procedure call

IDL接口使用規(guī)范:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/idl-overview-0000001050762835

先聲明權(quán)限,同時(shí)敏感權(quán)限還需要請(qǐng)求用戶授權(quán),前幾篇都有寫過這里就不寫了。

  1. "reqPermissions": [ 
  2.     { 
  3.       "name""ohos.permission.GET_DISTRIBUTED_DEVICE_INFO" 
  4.     }, 
  5.     ... 
  6.     { 
  7.       "name""ohos.permission.DISTRIBUTED_DATASYNC" 
  8.     } 
  9.   ] 

 a.創(chuàng)建.idl文件

HarmonyOS Sample 之 ServiceAbility 跨設(shè)備接口調(diào)用-鴻蒙HarmonyOS技術(shù)社區(qū)

IRemoteAgent.idl

  1. // Declare any non-default types here with sequenceable or interface statements 
  2.  
  3. interface ohos.samples.serviceability.IRemoteAgent { 
  4.     /* 
  5.      * Demo service method use some parameters 
  6.      */ 
  7.     void setRemoteObject([in] String param); 

 b.編譯idl文件,生成對(duì)應(yīng)的接口類、樁類和代理類

HarmonyOS Sample 之 ServiceAbility 跨設(shè)備接口調(diào)用-鴻蒙HarmonyOS技術(shù)社區(qū)
HarmonyOS Sample 之 ServiceAbility 跨設(shè)備接口調(diào)用-鴻蒙HarmonyOS技術(shù)社區(qū)

c.服務(wù)端IDL的實(shí)現(xiàn)

  1. private static final String DESCRIPTOR = "ohos.samples.serviceability.RemoteAbility"
  2.  
  3. //idl的服務(wù)端實(shí)現(xiàn), 
  4. RemoteAgentStub remoteAgentStub = new RemoteAgentStub(DESCRIPTOR) { 
  5.     @Override 
  6.     public void setRemoteObject(String param) { 
  7.         HiLog.info(LABEL_LOG, "%{public}s""setRemoteObject:"+param); 
  8.         //不能這樣,要用下面通知的方式 
  9.         //showTips(RemoteAbility.this, param); 
  10.         //賦值 
  11.         param_mess=param; 
  12.         //事件通知 
  13.         eventHandler.sendEvent(EVENT_ABILITY_MESS); 
  14.  
  15.     } 
  16.  
  17. }; 

 d.客戶端調(diào)用IPC方法 

  1. //IDL代理類 
  2. private  RemoteAgentProxy remoteAgentProxy; 
  3.  
  4. /** 
  5.  * 連接 Service 
  6.  * @param isConnectRemote 
  7.  */ 
  8. private void connectService(boolean isConnectRemote) { 
  9.     //三元表達(dá)式,判斷連接本地還是遠(yuǎn)端Service 
  10.     Intent intent = isConnectRemote 
  11.             ? getRemoteServiceIntent(REMOTE_BUNDLE, REMOTE_SERVICE) 
  12.             : getLocalServiceIntent(LOCAL_BUNDLE, NORMAL_SERVICE); 
  13.  
  14.  
  15.     //連接 Service 
  16.     boolean isConnect=connectAbility(intent,connection); 
  17.     if (isConnect && remoteAgentProxy!=null) { 
  18.         try { 
  19.             //調(diào)用服務(wù)端IPC方法 
  20.             remoteAgentProxy.setRemoteObject("This param from client"); 
  21.         } catch (RemoteException e) { 
  22.             HiLog.error(LABEL_LOG, "%{public}s""onAbilityConnectDone RemoteException"); 
  23.         } 
  24.     } 
  25.  
  26.  
  27. //建立連接,實(shí)例化代理對(duì)象 
  28. private IAbilityConnection connection = new IAbilityConnection() { 
  29.     @Override 
  30.     public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) { 
  31.         //發(fā)個(gè)通知,Service 連接成功了 
  32.         eventHandler.sendEvent(EVENT_ABILITY_CONNECT_DONE); 
  33.         //實(shí)例化代理對(duì)象 
  34.         remoteAgentProxy = new RemoteAgentProxy(iRemoteObject); 
  35.     } 
  36.  
  37.     @Override 
  38.     public void onAbilityDisconnectDone(ElementName elementName, int resultCode) { 
  39.         //發(fā)個(gè)通知,Service 斷開連接了,主動(dòng)斷開不會(huì)執(zhí)行,關(guān)閉服務(wù)端會(huì)執(zhí)行 
  40.         eventHandler.sendEvent(EVENT_ABILITY_DISCONNECT_DONE); 
  41.     } 
  42. }; 

 2.前臺(tái)Service的使用方法

a.權(quán)限聲明:

  1. "reqPermissions": [ 
  2.       { 
  3.         "name""ohos.permission.KEEP_BACKGROUND_RUNNING" 
  4.       }, 
  5.       ... 
  6.     ] 

b.設(shè)置通知欄內(nèi)容,然后,

  • 在onStart方法調(diào)用keepBackgroundRunning方法在后臺(tái)保留此服務(wù)能力并顯示通知欄。
  • 在onStop方法調(diào)用cancelBackgroundRunning()方法取消此功能的后臺(tái)運(yùn)行以釋放系統(tǒng)內(nèi)存。
  1. //通知ID 
  2. private static final int NOTIFICATION_ID = 0XD0000002; 
  3.  
  4. @Override 
  5. protected void onStart(Intent intent) { 
  6.     //調(diào)用方法 
  7.     startForeground(); 
  8.     super.onStart(intent); 
  9.  
  10. @Override 
  11. protected void onStop() { 
  12.     super.onStop(); 
  13.     //取消此功能的后臺(tái)運(yùn)行以釋放系統(tǒng)內(nèi)存。 
  14.     cancelBackgroundRunning(); 
  15.  
  16.  
  17. /** 
  18.  * 在后臺(tái)保留此服務(wù)能力并顯示通知欄。 
  19.  */ 
  20. private void startForeground() { 
  21.     HiLog.info(LABEL_LOG, "startForeground"); 
  22.  
  23.     //任務(wù)欄顯示通知 
  24.     NotificationRequest request = new NotificationRequest(NOTIFICATION_ID).setTapDismissed(true); 
  25.     // 
  26.     NotificationRequest.NotificationNormalContent content = new NotificationRequest.NotificationNormalContent(); 
  27.  
  28.     content.setTitle("SD card存儲(chǔ)卡已意外移除").setText("請(qǐng)先卸載存儲(chǔ)卡,再將其移除,以防數(shù)據(jù)丟失"); 
  29.     content.setAdditionalText("21分鐘前"); 
  30.     //設(shè)置通知欄內(nèi)容 
  31.     NotificationRequest.NotificationContent notificationContent = new NotificationRequest.NotificationContent(content); 
  32.     request.setContent(notificationContent); 
  33.  
  34.     //在后臺(tái)保留此服務(wù)能力并顯示通知欄。 
  35.     keepBackgroundRunning(NOTIFICATION_ID, request); 
  36.  

3.EventHandle事件處理的使用方法

EventHandler 將事件或 Runnable 任務(wù)傳遞到線程的事件隊(duì)列,并在事件或任務(wù)從事件隊(duì)列中出來時(shí)執(zhí)行。

您可以使用 EventHandler 在不同線程之間調(diào)度和處理事件和 Runnable 對(duì)象,并在一定的時(shí)間間隔內(nèi)安排要處理的事件或 Runnable 對(duì)象。您可以使用此類中提供的方法發(fā)送同步或異步事件、延遲事件處理以及設(shè)置事件優(yōu)先級(jí)。

  1. //定義事件ID 
  2. private static final int EVENT_ABILITY_CONNECT_DONE = 0x1000001; 
  3. private static final int EVENT_ABILITY_DISCONNECT_DONE = 0x1000002; 
  4.  
  5.  
  6. private EventHandler eventHandler = new EventHandler(EventRunner.current()) { 
  7.         @Override 
  8.         protected void processEvent(InnerEvent event) { 
  9.             switch (event.eventId) { 
  10.                 case EVENT_ABILITY_CONNECT_DONE: 
  11.                     showTips(MainAbilitySlice.this, "Service connect succeeded"); 
  12.                     break; 
  13.                 case EVENT_ABILITY_DISCONNECT_DONE: 
  14.                     showTips(MainAbilitySlice.this, "Service disconnect succeeded"); 
  15.                     break; 
  16.                 default
  17.                     break; 
  18.             } 
  19.         } 
  20.     }; 
  21.  
  22.  
  23. //發(fā)個(gè)通知,Service 連接成功了 
  24. eventHandler.sendEvent(EVENT_ABILITY_CONNECT_DONE); 

效果展示

前臺(tái)ServiceIPC/RPC調(diào)用

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載

原文鏈接:https://harmonyos.51cto.com/posts/4776

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-08-17 10:20:14

鴻蒙HarmonyOS應(yīng)用

2022-05-20 10:56:54

AbilityeTS FA調(diào)用

2021-09-15 14:55:49

鴻蒙HarmonyOS應(yīng)用

2020-11-05 10:05:25

App

2021-09-17 14:43:54

鴻蒙HarmonyOS應(yīng)用

2021-09-24 09:25:01

鴻蒙HarmonyOS應(yīng)用

2021-11-23 09:58:35

鴻蒙HarmonyOS應(yīng)用

2022-05-19 15:33:42

JS通信接口鴻蒙

2021-09-22 09:42:41

鴻蒙HarmonyOS應(yīng)用

2021-11-02 10:10:49

鴻蒙HarmonyOS應(yīng)用

2022-08-05 19:22:27

Service模板鴻蒙

2021-07-29 14:03:35

鴻蒙HarmonyOS應(yīng)用

2021-06-16 15:18:03

鴻蒙HarmonyOS應(yīng)用

2021-01-06 10:59:14

鴻蒙HarmonyOSPage Abilit

2021-12-10 15:06:56

鴻蒙HarmonyOS應(yīng)用

2021-12-02 10:11:44

鴻蒙HarmonyOS應(yīng)用

2021-11-30 14:51:11

鴻蒙HarmonyOS應(yīng)用

2022-06-06 11:06:04

遠(yuǎn)程服務(wù)鴻蒙

2021-08-24 15:13:06

鴻蒙HarmonyOS應(yīng)用

2021-06-23 15:48:08

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)