HarmonyOS 分散ニュース共有

HarmonyOS 分散ニュース共有

[[412557]]

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

1. はじめに

HarmonyOS は、Ability 単位でのアプリケーションの展開をサポートします。アビリティはFA(フィーチャーアビリティ)とPA(パーティクルアビリティ)の2種類に分けられます。このコードラボでは、開発に Page Ability と Service Ability を使用します。 Page Ability は FA でサポートされている唯一のテンプレートであり、ユーザーと対話する機能を提供するために使用されます。サービス アビリティは PA (パーティクル アビリティ) の一種であり、バックグラウンド タスクを実行する機能を提供するために使用されます。さらに、ListContainer、Image などの HarmonyOS の共通コントロールや、デバイス間で FA をプルアップして分散型 HarmonyOS シンプル ニュース クライアントを共同で実装する機能も使用します。

最終効果のプレビュー

最終的にはシンプルな HarmonyOS ニュース クライアントを構築する予定です。アプリケーションには、メイン ページと詳細ページという 2 つのレベルのページが含まれています。どちらのページにも、豊富な HarmonyOS コンポーネントが表示されます。詳細ページの実装ロジックでは、対応するインターフェースを呼び出してデバイス間で FA を起動する方法も示されています。このコードラボでは、次の作業を含めて、このクライアントを一緒に完成させます。

1. トップリストコンテナとニュースリストコンテナ

2. 各ニュース項目のテキストボックスと画像

3. レイアウトとページジャンプ

4. デバイスの検出とデバイス間のFA


2. HarmonyOS環境を構築する

DevEco Studio をインストールします。詳細については、DevEco Studio のダウンロードを参照してください。

DevEco Studio 開発環境をセットアップします。 DevEco Studio 開発環境はネットワーク環境に依存する必要があります。ツールを正常に使用するには、ネットワークに接続する必要があります。次の 2 つの状況に応じて開発環境を構成できます。

インターネットに直接アクセスできる場合は、HarmonyOS SDK をダウンロードするだけで済みます。

ネットワークがインターネットに直接アクセスできず、プロキシ サーバー経由でアクセスする必要がある場合は、「開発環境の構成」を参照してください。

例:

プログラムを携帯電話で実行する必要がある場合は、事前に証明書を申請する必要があります。シミュレータを使用する場合はこれを無視できます。

キーと証明書要求ファイルを準備する

試運転証明書を申請する

次のデバイスを使用してコードラボを完了できます。

開発者モードをオンにした実際のHarmonyOSデバイス

DevEco Studio のモバイル エミュレータ (エミュレータは現在分散デバッグをサポートしていません)

3. コード構造の解釈

このコードラボではコアコードのみを説明します。完全なコードについては、リファレンスでダウンロード方法を提供します。次に、小さなセクションを使用して、プロジェクト全体のコード構造について説明します。

  • INewsDemoIDL.idl: entry\src\main\idl\com\huawei\newsdemo ディレクトリに保存されます。このインターフェースは、異なるデバイス間の通信を実装するための tranShare メソッドを定義します。
  • bean: NewsInfo はニュース情報をカプセル化し、NewsType はニュースの種類をカプセル化します。
  • プロバイダー: DevicesListProvider、NewsListProvider、NewsTypeProvider。それぞれデバイス リスト、ホームページ ニュース リスト、ニュース タイプのプロバイダーです。主な機能は、関連データを効率的に送信して使用することです。
  • スライス: NewsListAbilitySlice と NewsDetailAbilitySlice は、それぞれアプリケーションに入るためのメイン ページと詳細ページであり、ロジックの実装の大部分も示しています。
  • utils: CommonUtils、DialogUtils などのすべてのカプセル化されたパブリック メソッドを格納します。
  • NewsAbility: 動的な権限の適用とページルーティング情報の処理。
  • SharedService: リモート接続のサービス機能。
  • manager: このディレクトリ内のファイルは INewsDemoIDL.idl であり、コンパイル時に自動的に生成されます。初期生成場所は、entry\build\generated\source\idl\com\huawei\newsdemo です。
  • resources: プロジェクトで使用されるリソース ファイル (resources\base\layout 内の XML レイアウト ファイル、resources\base\media 内の画像リソース、resources\rawfile 内のアプリケーションで使用されるニュース データ json ファイルなど) を保存します。
  • config.json: 設定ファイル

