精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS 分布式新聞分享

系統 分布式 OpenHarmony
本篇Codelab中我們介紹了應用的主頁面和詳情頁,在主頁面可以通過頂部的新聞類型切換不同類別的新聞,同時下面整個新聞列表項也會跟隨切換。

[[412557]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

1. 介紹

HarmonyOS支持應用以Ability為單位進行部署,Ability可以分為FA(Feature Ability)和PA(Particle Ability)兩種類型,本篇Codelab將會使用到Page Ability以及Service Ability來進行開發,其中Page Ability是FA唯一支持的模板,用于提供與用戶交互的能力,Service Ability是PA(Particle Ability)的一種,用于提供后臺運行任務的能力。除此之外,您還將使用到HarmonyOS中的常用控件如:ListContainer,Image等,以及跨設備拉起FA的能力來共同實現一個基于分布式的HarmonyOS簡易新聞客戶端。

最終效果預覽

我們最終會構建一個簡易的HarmonyOS新聞客戶端。應用包含兩級頁面,分別是主頁面和詳情頁面,兩個頁面都展示了豐富的HarmonyOS組件,其中詳情頁的實現邏輯中還展示了如何通過調用相應接口,實現跨設備拉起FA。本篇Codelab我們將會一起完成這個客戶端,其中包括:

1.頂部ListContainer以及新聞列表ListContainer

2.每條新聞的文本框以及圖像

3.布局及頁面跳轉

4.設備發現以及跨設備拉起FA

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

2. 搭建HarmonyOS環境

安裝DevEco Studio,詳情請參考DevEco Studio下載。

設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:

如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作。

如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境。

說明:

如需要在手機中運行程序,則需要提前申請證書,如使用模擬器可忽略。

準備密鑰和證書請求文件

申請調試證書

你可以通過如下設備完成Codelab:

開啟開發者模式的HarmonyOS真機

DevEco Studio中的手機模擬器(模擬器暫不支持分布式調試)

3. 代碼結構解讀

本篇Codelab只對核心代碼進行講解,對于完整代碼,我們會在參考中提供下載方式,接下來我們會用一小節來講解整個工程的代碼結構:

  • INewsDemoIDL.idl:存放在entry\src\main\idl\com\huawei\newsdemo目錄下,接口中定義了tranShare方法用來實現不同設備之間的通信。
  • bean:NewsInfo封裝了新聞信息,NewsType封裝了新聞類型。
  • provider:DevicesListProvider,NewsListProvider,NewsTypeProvider,分別為設備列表,主頁新聞列表以及新聞類型的provider,主要作用為高效傳遞和使用相關數據。
  • slice:NewsListAbilitySlice,NewsDetailAbilitySlice分別為進入應用的主頁面和詳情頁面,同時里面也展現了我們大部分的邏輯實現。
  • utils:存放所有封裝好的公共方法,如CommonUtils,DialogUtils等。
  • NewsAbility:動態權限的申請以及頁面路由信息處理。
  • SharedService:供遠端連接的Service Ability。
  • manager:該目錄下的文件為INewsDemoIDL.idl在編譯時自行生成,初始生成位置為entry\build\generated\source\idl\com\huawei\newsdemo。
  • resources:存放工程使用到的資源文件,其中resources\base\layout下存放xml布局文件;resources\base\media下存放圖片資源;resources\rawfile下存放應用使用的新聞數據json文件。
  • config.json:配置文件
HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

4. 添加主頁頂部新聞類型

首先為我們的應用添加頂部新聞類型,用于切換不同類別的新聞,我們會使用到ListContainer控件,有關ListContainer的更多知識,可以參考HarmonyOS JAVA通用組件。

首先需要在布局文件中對控件進行聲明,在resources\base\layout\news_list_layout.xml布局文件中有如下代碼:

  1. <ListContainer  
  2.          
  3. ohos:id="$+id:selector_list"  
  4.          
  5. ohos:width="match_parent"  
  6.          
  7. ohos:height="40vp"  
  8.          
  9. ohos:orientation="horizontal"  
  10.          
  11. /> 

 此外我們還定義了selectorListContainer變量進行關聯,在NewsListAbilitySlice.java的initView()方法中有如下代碼:

  1. selectorListContainer = (ListContainer) findComponentById(ResourceTable.Id_selector_list); 

添加監聽

在切換不同類別新聞的時候,下面展示的新聞列表項會跟隨切換,所以我們需要為這個ListContainer設置一個監聽,在NewsListAbilitySlice.java的initListener()方法中添加:

  1. selectorListContainer.setItemClickedListener(  
  2.     (listContainer, component, position, id) -> {  
  3.                 // 設置選中后的放大效果  
  4.         setCategorizationFocus(false);  
  5.         selectText = (Text) component.findComponentById(ResourceTable.Id_news_type_text);  
  6.         setCategorizationFocus(true);  
  7.         newsDataList.clear();  
  8.         for (NewsInfo mTotalNewsData : totalNewsDataList) {  
  9.             if (selectText.getText().equals(mTotalNewsData.getType()) || id == 0) {  
  10.                 newsDataList.add(mTotalNewsData);  
  11.             }  
  12.         }  
  13.         updateListView();  
  14.     }); 

聲明NewsTypeProvider

為了方便我們的應用更加高效和便捷的使用數據,我們將應用中用到的新聞數據事先預置在resources/rawfile目錄下的兩個json文件中,此外我們還聲明了一些Provider,便于數據的獲取和傳遞,其中獲取新聞類別的NewsTypeProvider如下:

  1. @Override  
  2. public Component getComponent(int position, Component component, ComponentContainer componentContainer) {  
  3.     ViewHolder viewHolder;  
  4.     Component temp = component;  
  5.     if (temp == null) {  
  6.         temp = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_type_layout, nullfalse);  
  7.         // 將所有子組件通過ViewHolder綁定到列表項實例  
  8.         viewHolder = new ViewHolder();  
  9.         viewHolder.title = (Text) temp.findComponentById(ResourceTable.Id_news_type_text);  
  10.         component.setTag(viewHolder);  
  11.     } else {  
  12.         viewHolder = (ViewHolder) temp.getTag();  
  13.     }  
  14.     viewHolder.title.setText(mNewsTypeList.get(position).getName());  
  15.     return temp;  

我們定義了initData方法來解析json文件中的新聞數據,并將這些數據傳遞給provider,在NewsListAbilitySlice.java的initData()添加如下代碼:

  1. private void initData() {  
  2.     Gson gson = new Gson();  
  3.     List<NewsType> newsTypeList =  
  4.             gson.fromJson(  
  5.                     CommonUtils.getStringFromJsonPath(this, "entry/resources/rawfile/news_type_datas.json"),  
  6.                     new TypeToken<List<NewsType>>(){ }.getType());  
  7.     newsTypeProvider = new NewsTypeProvider(newsTypeList, this);  

添加切換效果

在切換不同類別新聞的時候,增加了一個放大效果,在setCategorizationFocus()中添加如下代碼:

  1. private void setCategorizationFocus(boolean isFocus) {  
  2.     if (selectText == null) {  
  3.         return;  
  4.     }  
  5.     if (isFocus) {  
  6.         selectText.setTextColor(  
  7.                 new Color(CommonUtils.getColor(NewsListAbilitySlice.this, ResourceTable.Color_news_type_text_on)));  
  8.         selectText.setScaleX(FOCUS_TEXT_SIZE);  
  9.         selectText.setScaleY(FRCUS_TEXT_SIZE);  
  10.     } else {  
  11.         selectText.setTextColor(  
  12.                 new Color(CommonUtils.getColor(NewsListAbilitySlice.this, ResourceTable.Color_news_type_text_off)));  
  13.         selectText.setScaleX(UNFOCUS_TEXT_SIZE);  
  14.         selectText.setScaleY(UNFOCUS_TEXT_SIZE);  
  15.     } 

所以在進行類別切換的時候,將會得到如下效果:

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

5. 添加主頁新聞列表項

新聞列表項布局

主頁面的布局除了有上方的頂部欄,還由下方的新聞列表項構成,整個新聞列表項是一個ListContainer,同樣我們先來看看在new_list_layout.xml中是如何定義的:

  1. <ListContainer  
  2.         ohos:id="$+id:news_container"  
  3.         ohos:width="match_parent"  
  4.         ohos:height="match_parent"/> 

整個新聞列表項由多個新聞item構成,每個item又由標題和圖片構成,每個item在item_news_layout.xml布局中是這樣定義的:

  1. <DirectionalLayout  
  2.     ohos:height="109.5vp"  
  3.     ohos:width="match_parent"  
  4.     ohos:orientation="horizontal"  
  5.     ohos:padding="10vp">  
  6.     <Text  
  7.         ohos:id="$+id:item_news_title"  
  8.         ohos:height="match_content"  
  9.         ohos:width="0vp"  
  10.         ohos:max_text_lines="3"  
  11.         ohos:multiple_lines="true"  
  12.         ohos:right_padding="20vp"  
  13.         ohos:text_size="18vp"  
  14.         ohos:weight="3"/>  
  15.     <Image  
  16.         ohos:id="$+id:item_news_image"  
  17.         ohos:height="match_parent"  
  18.         ohos:width="0vp"  
  19.         ohos:scale_mode="stretch"  
  20.         ohos:weight="2"/>  
  21. </DirectionalLayout> 

聲明NewsListProvider

和頂部新聞類型一樣,每個新聞item中的title和image也是利用provider傳遞的,在NewsListProvider.java中有如下代碼:

  1. @Override  
  2. public Component getComponent(int position, Component component, ComponentContainer componentContainer) {  
  3.     ViewHolder viewHolder;  
  4.     Component temp = component;  
  5.     if (temp == null) {  
  6.         component = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_layout, nullfalse);  
  7.         // 將所有子組件通過ViewHolder綁定到列表項實例  
  8.         viewHolder = new ViewHolder();  
  9.         viewHolder.title = (Text) temp.findComponentById(ResourceTable.Id_item_news_title);  
  10.         viewHolder.image = (Image) temp.findComponentById(ResourceTable.Id_item_news_image);  
  11.         temp.setTag(viewHolder);  
  12.     } else {  
  13.         viewHolder = (ViewHolder) temp.getTag();  
  14.     }  
  15.     viewHolder.title.setText(newsInfoList.get(i).getTitle());  
  16.     viewHolder.image.setPixelMap(CommonUtils.getPixelMapFromPath(context, newsInfoList.get(i).getImgUrl()));  
  17.     return temp;  

同樣,newsListProvider的數據也是在initData的時候進行賦值的,所以需要在NewsListAbilitySlice的initData()中添加:

  1. totalNewsDataList =  
  2.         gson.fromJson(  
  3.                 CommonUtils.getStringFromJsonPath(this, "entry/resources/rawfile/news_datas.json"),  
  4.                 new TypeToken<List<NewsInfo>>(){ }.getType());  
  5. newsDataList = new ArrayList<>();  
  6. newsDataList.addAll(totalNewsDataList);  
  7. newsListProvider = new NewsListProvider(newsDataList, this); 

到此我們完成了數據的加載和解析,接下來是為item添加點擊事件。

添加監聽

我們點擊某個具體新聞item的時,應用會跳轉到全局詳情頁面,這時要為新聞item添加一個監聽,在NewsListAbilitySlice.java的initListener()中添加:

  1. newsListContainer.setItemClickedListener(  
  2.         (listContainer, component, position, id) -> {  
  3.             Intent intent = new Intent();  
  4.             Operation operation =  
  5.                     new Intent.OperationBuilder()  
  6.                             .withBundleName(getBundleName())  
  7.                             .withAbilityName(NewsAbility.class.getName())  
  8.                             .withAction("action.detail")  
  9.                             .build();  
  10.             intent.setOperation(operation);  
  11.             intent.setParam(NewsDetailAbilitySlice.INTENT_TITLE, newsDataList.get(position).getTitle());  
  12.             intent.setParam(NewsDetailAbilitySlice.INTENT_READ, newsDataList.get(position).getReads());  
  13.             intent.setParam(NewsDetailAbilitySlice.INTENT_LIKE, newsDataList.get(position).getLikes());  
  14.             intent.setParam(NewsDetailAbilitySlice.INTENT_CONTENT, newsDataList.get(position).getContent());  
  15.             intent.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, newsDataList.get(position).getImgUrl());  
  16.             startAbility(intent);  
  17.         }); 

這里的startAbility()是我們頁面跳轉的關鍵方法,參數intent里面存放了要跳轉的bundle name,ability name,詳情頁面的title,imgurl等重要參數。

6. 詳情頁頁面布局

新聞詳情頁的布局相比于新聞主頁稍微有些復雜,整體由DependentLayout布局嵌套DirectionalLayout布局、ScrollView和其他控件構成,我們把整體頁面分為頂部,底部,和中部。并在resources\base\layout\new_detail_laylout.xml中實現詳情頁的布局。

頂部

頂部是由DirectionalLayout加上Text組件構成,分別對應了左側的圖標和NewsDemo以及右側的reads和likes,實現效果及布局部分代碼如下:

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區
  1. <DirectionalLayout  
  2.         ohos:width="match_parent"  
  3.         ohos:height="match_content"  
  4.         ohos:alignment="vertical_center"  
  5.         ohos:orientation="horizontal">  
  6.     <Text  
  7.             ohos:id="$+id:title_icon"  
  8.             ohos:width="match_content"  
  9.             ohos:height="match_content"  
  10.             ohos:weight="1"  
  11.             ohos:text="NewsDemo"  
  12.             ohos:text_size="20fp"/>  
  13.     <Text  
  14.             ohos:id="$+id:read_num"  
  15.             ohos:width="match_content"  
  16.             ohos:height="match_content"  
  17.             ohos:text_size="10fp"  
  18.             ohos:right_margin="10vp"/>  
  19.     <Text  
  20.             ohos:id="$+id:like_num"  
  21.             ohos:width="match_content"  
  22.             ohos:height="match_content"  
  23.             ohos:text_size="10fp"/>  
  24. </DirectionalLayout> 

中部

頁面的中間部分由新聞標題Text,縮略圖Image,新聞內容Text構成,實現效果及布局部分代碼如下:

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區
  1. <Text  
  2.         ohos:id="$+id:title_text"  
  3.         ohos:width="match_parent"  
  4.         ohos:height="match_content"  
  5.         ohos:text_size="18fp"  
  6.         ohos:max_text_lines="4"  
  7.         ohos:multiple_lines="true"  
  8.         ohos:text_color="#000000"  
  9.         ohos:top_margin="10vp"/>  
  10. <Image  
  11.     ohos:id="$+id:image_content"  
  12.     ohos:width="match_parent"  
  13.     ohos:scale_mode="stretch"  
  14.     ohos:height="300vp"  
  15.     ohos:top_margin="10vp"/>  
  16. <Text  
  17.         ohos:id="$+id:title_content"  
  18.         ohos:width="match_parent"  
  19.         ohos:height="match_content"  
  20.         ohos:multiple_lines="true"  
  21.         ohos:text_color="#708090"  
  22.         ohos:text_size="16vp"  
  23.         ohos:text_alignment="center_horizontal"  
  24.         ohos:top_margin="5vp"/> 

底部

頁面的底部由DirectionalLayout加上TextField和Image控件構成,對應輸入評論和幾個按鈕,具體效果和部分布局代碼如下:

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區
  1. <DirectionalLayout  
  2.         ohos:id="$+id:bottom_layout"  
  3.         ohos:align_parent_bottom="true"  
  4.         ohos:width="match_parent"  
  5.         ohos:height="50vp"  
  6.         ohos:orientation="horizontal"  
  7.         ohos:background_element="#ffffff"  
  8.         ohos:alignment="vertical_center"  
  9.         ohos:left_padding="20vp"  
  10.         ohos:right_padding="20vp"  
  11.         >  
  12.     <TextField  
  13.             ohos:id="$+id:text_file"  
  14.             ohos:width="160vp"  
  15.             ohos:height="30vp"  
  16.             ohos:left_padding="5vp"  
  17.             ohos:right_padding="10vp"  
  18.             ohos:text_alignment="vertical_center"  
  19.             ohos:text_size="15vp"  
  20.             ohos:hint="Enter a comment."  
  21.             ohos:background_element="$graphic:corner_bg_comment"/>  
  22.     <Image  
  23.             ohos:id="$+id:button1"  
  24.             ohos:width="20vp"  
  25.             ohos:height="20vp"  
  26.             ohos:image_src="$media:message_icon"  
  27.             ohos:scale_mode="stretch"  
  28.             ohos:left_margin="20vp"/>  
  29.     <Image  
  30.             ohos:id="$+id:button2"  
  31.             ohos:width="20vp"  
  32.             ohos:height="20vp"  
  33.             ohos:image_src="$media:collect_icon"  
  34.             ohos:scale_mode="stretch"  
  35.             ohos:left_margin="20vp"/>  
  36.     <Image  
  37.             ohos:id="$+id:button3"  
  38.             ohos:width="20vp"  
  39.             ohos:height="20vp"  
  40.             ohos:image_src="$media:like_icon"  
  41.             ohos:scale_mode="stretch"  
  42.             ohos:left_margin="20vp"/>  
  43.     <Image  
  44.             ohos:id="$+id:button4"  
  45.             ohos:width="20vp"  
  46.             ohos:height="20vp"  
  47.             ohos:image_src="$media:share_icon"  
  48.             ohos:scale_mode="stretch"  
  49.             ohos:left_margin="20vp"/>  
  50. </DirectionalLayout> 

7. 詳情頁數據初始化

接受來自NewsListAbilitySlice頁面的數據

我們在添加新聞列表項那一節中說明了新聞頁面的title,imgurl等重要參數是如何存放的,現在我們一起看下在詳情頁是如何獲取的。在NewsDetailAbilitySlice.java的onStart()中有如下代碼:

  1. public void onStart(Intent intent) {  
  2.     super.onStart(intent);  
  3.     super.setUIContent(ResourceTable.Layout_news_detail_layout);  
  4.     reads = intent.getStringParam(INTENT_READ);  
  5.     likes = intent.getStringParam(INTENT_LIKE);  
  6.     title = intent.getStringParam(INTENT_TITLE);  
  7.     content = intent.getStringParam(INTENT_CONTENT);  
  8.     image = intent.getStringParam(INTENT_IMAGE);  

之前存放在intent中的參數,現在在onStart()中逐一進行取出。

布局和控件的初始化

除了需要聲明xml來實現布局以外,還需要在NewsDetailAbilitySlice.java的onStart()中添加initView()方法進行初始化:

  1. private void initView() {  
  2.     parentLayout = (DependentLayout) findComponentById(ResourceTable.Id_parent_layout);  
  3.     commentFocus = (TextField) findComponentById(ResourceTable.Id_text_file);  
  4.     iconShared = (Image) findComponentById(ResourceTable.Id_button4);  
  5.     Text newsRead = (Text) findComponentById(ResourceTable.Id_read_num);  
  6.     Text newsLike = (Text) findComponentById(ResourceTable.Id_like_num);  
  7.     Text newsTitle = (Text) findComponentById(ResourceTable.Id_title_text);  
  8.     Text newsContent = (Text) findComponentById(ResourceTable.Id_title_content);  
  9.     Image newsImage = (Image) findComponentById(ResourceTable.Id_image_content);  
  10.     newsRead.setText("reads: " + reads);  
  11.     newsLike.setText("likes: " + likes);  
  12.     newsTitle.setText("Original title: " + title);  
  13.     newsContent.setText(content);  
  14.     newsImage.setPixelMap(CommonUtils.getPixelMapFromPath(this, image));  

添加監聽

我們在點擊頁面底部右下角的分享按鈕的時候,會進行設備發現操作,并將發現的設備列表進行展示,此處我們設置了兩個監聽,在NewsDetailAbilitySlice.java的onStart()中添加initListener():

  1. private void initListener() {  
  2.     parentLayout.setTouchEventListener(  
  3.             (component, touchEvent) -> {  
  4.                 if (commentFocus.hasFocus()) {  
  5.                     commentFocus.clearFocus();  
  6.                 }  
  7.                 return true;  
  8.             });  
  9.     iconShared.setClickedListener(  
  10.             v -> {  
  11.                 initDevices();  
  12.                 showDeviceList();  
  13.             });  

parentLayout的監聽事件用來監聽觸控焦點是否在設備列表Dialog上,iconShared的監聽事件用來監聽分享按鈕被是否被點擊。

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

8. 設備發現

上一節我們了解到當分享按鈕被點擊的時候會觸發監聽,進行設備發現,那么觸發監聽后,是如何進行設備發現的?

在initListener()中有兩個有關設備發現的方法:initDevices()和showDeviceList()。initDevices()方法調用接口實現設備發現,并將發現到的設備存儲到List中,需要如下代碼實現:

  1. private void initDevices() {  
  2.     if (devices.size() > 0) {  
  3.         devices.clear();  
  4.     }  
  5.     List<DeviceInfo> deviceInfos =  
  6.             DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);  
  7.     devices.addAll(deviceInfos);  

發現到的設備,通過Dialog進行顯示,您可以選擇一個目標設備進行跨設備流轉,需要在NewsDetailAbilitySlice.java的showDeviceList()中添加如下代碼:

  1. private void showDeviceList() {  
  2.     // 設備列表dialog  
  3.     dialog = new CommonDialog(NewsDetailAbilitySlice.this);  
  4.     dialog.setAutoClosable(true);  
  5.     dialog.setTitleText("HarmonyOS devices");  
  6.     dialog.setSize(DIALOG_SIZE_WIDTH, DIALOG_SIZE_HEIGHT);  
  7.     ListContainer devicesListContainer = new ListContainer(getContext());  
  8.     DevicesListAdapter devicesListProvider = new DevicesListProvider(devices, this);  
  9.     devicesListContainer.setItemProvider(devicesListAdapter);  
  10.     devicesListContainer.setItemClickedListener(  
  11.             (listContainer, component, position, id) -> {  
  12.                 dialog.destroy()  
  13.                 // 跨設備拉起FA  
  14.                 startAbilityFA(devices.get(position).getDeviceId());  
  15.             });  
  16.     devicesListAdapter.notifyDataChanged();  
  17.     dialog.setContentCustomComponent(devicesListContainer);  
  18.     dialog.show();  
HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

當我們選擇某個設備的時候,被選擇的設備會拉起指定的FA頁面,被拉起的FA頁面會和發起請求的那一端保持一致。

9. 跨設備協同

連接Service Ability

那么跨設備協同又是如何實現的?發現的設備列表也是通過一個ListContainer來展示的,設備列表也有對應的xml和變量聲明,這里不再贅述。對于每一個設備item,我們添加了監聽用來進行跨設備拉起FA,需要在NewsDetailAbilitySlice的showDeviceList()中添加startAlibityFA()方法,具體代碼如下:

  1. private void startAbilityFA(StringdevicesId) {  
  2.     Intent intent = new Intent();  
  3.     Operation operation =  
  4.             new Intent.OperationBuilder()  
  5.                     .withDeviceId(devicesId)  
  6.                     .withBundleName(getBundleName())  
  7.                     .withAbilityName(SharedService.class.getName())  
  8.                     // 該FLAG用于分布式跨設備場景  
  9.                     .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)  
  10.                     .build();  
  11.     intent.setOperation(operation);  
  12.     boolean connectFlag =  
  13.             // 連接遠端 Service Ability  
  14.             connectAbility(  
  15.                     intent,  
  16.                     new IAbilityConnection() {  
  17.                         @Override  
  18.                         public void onAbilityConnectDone(  
  19.                                 ElementName elementName, IRemoteObject iRemoteObject, int i) {  
  20.                             INewsDemoIDL sharedManager = NewsDemoIDLStub.asInterface(iRemoteObject);  
  21.                             try {  
  22.                                 sharedManager.tranShare(title, reads, likes, content, image);  
  23.                             } catch (RemoteException e) {  
  24.                                 LogUtil.i(TAG, "connect successful,but have remote exception");  
  25.                             }  
  26.                         }  
  27.                         @Override  
  28.                         public void onAbilityDisconnectDone(ElementName elementName, int i) {  
  29.                             disconnectAbility(this);  
  30.                         }  
  31.                     });  
  32.     DialogUtil.toast(  
  33.             this, connectFlag ? "Sharing succeeded!" : "Sharing failed. Please try again later.", WAIT_TIME);  

方法中我們為intent設置了bundlename,abilityname,devicesId等參數,通過connectAbility方法實現與遠端Service Ability進行連接,連接成功后,會在onAbilityConnectDone中調用tranShare方法將對端需要的數據傳遞過去。

遠端Service Ability的定義

本端通過connectAbility連接遠端的Service Ability,那么遠端的Service Ability又是如何定義的?需要在SharedService.java中添加tranShare()方法,代碼如下:

  1. public void tranShare(String title, String reads, String likes, String content, String image) {  
  2.     Intent intent = new Intent();  
  3.     Operation operation =  
  4.             new Intent.OperationBuilder()  
  5.                     .withBundleName(getBundleName())  
  6.                     .withAbilityName(NewsAbility.class.getName())  
  7.                     .withAction("action.detail")  
  8.                     .build();  
  9.     intent.setOperation(operation);  
  10.     intent.setParam(NewsDetailAbilitySlice.INTENT_TITLE, title);  
  11.     intent.setParam(NewsDetailAbilitySlice.INTENT_READ, reads);  
  12.     intent.setParam(NewsDetailAbilitySlice.INTENT_LIKE, likes);  
  13.     intent.setParam(NewsDetailAbilitySlice.INTENT_CONTENT, content);  
  14.     intent.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, image);  
  15.     startAbility(intent); 

說明:

以上代碼僅demo演示參考使用

這樣便通過startAbility方法拉起了指定的FA,并將intent攜帶的參數一并傳遞過去。

—-結束

當前實現遠程啟動FA,需要至少兩個設備處于同一個分布式網絡中,可以通過操作如下配置實現:

所有設備接入同一網絡,

所有設備登陸相同華為賬號,

所有設備上開啟"設置->更多連接->多設備協同 "

10. 回顧和總結

在本篇Codelab中我們介紹了應用的主頁面和詳情頁,在主頁面可以通過頂部的新聞類型切換不同類別的新聞,同時下面整個新聞列表項也會跟隨切換。點擊下方某個具體新聞item的時候,會進行跳轉到新聞詳情頁面;在新聞詳情頁可以上下滑動查看新聞,并且點擊下方分享按鈕可以實現FA的跨設備協同,整體效果如下圖1和圖2:

HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區
HarmonyOS 分布式新聞分享-鴻蒙HarmonyOS技術社區

11. 恭喜你

目前你已經成功完成了Codelab并且學到了:

如何使用ListContainer等常用控件

如何進行布局編寫及頁面跳轉

如何進行設備發現以及FA的跨設備協同

12. 參考

gitee源碼

github源碼

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2023-01-13 07:39:07

2020-11-06 12:12:35

HarmonyOS

2021-05-28 09:52:00

鴻蒙HarmonyOS應用

2019-10-10 09:16:34

Zookeeper架構分布式

2017-09-01 05:35:58

分布式計算存儲

2023-05-29 14:07:00

Zuul網關系統

2019-06-19 15:40:06

分布式鎖RedisJava

2021-07-22 10:20:21

鴻蒙HarmonyOS應用

2013-03-01 09:55:28

負載均衡分布式存儲集群

2017-10-27 08:40:44

分布式存儲剪枝系統

2010-06-03 18:54:57

Hadoop

2023-10-26 18:10:43

分布式并行技術系統

2020-09-29 19:20:05

鴻蒙

2018-07-17 08:14:22

分布式分布式鎖方位

2024-03-01 09:53:34

2022-06-27 08:21:05

Seata分布式事務微服務

2023-05-12 08:23:03

分布式系統網絡

2018-06-20 10:42:47

分布式系統CAP

2023-09-28 08:39:23

分布式鎖Redis

2011-03-28 13:39:45

nagios分布式
點贊
收藏

51CTO技術棧公眾號

成人三级黄色免费网站| 高潮无码精品色欲av午夜福利| 日韩精品视频在线看| 午夜视频在线观看一区| 欧美日韩国产不卡在线看| 在线观看视频二区| 亚洲国产三级| 色婷婷av一区二区三区久久| 性活交片大全免费看| 粉嫩一区二区三区| 亚洲一区二区三区影院| 欧美一区二区三区精美影视| 国产精品久久久久久久久久久久久久久久久久 | 国产盗摄——sm在线视频| 久久久精品中文字幕麻豆发布| 91久久中文字幕| www.com国产| 欧美久久成人| 在线观看日韩www视频免费| av漫画在线观看| 国产黄色一区| 欧美日韩在线一区| 999久久欧美人妻一区二区| 久蕉在线视频| av电影天堂一区二区在线观看| 国产精品亚洲第一区| 久久久久久久久久久久久av| 午夜精品av| 中文字幕日韩视频| 北岛玲一区二区| 一区二区三区免费在线看| 欧美午夜精品久久久久久超碰| 成人性免费视频| 超碰在线无需免费| 中文字幕国产精品一区二区| 国产亚洲欧美一区二区| www.好吊色| 精品一区二区三区的国产在线播放| 欧洲午夜精品久久久| 国产对白videos麻豆高潮| 国产精品久久久久久| 国产香蕉97碰碰久久人人| av网页在线观看| 国产成人av毛片| 日韩精品在线一区二区| 亚洲一二区在线观看| 成人av色网站| 欧美视频日韩视频在线观看| 国产精品亚洲a| 第84页国产精品| 日韩欧美国产一区二区| 国产黄色一级网站| 成人性生活av| 欧美在线视频全部完| 午夜精品在线免费观看| 一区在线影院| 欧美日韩精品一区二区三区蜜桃| 亚洲成人av免费看| 国产a亚洲精品| 欧美日韩一区不卡| 污视频网址在线观看| 成人在线视频免费| 欧美高清dvd| 国产福利精品一区二区三区| 999精品视频在线观看| 91精品国产综合久久久蜜臀粉嫩| 99久久99精品| 亚洲日本va午夜在线电影| 日韩午夜激情免费电影| 国产在线观看免费播放| 国内精品麻豆美女在线播放视频| 国产视频丨精品|在线观看| 免费在线观看成年人视频| 国际精品欧美精品| 丝袜一区二区三区| 青青草偷拍视频| 一本一本久久| 国产精品久久久久77777| 一区二区三区免费在线| 成人午夜电影小说| 欧美少妇一区| 国产精品刘玥久久一区| 亚洲一区在线观看视频| 欧洲黄色一级视频| 欧美成人毛片| 精品久久久久av影院| 亚洲成人网在线播放| 色综合狠狠操| 992tv在线成人免费观看| 欧产日产国产69| 久久99在线观看| 国产欧美综合精品一区二区| 搞黄视频在线观看| 亚洲精品国产一区二区精华液 | 国产精品免费视频一区二区| 免费在线黄色网址| 亚洲精品福利视频网站| 欧美 日韩 国产一区| 国产精品日本一区二区不卡视频 | 91手机在线播放| 男人天堂亚洲二区| 亚洲丝袜美腿综合| 免费黄色特级片| 亚洲精品一区二区三区中文字幕 | 高清不卡日本v二区在线| 国产免费视频在线| 亚洲一区二区三区四区五区黄 | 高清无码视频直接看| 日本久久免费| 精品久久久久久久人人人人传媒| 日韩视频在线观看免费视频| 欧美欧美全黄| 成人黄色av免费在线观看| 日本啊v在线| 一级做a爱片久久| 蜜臀一区二区三区精品免费视频| 婷婷五月色综合香五月| 九九热在线精品视频| 成人av网站在线播放| 成人丝袜18视频在线观看| 一本一道久久a久久综合精品| 麻豆mv在线看| 亚洲成人久久一区| 侵犯稚嫩小箩莉h文系列小说| 日韩高清中文字幕一区| 精品蜜桃传媒| 黑人极品ⅴideos精品欧美棵| 欧美日韩久久久| 亚洲av无码国产精品麻豆天美| 精品成人在线| 国产66精品久久久久999小说| 欧美激情午夜| 在线视频观看一区| a毛片毛片av永久免费| 99精品国产在热久久下载| 国产高清自拍一区| 18+激情视频在线| 欧美一区永久视频免费观看| 日韩精品久久久久久久的张开腿让 | jlzzjlzz国产精品久久| 欧美日韩dvd| 亚洲1区在线观看| 久久九九有精品国产23| 又色又爽又黄无遮挡的免费视频| 国产午夜精品久久久久久久 | 亚洲国产精品久久久久婷婷老年| 亚洲人成午夜免电影费观看| 亚洲精品电影在线| 男人的天堂一区二区| 成人h动漫精品| 欧美 日韩 国产 高清| 国产乱论精品| 97久久精品人人澡人人爽缅北| 亚洲男人天堂久久| 亚洲一二三四在线| 荫蒂被男人添免费视频| 亚洲久久成人| 久久综合给合久久狠狠色| 蜜桃视频www网站在线观看| 精品在线欧美视频| 99re这里只有精品在线| 欧美国产激情一区二区三区蜜月 | 国产成人久久精品麻豆二区| 色偷偷888欧美精品久久久| 国产又黄又大又粗的视频| 亚洲人妖av一区二区| 国产成人精品一区二区在线小狼| 国产一区二区三区四区三区四| 岛国视频一区免费观看| 三妻四妾完整版在线观看电视剧 | 日韩精品电影在线观看| 水蜜桃一区二区三区| 日韩精品第二页| 欧美极品少妇与黑人| 亚洲欧美日韩免费| 欧美影院一区二区| 国产高潮国产高潮久久久91| 丁香婷婷深情五月亚洲| 成人免费观看毛片| 欧美国产偷国产精品三区| 亚洲最大激情中文字幕| 理论不卡电影大全神| 中文字幕亚洲图片| 丰满人妻一区二区三区无码av | 国产精品无人区| 99久久综合网| 视频一区视频二区中文| 亚洲高潮无码久久| 亚洲精品国产动漫| 成人亚洲欧美一区二区三区| 搞黄网站在线看| 亚洲最大在线视频| 亚洲精品人妻无码| 欧美专区亚洲专区| 国产真实乱偷精品视频| 国产欧美va欧美不卡在线| 中文字幕 欧美 日韩| 日日嗨av一区二区三区四区| ijzzijzzij亚洲大全| 亚洲ab电影| 91在线观看免费网站| xxxxxx欧美| 欧美大码xxxx| 国产在线一二三| 精品欧美久久久| 这里只有精品999| 精品福利在线视频| 精品亚洲国产视频| 小早川怜子久久精品中文字幕| 捆绑调教一区二区三区| 老太脱裤子让老头玩xxxxx| 日韩片欧美片| 欧美午夜欧美| 国产精品白丝av嫩草影院| 成人h视频在线| 精品91久久| 色综合久综合久久综合久鬼88| 成人高清网站| 日韩精品极品毛片系列视频| www.黄色小说.com| 精品婷婷伊人一区三区三| 亚洲精品视频在线观看免费视频| 中文字幕一区av| 亚洲一区二区自偷自拍 | 91亚洲国产成人精品性色| 男人最爱成人网| 欧美激情videoshd| av网站大全在线| 中文字幕精品视频| 国产最新视频在线| 精品视频在线导航| 日本毛片在线观看| 精品国产百合女同互慰| 国产99999| 日韩欧美一区二区久久婷婷| 一二三四区视频| 日本韩国欧美在线| 国产字幕在线观看| 色婷婷精品久久二区二区蜜臂av| 成人精品在线看| 五月激情综合婷婷| 日韩福利片在线观看| 亚洲一区二区三区国产| 久久这里只有精品国产| 亚洲影院久久精品| 国产一级特黄a高潮片| 一个色综合网站| 久久免费公开视频| 亚洲成a人v欧美综合天堂| 国产一卡二卡在线| 懂色aⅴ精品一区二区三区蜜月| 日韩欧美亚洲一区二区三区| 精品欧美一区二区三区| 毛片在线免费视频| 色噜噜久久综合| 中文字幕第2页| 欧美人牲a欧美精品| 国产免费的av| 精品国产一区a| 天天综合天天色| 亚洲欧美中文日韩在线v日本| 免费在线高清av| 综合网中文字幕| 成人video亚洲精品| 韩日精品中文字幕| 亚洲欧美电影| 成人黄色av网站| www国产精品| 欧美日韩电影一区二区三区| 日韩大片在线播放| 91大学生片黄在线观看| 伊人蜜桃色噜噜激情综合| 各处沟厕大尺度偷拍女厕嘘嘘 | 色综合五月婷婷| 成人网在线播放| 级毛片内射视频| 亚洲欧美色一区| 成年人免费高清视频| 欧美性色黄大片| 亚洲精品国产片| 亚洲男人天天操| av大片在线| 青青草成人在线| 高清精品久久| 欧美激情www| 亚洲精品极品少妇16p| 毛片在线视频播放| 久久精品国产精品亚洲精品| 一区二区三区四区影院| 日本一区二区三区国色天香 | 1024国产在线| 国内伊人久久久久久网站视频| 高清av一区| 国产日韩一区二区三区| 欧美岛国激情| 北条麻妃69av| 国产乱人伦偷精品视频不卡| 国产精品成人一区二区三区电影毛片| 亚洲欧洲一区二区三区| 亚洲男人的天堂在线视频| 8x8x8国产精品| 欧美精品久久久久久久久久丰满| 久久视频在线免费观看| 深夜成人福利| 国产精品我不卡| 久久久久久久久国产一区| 91视频 -- 69xx| 高清国产一区二区三区| 国产又黄又粗又猛又爽的| 调教+趴+乳夹+国产+精品| 精品久久久久成人码免费动漫| 国产亚洲欧洲在线| www视频在线观看| 7777精品久久久大香线蕉小说| 欧美伦理在线视频| 久久久999视频| 成人午夜又粗又硬又大| av激情在线观看| 日本道色综合久久| 天堂av在线播放| 久久久久久久久久国产| 蜜桃在线一区| 日本丰满少妇黄大片在线观看| 视频一区免费在线观看| 欧美老熟妇乱大交xxxxx| 亚洲大片在线观看| 国产自产一区二区| 欧美激情精品久久久久| 日韩精品中文字幕一区二区 | 在线播放欧美女士性生活| 成年人视频免费在线观看| 国产999在线| 亚洲区小说区图片区qvod按摩| 亚洲熟妇无码一区二区三区导航| 国产乱色国产精品免费视频| 丝袜美腿小色网| 欧美一区二区精品久久911| 国产调教视频在线观看| 成人国产精品久久久久久亚洲| 青青草91久久久久久久久| 黄色国产小视频| 欧美国产精品专区| 亚洲视频一区二区三区四区| 中文字幕av一区二区| 日韩毛片免费看| 国产福利片一区二区| 精品一区二区三区在线视频| 国产一区在线观看免费| 欧美日韩国产免费一区二区| 五月香视频在线观看| 国产一区二区丝袜| 亚洲电影影音先锋| 国产裸体视频网站| 午夜精品影院在线观看| 凸凹人妻人人澡人人添| 国产91久久婷婷一区二区| 欧美色图激情小说| 精品综合久久久久| 亚洲精品欧美激情| 人人妻人人澡人人爽精品日本| 久久免费视频网站| 婷婷综合一区| 日本老熟妇毛茸茸| 中文字幕日本乱码精品影院| 99久久久无码国产精品免费| 欧美高清一级大片| 天海翼亚洲一区二区三区| 日本成人在线免费视频| 国产精品久久久久久妇女6080| 国产丝袜在线视频| 911国产网站尤物在线观看| 国产免费久久| 不用播放器的免费av| 亚洲一区av在线| 深夜福利视频在线免费观看| 国产精品久久久久久久久粉嫩av | 日韩色av导航| 99国产精品久久一区二区三区| 极品美女扒开粉嫩小泬| 中文字幕乱码一区二区免费| 国内精品偷拍视频| 日本国产高清不卡| 久久精品青草| 中文字幕在线观看网址| 欧美日韩精品一区二区三区蜜桃 | 99爱精品视频| 亚洲中字在线| 成年人午夜剧场| 亚洲欧美日韩国产精品| 国产日韩一区二区三免费高清| 日韩日韩日韩日韩日韩| 国产欧美视频一区二区三区| 成人av免费播放| 国产精品吹潮在线观看| 欧美午夜免费影院| 亚洲毛片亚洲毛片亚洲毛片| 亚洲成成品网站| 中文成人在线| aa在线免费观看| 亚洲男人电影天堂|