4. ホームページの上部にニュースタイプを追加する

まず、さまざまなニュースのカテゴリを切り替えるために、アプリケーションにトップニュース タイプを追加します。 ListContainer コントロールを使用します。 ListContainer の詳細については、HarmonyOS JAVA 共通コンポーネントを参照してください。

まず、レイアウト ファイルでコントロールを宣言する必要があります。 resources\base\layout\news_list_layout.xml レイアウト ファイルには、次のコードがあります。

  1. <リストコンテナ
  2.          
  3. ohos:id= "$+id:セレクタリスト"   
  4.          
  5. ohos:width= "match_parent"   
  6.          
  7. ohos:height= "40vp"   
  8.          
  9. ohos:orientation= "水平"   
  10.          
  11. />

さらに、関連付けのために selectorListContainer 変数も定義します。 NewsListAbilitySlice.java の initView() メソッドには、次のコードがあります。

  1. セレクタリストコンテナー = (リストコンテナー) findComponentById(ResourceTable.Id_selector_list);

リスナーを追加

ニュースの異なるカテゴリを切り替えると、以下に示すニュース リスト項目もそれに応じて切り替わるので、この ListContainer のリスナーを設定し、NewsListAbilitySlice.java の initListener() メソッドに追加する必要があります。

  1. セレクタリストコンテナ.setItemClickedListener()
  2. (リストコンテナ、コンポーネント、位置、ID) -> {
  3. // 選択後の拡大効果を設定する
  4. カテゴリ化フォーカスを設定します( false );
  5. selectText = (テキスト) component.findComponentById(ResourceTable.Id_news_type_text);
  6. カテゴリ化フォーカスを設定します( true );
  7. newsDataListをクリアします。
  8. for (NewsInfo mTotalNewsData : totalNewsDataList) {
  9. if (selectText.getText().equals(mTotalNewsData.getType()) || id == 0) {
  10. newsDataList.add (mTotalNewsData) ;
  11. }
  12. }
  13. リストビューを更新します。
  14. });

NewsTypeProvider を宣言する

アプリケーションがデータをより効率的かつ便利に使用できるように、アプリケーションで使用されるニュース データを resources/rawfile ディレクトリ内の 2 つの json ファイルに事前に設定しています。さらに、データの取得と転送を容易にするために、いくつかのプロバイダーも宣言します。ニュース カテゴリを取得するための NewsTypeProvider は次のとおりです。

  1. @オーバーライド
  2. パブリックコンポーネント getComponent( int位置、 コンポーネント コンポーネント、 ComponentContainer コンポーネントコンテナー) {
  3. ビューホルダー ビューホルダー;
  4. コンポーネント温度= コンポーネント;
  5. 温度nullの場合
  6. temp = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_type_layout, null false );
  7. // ViewHolder を通じてすべてのサブコンポーネントをリスト項目インスタンスにバインドします
  8. ビューホルダー = 新しいビューホルダー();
  9. viewHolder.title = (テキスト) temp .findComponentById(ResourceTable.Id_news_type_text);
  10. コンポーネントのタグを設定します(viewHolder);
  11. }それ以外{
  12. viewHolder = (ViewHolder) temp .getTag();
  13. }
  14. viewHolder.title.setText(mNewsTypeList.get(position).getName());
  15. 戻る 温度;
  16. }

JSON ファイル内のニュース データを解析し、そのデータをプロバイダーに渡す initData メソッドを定義します。 NewsListAbilitySlice.java の initData() に次のコードを追加します。

  1. プライベートvoid initData() {
  2. Gson を新しい Gson() に変換します。
  3. リスト<ニュースタイプ> newsTypeList =
  4. gson.fromJson() は、
  5. CommonUtils.getStringFromJsonPath(これ、 「entry/resources/rawfile/news_type_datas.json」 )、
  6. 新しい TypeToken<List<NewsType>>(){ }.getType());
  7. newsTypeProvider = 新しい NewsTypeProvider(newsTypeList、これ);
  8. }

トランジション効果の追加

ニュースの異なるカテゴリを切り替えると、ズーム効果が追加されます。 setCategorizationFocus() に次のコードを追加します。

  1. プライベートvoid setCategorizationFocus(boolean isFocus) {
  2. 選択テキストnullの場合
  3. 戻る;
  4. }
  5. if (isFocus) {
  6. テキストの色を設定する
  7. 新しい色(CommonUtils.getColor(NewsListAbilitySlice.this、ResourceTable.Color_news_type_text_on)));
  8. テキストを選択します。
  9. テキストを選択します。スケールYを設定します(FRCUS_TEXT_SIZE);
  10. }それ以外{
  11. テキストの色を設定する
  12. 新しい色(CommonUtils.getColor(NewsListAbilitySlice.this、ResourceTable.Color_news_type_text_off)));
  13. テキストを選択します。
  14. テキストを選択します。
  15. }

したがって、カテゴリを切り替えると、次の結果が得られます。


5. ホームページのニュースリスト項目を追加する

ニュースリスト項目のレイアウト

メインページのレイアウトは、トップバーだけでなく、その下のニュースリスト項目からも構成されます。ニュース リスト項目全体は ListContainer です。まず、new_list_layout.xml でどのように定義されているかを見てみましょう。

  1. <リストコンテナ
  2. ohos:id= "$+id:news_container"   
  3. ohos:width= "match_parent"   
  4. ohos:height= "match_parent" />

ニュース リスト全体は複数のニュース項目で構成され、各ニュース項目はタイトルと画像で構成されます。各項目は、item_news_layout.xml レイアウトで次のように定義されます。

  1. <方向レイアウト
  2. ohos:height= "109.5vp"   
  3. ohos:width= "match_parent"   
  4. ohos:orientation= "水平"   
  5. ohos:padding= "10vp" >
  6. <テキスト
  7. ohos:id= "$+id:item_news_title"   
  8. ohos:height= "match_content"   
  9. ohos:width= "0vp"   
  10. ohos:最大テキスト行数= "3"   
  11. ohos:multiple_lines = "true"   
  12. ohos:right_padding= "20vp"   
  13. ohos:text_size= "18vp"   
  14. ohos:weight= "3" />
  15. <画像
  16. ohos:id= "$+id:item_news_image"   
  17. ohos:height= "match_parent"   
  18. ohos:width= "0vp"   
  19. ohos:scale_mode= "ストレッチ"   
  20. ohos:weight= "2" />
  21. </方向レイアウト>

NewsListProvider を宣言する

トップニュースタイプと同様に、各ニュース項目のタイトルと画像もプロバイダーを使用して渡されます。 NewsListProvider.java には次のコードがあります。

  1. @オーバーライド
  2. パブリックコンポーネント getComponent( int位置、 コンポーネント コンポーネント、 ComponentContainer コンポーネントコンテナー) {
  3. ビューホルダー ビューホルダー;
  4. コンポーネント温度= コンポーネント;
  5. 温度nullの場合
  6. コンポーネント = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_layout, null false );
  7. // ViewHolder を通じてすべてのサブコンポーネントをリスト項目インスタンスにバインドします
  8. ビューホルダー = 新しいビューホルダー();
  9. viewHolder.title = (テキスト) temp .findComponentById(ResourceTable.Id_item_news_title);
  10. viewHolder.image = (画像) temp .findComponentById(ResourceTable.Id_item_news_image);
  11. temp .setTag(viewHolder);
  12. }それ以外{
  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. 戻る 温度;
  18. }

同様に、newsListProvider のデータも initData 中に割り当てられるため、NewsListAbilitySlice の initData() に追加する必要があります。

  1. 合計ニュースデータリスト =
  2. gson.fromJson() は、
  3. CommonUtils.getStringFromJsonPath(これ、 「entry/resources/rawfile/news_datas.json」 )、
  4. 新しい TypeToken<List<NewsInfo>>(){ }.getType());
  5. newsDataList = 新しいArrayList<>();
  6. newsDataList.addAll(ニュースデータリストの合計);
  7. newsListProvider = 新しい NewsListProvider(newsDataList、これ);

これでデータの読み込みと解析が完了しました。次のステップは、アイテムにクリック イベントを追加することです。

リスナーを追加

特定のニュース項目をクリックすると、アプリケーションはグローバル詳細ページにジャンプします。この時点で、ニュース項目のリスナーを追加し、NewsListAbilitySlice.java の initListener() に追加する必要があります。

  1. newsListContainer.setItemClickedListener()
  2. (リストコンテナ、コンポーネント、位置、ID) -> {
  3. インテントのintent = 新しいIntent();
  4. 操作操作 =
  5. 新しい Intent.OperationBuilder()
  6. .withBundleName(バンドル名を取得())
  7. .withAbilityName(NewsAbility.class.getName())
  8. .withAction( "アクション.詳細" )
  9. 。建てる();
  10. インテントをsetOperation(操作);
  11. 意図を設定します。NewsDetailAbilitySlice.INTENT_TITLE、newsDataList.get(position).getTitle();
  12. 意図を設定します。NewsDetailAbilitySlice.INTENT_READ、newsDataList.get(position).getReads();
  13. テント.setParam(NewsDetailAbilitySlice.INTENT_LIKE, newsDataList.get(position).getLikes());
  14. 意図を設定します。NewsDetailAbilitySlice.INTENT_CONTENT、newsDataList.get(position).getContent();
  15. テント.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, newsDataList.get(position).getImgUrl());
  16. 開始アビリティ(インテント);
  17. });

ここで、startAbility() はページジャンプの重要なメソッドです。パラメータ インテントには、ジャンプするバンドル名、機能名、詳細ページのタイトル、imgurl などの重要なパラメータが格納されます。

6. 詳細ページのレイアウト

ニュース詳細ページのレイアウトは、ニュースホームページのレイアウトよりも少し複雑です。これは、DirectionalLayout、ScrollView、およびその他のコントロールにネストされた DependentLayout で構成されます。ページ全体を上部、下部、中央の3つの部分に分割します。そして、resources\base\layout\new_detail_laylout.xml に詳細ページのレイアウトを実装します。

トップ

上部は、左側のアイコンと NewsDemo、右側の読み取りといいねに対応する DirectionalLayout コンポーネントと Text コンポーネントで構成されています。効果とレイアウトを実装するためのコードは次のとおりです。


  1. <方向レイアウト
  2. ohos:width= "match_parent"   
  3. ohos:height= "match_content"   
  4. ohos:alignment= "垂直中央"   
  5. ohos:orientation= "水平" >
  6. <テキスト
  7. ohos:id= "$+id:title_icon"   
  8. ohos:width= "match_content"   
  9. ohos:height= "match_content"   
  10. ohos:重み= "1"   
  11. ohos:text= "ニュースデモ"   
  12. ohos:text_size= "20fp" />
  13. <テキスト
  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. <テキスト
  20. ohos:id= "$+id:like_num"   
  21. ohos:width= "match_content"   
  22. ohos:height= "match_content"   
  23. ohos:text_size= "10fp" />
  24. </方向レイアウト>

中央

ページの中央部分は、ニュースのタイトルのテキスト、サムネイル画像、ニュース コンテンツのテキストで構成されます。効果とレイアウトを実現するためのコードは次のとおりです。


  1. <テキスト
  2. ohos:id= "$+id:title_text"   
  3. ohos:width= "match_parent"   
  4. ohos:height= "match_content"   
  5. ohos:text_size= "18fp"   
  6. ohos:最大テキスト行数= "4"   
  7. ohos:multiple_lines = "true"   
  8. ohos:text_color= "#000000"   
  9. ohos:top_margin= "10vp" />
  10. <画像
  11. ohos:id= "$+id:image_content"   
  12. ohos:width= "match_parent"   
  13. ohos:scale_mode= "ストレッチ"   
  14. ohos:height= "300vp"   
  15. ohos:top_margin= "10vp" />
  16. <テキスト
  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_horizo​​ntal"   
  24. ohos:top_margin= "5vp" />

ページの下部は、入力コメントといくつかのボタンに対応する DirectionalLayout と TextField コントロールおよび Image コントロールで構成されています。具体的な効果とレイアウトコードの部分は次のとおりです。


  1. <方向レイアウト
  2. ohos:id= "$+id:bottom_layout"   
  3. ohos:align_parent_bottom= "true"   
  4. ohos:width= "match_parent"   
  5. ohos:height= "50vp"   
  6. ohos:orientation= "水平"   
  7. ohos:background_element= "#ffffff"   
  8. ohos:alignment= "垂直中央"   
  9. ohos:left_padding= "20vp"   
  10. ohos:right_padding= "20vp"   
  11. >
  12. <テキストフィールド
  13. ohos:id= "$+id:テキストファイル"   
  14. ohos:width= "160vp"   
  15. ohos:height= "30vp"   
  16. ohos:left_padding= "5vp"   
  17. ohos:right_padding= "10vp"   
  18. ohos:text_alignment= "垂直中央"   
  19. ohos:text_size= "15vp"   
  20. ohos:hint= 「コメントを入力してください。」   
  21. ohos:background_element= "$graphic:corner_bg_comment" />
  22. <画像
  23. ohos:id= "$+id:button1"   
  24. ohos:width= "20vp"   
  25. ohos:height= "20vp"   
  26. ohos:image_src= "$media:message_icon"   
  27. ohos:scale_mode= "ストレッチ"   
  28. ohos:left_margin= "20vp" />
  29. <画像
  30. ohos:id= "$+id:button2"   
  31. ohos:width= "20vp"   
  32. ohos:height= "20vp"   
  33. ohos:image_src= "$media:collect_icon"   
  34. ohos:scale_mode= "ストレッチ"   
  35. ohos:left_margin= "20vp" />
  36. <画像
  37. ohos:id= "$+id:button3"   
  38. ohos:width= "20vp"   
  39. ohos:height= "20vp"   
  40. ohos:image_src= "$media:like_icon"   
  41. ohos:scale_mode= "ストレッチ"   
  42. ohos:left_margin= "20vp" />
  43. <画像
  44. ohos:id= "$+id:button4"   
  45. ohos:width= "20vp"   
  46. ohos:height= "20vp"   
  47. ohos:image_src= "$media:share_icon"   
  48. ohos:scale_mode= "ストレッチ"   
  49. ohos:left_margin= "20vp" />
  50. </方向レイアウト>

7. 詳細ページデータの初期化

NewsListAbilitySliceページからデータを受け入れます

ニュース リスト項目の追加に関するセクションでは、ニュース ページのタイトルや imgurl などの重要なパラメータがどのように保存されるかについて説明しました。それでは、詳細ページでどのように取得されるかを見てみましょう。 NewsDetailAbilitySlice.java の onStart() には、次のコードがあります。

  1. パブリックvoid onStart(インテント インテント) {
  2. super.onStart(インテント);
  3. super.setUIContent(ResourceTable.Layout_news_detail_layout);
  4. 読み取り = intent.getStringParam(INTENT_READ);
  5. いいね! = intent.getStringParam(INTENT_LIKE);
  6. タイトル = intent.getStringParam(INTENT_TITLE);
  7. コンテンツ = intent.getStringParam(INTENT_CONTENT);
  8. イメージ = intent.getStringParam(INTENT_IMAGE);
  9. }

以前インテント内に保存されていたパラメータが、onStart() 内で 1 つずつ取得されるようになりました。

レイアウトとコントロールの初期化

レイアウトを実装するための xml の宣言に加えて、初期化のために NewsDetailAbilitySlice.java の onStart() に initView() メソッドを追加する必要があります。

  1. プライベートvoid initView() {
  2. 親レイアウト = (DependentLayout) findComponentById(ResourceTable.Id_parent_layout);
  3. commentFocus = (テキストフィールド) findComponentById(ResourceTable.Id_text_file);
  4. iconShared = (画像) findComponentById(ResourceTable.Id_button4);
  5. テキスト newsRead = (テキスト) findComponentById(ResourceTable.Id_read_num);
  6. テキスト newsLike = (Text) findComponentById(ResourceTable.Id_like_num);
  7. テキスト newsTitle = (テキスト) findComponentById(ResourceTable.Id_title_text);
  8. テキスト newsContent = (テキスト) findComponentById(ResourceTable.Id_title_content);
  9. 画像 newsImage = (画像) findComponentById(ResourceTable.Id_image_content);
  10. newsRead.setText( "読み取り: " + 読み取り);
  11. newsLike.setText( "いいね数: " + いいね数);
  12. newsTitle.setText( "元のタイトル: " + title);
  13. newsContent.setText(コンテンツ);
  14. newsImage.setPixelMap(CommonUtils.getPixelMapFromPath(this, image));
  15. }

リスナーを追加

ページの右下にある共有ボタンをクリックすると、デバイスの検出が実行され、検出されたデバイスのリストが表示されます。ここでは、2 つのリスナーを設定し、NewsDetailAbilitySlice.java の onStart() に initListener() を追加します。

  1. プライベートvoid initListener() {
  2. 親レイアウト.setTouchEventListener()
  3. (コンポーネント、タッチイベント) -> {
  4. コメントフォーカスがある場合(){
  5. コメントフォーカスをクリアします。
  6. }
  7. 戻る 真実;
  8. });
  9. アイコン共有.setClickedListener(
  10. v-> {
  11. デバイスの初期化();
  12. デバイスリストを表示します。
  13. });
  14. }

parentLayout の listen イベントは、タッチ フォーカスがデバイス リスト ダイアログにあるかどうかを監視するために使用され、iconShared の listen イベントは、共有ボタンがクリックされたかどうかを監視するために使用されます。


8. デバイスの検出

前のセクションでは、共有ボタンをクリックすると監視がトリガーされ、デバイスの検出が実行されることを学習しました。では、監視をトリガーした後、デバイス検出を実行するにはどうすればよいでしょうか?

initListener() には、デバイス検出に関連する 2 つのメソッド、initDevices() と showDeviceList() があります。 initDevices() メソッドは、デバイス検出を実装するためのインターフェイスを呼び出し、検出されたデバイスをリストに保存します。これを実装するには次のコードが必要です。

  1. プライベートvoid initDevices() {
  2. (デバイスサイズ() > 0)の場合{
  3. デバイスをクリアします。
  4. }
  5. リスト<デバイス情報> デバイス情報 =
  6. DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
  7. デバイスにデバイス情報を追加します。
  8. }

検出されたデバイスはダイアログを通じて表示されます。デバイス間転送の対象デバイスを選択できます。 NewsDetailAbilitySlice.java の showDeviceList() に次のコードを追加する必要があります。

  1. プライベートvoid showDeviceList() {
  2. //デバイスリストダイアログ
  3. ダイアログ = 新しい CommonDialog(NewsDetailAbilitySlice.this);
  4. ダイアログの自動クローズを設定します( true );
  5. dialog.setTitleText( "HarmonyOS デバイス" );
  6. ダイアログのサイズを設定します(DIALOG_SIZE_WIDTH、DIALOG_SIZE_HEIGHT);
  7. リストコンテナデバイスリストコンテナ = 新しいリストコンテナ(getContext());
  8. DevicesListAdapter の devicesListProvider = 新しい DevicesListProvider(devices, this);
  9. デバイスリストコンテナにアイテムプロバイダーを設定します。
  10. デバイスリストコンテナ.setItemClickedListener()
  11. (リストコンテナ、コンポーネント、位置、ID) -> {
  12. ダイアログを破棄する()
  13. // デバイス間で FA をプルアップする
  14. デバイスの位置を取得し、デバイスIDを取得します。
  15. });
  16. デバイスリストアダプタ。データが変更された場合に通知します。
  17. ダイアログで、デバイスリストコンテナのコンテンツカスタムコンポーネントを設定します。
  18. ダイアログを表示します。
  19. }

デバイスを選択すると、選択したデバイスは指定された FA ページをプルアップし、プルアップされた FA ページはリクエストを開始したエンドと一致します。

9. クロスデバイスコラボレーション

接続サービス能力

では、デバイス間のコラボレーションはどのように実現されるのでしょうか?検出されたデバイス リストも ListContainer を通じて表示されます。デバイス リストには対応する xml と変数宣言もありますが、ここでは繰り返しません。各デバイス項目に対して、デバイス間で FA を開始するためのリスナーを追加します。 NewsDetailAbilitySlice の showDeviceList() に startAlibityFA() メソッドを追加する必要があります。具体的なコードは次のとおりです。

  1. プライベートvoid startAbilityFA(StringdevicesId) {
  2. インテントのintent = 新しいIntent();
  3. 操作操作 =
  4. 新しい Intent.OperationBuilder()
  5. .withDeviceId(デバイスID)
  6. .withBundleName(バンドル名を取得())
  7. .withAbilityName(SharedService.class.getName())
  8. // このフラグは分散クロスデバイスシナリオで使用されます
  9. .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
  10. 。建てる();
  11. インテントをsetOperation(操作);
  12. ブール接続フラグ =
  13. // リモートサービスアビリティに接続する
  14. 接続能力
  15. 意図、
  16. 新しいIAbilityConnection() {
  17. @オーバーライド
  18. パブリックvoid onAbilityConnectDone(
  19. ElementName 要素名、IRemoteObject iRemoteObject、 int i) {
  20. INewsDemoIDL sharedManager を NewsDemoIDLStub.asInterface(iRemoteObject);
  21. 試す {
  22. sharedManager.tranShare(タイトル、読み取り、いいね、コンテンツ、画像);
  23. } キャッチ (RemoteException e) {
  24. LogUtil.i(TAG, "接続は成功しましたが、リモート例外が発生しました" );
  25. }
  26. }
  27. @オーバーライド
  28. パブリックvoid onAbilityDisconnectDone(ElementName elementName, int i) {
  29. 切断能力(これ);
  30. }
  31. });
  32. DialogUtil.トースト(
  33. これ、connectFlag ? 「共有に成功しました!」 : 「共有に失敗しました。しばらくしてからもう一度お試しください。」 、WAIT_TIME);
  34. }

このメソッドでは、インテントに対して bundlename、abiltyname、devicesId などのパラメータを設定し、connectAbility メソッドを使用してリモートの Service Ability に接続します。接続が成功すると、onAbilityConnectDone で tranShare メソッドが呼び出され、相手側が必要とするデータが渡されます。

リモートサービス能力の定義

ローカル エンドは connectAbility を介してリモート サービス アビリティに接続しますが、リモート サービス アビリティはどのように定義されるのでしょうか。 SharedService.java に tranShare() メソッドを追加する必要があります。コードは次のとおりです。

  1. public void tranShare(文字列タイトル、文字列読み取り、文字列いいね、文字列コンテンツ、文字列画像) {
  2. インテントのintent = 新しいIntent();
  3. 操作操作 =
  4. 新しい Intent.OperationBuilder()
  5. .withBundleName(バンドル名を取得())
  6. .withAbilityName(NewsAbility.class.getName())
  7. .withAction( "アクション.詳細" )
  8. 。建てる();
  9. インテントをsetOperation(操作);
  10. テント.setParam(NewsDetailAbilitySlice.INTENT_TITLE, タイトル);
  11. intent.setParam(NewsDetailAbilitySlice.INTENT_READ、読み取り)。
  12. テント.setParam(NewsDetailAbilitySlice.INTENT_LIKE, likes);
  13. テント.setParam(NewsDetailAbilitySlice.INTENT_CONTENT, コンテンツ);
  14. テント.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, 画像);
  15. 開始アビリティ(インテント);

例:

上記のコードはデモの参考用です。

このようにして、指定された FA が startAbility メソッドを通じて起動され、インテントによって運ばれるパラメータが渡されます。

- 仕上げる

現在、FA をリモートで起動するには、少なくとも 2 つのデバイスが同じ分散ネットワーク内にある必要があります。これは、次の構成を操作することで実現できます。

すべてのデバイスは同じネットワークに接続されています。

すべてのデバイスで同じ Huawei アカウントにログインします。

すべてのデバイスで、「設定->その他の接続->マルチデバイスコラボレーション」をオンにします

10. 総括と結論

このコードラボでは、アプリケーションのメイン ページと詳細ページを紹介しました。メインページでは、上部のニュースの種類をクリックしてさまざまなニュースのカテゴリを切り替えることができ、それに応じて下のニュースリスト項目全体も切り替わります。以下の特定のニュース項目をクリックすると、ニュースの詳細ページにリダイレクトされます。ニュース詳細ページでは、上下にスクロールしてニュースを閲覧し、下の共有ボタンをクリックすると、FAのデバイス間コラボレーションを実現できます。全体的な効果は図 1 と図 2 に示されています。


11.おめでとう

これでコードラボは正常に完了し、次の内容を学習しました。

ListContainerなどの一般的なコントロールの使い方

レイアウトの書き方とページへのジャンプ方法

FAのデバイス検出とデバイス間連携を実行する方法

12. 参考文献

gitee ソースコード

github ソースコード

詳細については、以下をご覧ください。

51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ

https://harmonyos..com

<<:  Amazon Web Services は Microsoft のクラウド ソフトウェアの優位性に挑戦するか?お金では問題は解決できません!

>>:  クラウド コンピューティングはビジネスとソフトウェア アーキテクチャに革命をもたらすことができるでしょうか?

推薦する

Go言語: 感銘を受けた13の機能

私たちはクラウドネイティブ時代へと加速しています。クラウドネイティブの基礎として、Go 言語は実にユ...

Amapと中国気象局が共同でAI版洪水マップを開発し、道路の洪水をリアルタイムで予測

5月31日、AutoNavi Mapは中国気象庁公衆気象サービスセンターと戦略的提携を締結したと発表...

実践経験を最適化することは、空論よりも効果的です

ここ数日、Weibo で何人かの友人からキーワードのやり方を尋ねられました。最適化は今とても難しいで...

vpslices-$3.5/モスクワ/2g メモリ/100g SSD/5T トラフィック/著作権フリー ホスティング

vpslicesは5月中旬にイギリスで登録された会社で、現在はモスクワとニュージャージーの2つのデー...

ケーススタディ: タイトルと説明を一致させる方法

タイトルと説明を一致させるには?多くの SEO 担当者は、Baidu ランキングのルールを探していま...

電子商取引の第二の戦場

惰性は、この時代の最も恐ろしい怠惰な考え方です。人々は、たとえ打ちのめされても、依然として「過去の正...

百度のトップ3ドライクリーニング店の長所と短所の簡単な分析

著者は現在、ドライクリーニング店のウェブサイトの最適化に取り組んでいます。初心者としては、上位にラン...

百度の画面支配と排水の詳細と操作方法を解説した記事

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスでは、早速、Baidu ...

初心者向け SEO の概念: クロールとインデックスの違い

クロールとインデックス作成は、SEO における 2 つの専門用語です。多くの初心者は SEO に触れ...

ユーザー エクスペリエンスは外部リンクの構築から始まります。効果的なクリックが生成されて初めて、外部リンクは高品質になります。

現在、すべてのウェブマスターとSEO担当者は、外部リンクの構築に多大な注意を払っています。彼らは、リ...

「イカゲーム」のマーケティングに失敗した人は誰ですか?

「イカゲーム」の人気に伴い、「イカ」マーケティングも開始されました。このマーケティングには失敗と成功...

「ソー・ヤング」と「アイアンマン3」のマーケティングポイントの比較分析

5月の天気は暑く、5月の映画マーケティングも暑いです。趙薇の監督デビュー作『So Young』(以下...

Baidu 6.28はみんなを傷つけたが、私を贔屓した

このウェブサイトは最近作成されたもので、ドメイン名は古いですが、その後以前のウェブサイト プログラム...

Kubernetes レプリケーション コントローラーの仕組み

[[436665]]レプリケーション コントローラーは、ポッドのライフサイクルを管理し、必要な数のポ...

モバイルインターネット広告に関する8つの事実

過去2年間でモバイル広告は新たな現実をもたらした 少なくとも広告収入から判断すると、Facebook...