[[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 レイアウト ファイルには、次のコードがあります。 - <リストコンテナ
-
- ohos:id= "$+id:セレクタリスト"
-
- ohos:width= "match_parent"
-
- ohos:height= "40vp"
-
- ohos:orientation= "水平"
-
- />
さらに、関連付けのために selectorListContainer 変数も定義します。 NewsListAbilitySlice.java の initView() メソッドには、次のコードがあります。 - セレクタリストコンテナー = (リストコンテナー) findComponentById(ResourceTable.Id_selector_list);
リスナーを追加ニュースの異なるカテゴリを切り替えると、以下に示すニュース リスト項目もそれに応じて切り替わるので、この ListContainer のリスナーを設定し、NewsListAbilitySlice.java の initListener() メソッドに追加する必要があります。 - セレクタリストコンテナ.setItemClickedListener()
- (リストコンテナ、コンポーネント、位置、ID) -> {
- // 選択後の拡大効果を設定する
- カテゴリ化フォーカスを設定します( false );
- selectText = (テキスト) component.findComponentById(ResourceTable.Id_news_type_text);
- カテゴリ化フォーカスを設定します( true );
- newsDataListをクリアします。
- for (NewsInfo mTotalNewsData : totalNewsDataList) {
- if (selectText.getText().equals(mTotalNewsData.getType()) || id == 0) {
- newsDataList.add (mTotalNewsData) ;
- }
- }
- リストビューを更新します。
- });
NewsTypeProvider を宣言するアプリケーションがデータをより効率的かつ便利に使用できるように、アプリケーションで使用されるニュース データを resources/rawfile ディレクトリ内の 2 つの json ファイルに事前に設定しています。さらに、データの取得と転送を容易にするために、いくつかのプロバイダーも宣言します。ニュース カテゴリを取得するための NewsTypeProvider は次のとおりです。 - @オーバーライド
- パブリックコンポーネント getComponent( int位置、 コンポーネント コンポーネント、 ComponentContainer コンポーネントコンテナー) {
- ビューホルダー ビューホルダー;
- コンポーネント温度= コンポーネント;
- (温度がnullの場合)
- temp = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_type_layout, null 、 false );
- // ViewHolder を通じてすべてのサブコンポーネントをリスト項目インスタンスにバインドします
- ビューホルダー = 新しいビューホルダー();
- viewHolder.title = (テキスト) temp .findComponentById(ResourceTable.Id_news_type_text);
- コンポーネントのタグを設定します(viewHolder);
- }それ以外{
- viewHolder = (ViewHolder) temp .getTag();
- }
- viewHolder.title.setText(mNewsTypeList.get(position).getName());
- 戻る 温度;
- }
JSON ファイル内のニュース データを解析し、そのデータをプロバイダーに渡す initData メソッドを定義します。 NewsListAbilitySlice.java の initData() に次のコードを追加します。 - プライベートvoid initData() {
- Gson を新しい Gson() に変換します。
- リスト<ニュースタイプ> newsTypeList =
- gson.fromJson() は、
- CommonUtils.getStringFromJsonPath(これ、 「entry/resources/rawfile/news_type_datas.json」 )、
- 新しい TypeToken<List<NewsType>>(){ }.getType());
- newsTypeProvider = 新しい NewsTypeProvider(newsTypeList、これ);
- }
トランジション効果の追加ニュースの異なるカテゴリを切り替えると、ズーム効果が追加されます。 setCategorizationFocus() に次のコードを追加します。 - プライベートvoid setCategorizationFocus(boolean isFocus) {
- 選択テキストがnullの場合
- 戻る;
- }
- if (isFocus) {
- テキストの色を設定する
- 新しい色(CommonUtils.getColor(NewsListAbilitySlice.this、ResourceTable.Color_news_type_text_on)));
- テキストを選択します。
- テキストを選択します。スケールYを設定します(FRCUS_TEXT_SIZE);
- }それ以外{
- テキストの色を設定する
- 新しい色(CommonUtils.getColor(NewsListAbilitySlice.this、ResourceTable.Color_news_type_text_off)));
- テキストを選択します。
- テキストを選択します。
- }
したがって、カテゴリを切り替えると、次の結果が得られます。
5. ホームページのニュースリスト項目を追加するニュースリスト項目のレイアウトメインページのレイアウトは、トップバーだけでなく、その下のニュースリスト項目からも構成されます。ニュース リスト項目全体は ListContainer です。まず、new_list_layout.xml でどのように定義されているかを見てみましょう。 - <リストコンテナ
- ohos:id= "$+id:news_container"
- ohos:width= "match_parent"
- ohos:height= "match_parent" />
ニュース リスト全体は複数のニュース項目で構成され、各ニュース項目はタイトルと画像で構成されます。各項目は、item_news_layout.xml レイアウトで次のように定義されます。 - <方向レイアウト
- ohos:height= "109.5vp"
- ohos:width= "match_parent"
- ohos:orientation= "水平"
- ohos:padding= "10vp" >
- <テキスト
- ohos:id= "$+id:item_news_title"
- ohos:height= "match_content"
- ohos:width= "0vp"
- ohos:最大テキスト行数= "3"
- ohos:multiple_lines = "true"
- ohos:right_padding= "20vp"
- ohos:text_size= "18vp"
- ohos:weight= "3" />
- <画像
- ohos:id= "$+id:item_news_image"
- ohos:height= "match_parent"
- ohos:width= "0vp"
- ohos:scale_mode= "ストレッチ"
- ohos:weight= "2" />
- </方向レイアウト>
NewsListProvider を宣言するトップニュースタイプと同様に、各ニュース項目のタイトルと画像もプロバイダーを使用して渡されます。 NewsListProvider.java には次のコードがあります。 - @オーバーライド
- パブリックコンポーネント getComponent( int位置、 コンポーネント コンポーネント、 ComponentContainer コンポーネントコンテナー) {
- ビューホルダー ビューホルダー;
- コンポーネント温度= コンポーネント;
- (温度がnullの場合)
- コンポーネント = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_layout, null 、 false );
- // ViewHolder を通じてすべてのサブコンポーネントをリスト項目インスタンスにバインドします
- ビューホルダー = 新しいビューホルダー();
- viewHolder.title = (テキスト) temp .findComponentById(ResourceTable.Id_item_news_title);
- viewHolder.image = (画像) temp .findComponentById(ResourceTable.Id_item_news_image);
- temp .setTag(viewHolder);
- }それ以外{
- viewHolder = (ViewHolder) temp .getTag();
- }
- viewHolder.title.setText(newsInfoList.get(i).getTitle());
- viewHolder.image.setPixelMap(CommonUtils.getPixelMapFromPath(context, newsInfoList.get(i).getImgUrl()));
- 戻る 温度;
- }
同様に、newsListProvider のデータも initData 中に割り当てられるため、NewsListAbilitySlice の initData() に追加する必要があります。 - 合計ニュースデータリスト =
- gson.fromJson() は、
- CommonUtils.getStringFromJsonPath(これ、 「entry/resources/rawfile/news_datas.json」 )、
- 新しい TypeToken<List<NewsInfo>>(){ }.getType());
- newsDataList = 新しいArrayList<>();
- newsDataList.addAll(ニュースデータリストの合計);
- newsListProvider = 新しい NewsListProvider(newsDataList、これ);
これでデータの読み込みと解析が完了しました。次のステップは、アイテムにクリック イベントを追加することです。 リスナーを追加特定のニュース項目をクリックすると、アプリケーションはグローバル詳細ページにジャンプします。この時点で、ニュース項目のリスナーを追加し、NewsListAbilitySlice.java の initListener() に追加する必要があります。 - newsListContainer.setItemClickedListener()
- (リストコンテナ、コンポーネント、位置、ID) -> {
- インテントのintent = 新しいIntent();
- 操作操作 =
- 新しい Intent.OperationBuilder()
- .withBundleName(バンドル名を取得())
- .withAbilityName(NewsAbility.class.getName())
- .withAction( "アクション.詳細" )
- 。建てる();
- インテントをsetOperation(操作);
- 意図を設定します。NewsDetailAbilitySlice.INTENT_TITLE、newsDataList.get(position).getTitle();
- 意図を設定します。NewsDetailAbilitySlice.INTENT_READ、newsDataList.get(position).getReads();
- テント.setParam(NewsDetailAbilitySlice.INTENT_LIKE, newsDataList.get(position).getLikes());
- 意図を設定します。NewsDetailAbilitySlice.INTENT_CONTENT、newsDataList.get(position).getContent();
- テント.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, newsDataList.get(position).getImgUrl());
- 開始アビリティ(インテント);
- });
ここで、startAbility() はページジャンプの重要なメソッドです。パラメータ インテントには、ジャンプするバンドル名、機能名、詳細ページのタイトル、imgurl などの重要なパラメータが格納されます。 6. 詳細ページのレイアウトニュース詳細ページのレイアウトは、ニュースホームページのレイアウトよりも少し複雑です。これは、DirectionalLayout、ScrollView、およびその他のコントロールにネストされた DependentLayout で構成されます。ページ全体を上部、下部、中央の3つの部分に分割します。そして、resources\base\layout\new_detail_laylout.xml に詳細ページのレイアウトを実装します。 トップ上部は、左側のアイコンと NewsDemo、右側の読み取りといいねに対応する DirectionalLayout コンポーネントと Text コンポーネントで構成されています。効果とレイアウトを実装するためのコードは次のとおりです。
- <方向レイアウト
- ohos:width= "match_parent"
- ohos:height= "match_content"
- ohos:alignment= "垂直中央"
- ohos:orientation= "水平" >
- <テキスト
- ohos:id= "$+id:title_icon"
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:重み= "1"
- ohos:text= "ニュースデモ"
- ohos:text_size= "20fp" />
- <テキスト
- ohos:id= "$+id:read_num"
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:text_size= "10fp"
- ohos:right_margin= "10vp" />
- <テキスト
- ohos:id= "$+id:like_num"
- ohos:width= "match_content"
- ohos:height= "match_content"
- ohos:text_size= "10fp" />
- </方向レイアウト>
中央ページの中央部分は、ニュースのタイトルのテキスト、サムネイル画像、ニュース コンテンツのテキストで構成されます。効果とレイアウトを実現するためのコードは次のとおりです。
- <テキスト
- ohos:id= "$+id:title_text"
- ohos:width= "match_parent"
- ohos:height= "match_content"
- ohos:text_size= "18fp"
- ohos:最大テキスト行数= "4"
- ohos:multiple_lines = "true"
- ohos:text_color= "#000000"
- ohos:top_margin= "10vp" />
- <画像
- ohos:id= "$+id:image_content"
- ohos:width= "match_parent"
- ohos:scale_mode= "ストレッチ"
- ohos:height= "300vp"
- ohos:top_margin= "10vp" />
- <テキスト
- ohos:id= "$+id:title_content"
- ohos:width= "match_parent"
- ohos:height= "match_content"
- ohos:multiple_lines = "true"
- ohos:text_color= "#708090"
- ohos:text_size= "16vp"
- ohos:text_alignment= "center_horizontal"
- ohos:top_margin= "5vp" />
底ページの下部は、入力コメントといくつかのボタンに対応する DirectionalLayout と TextField コントロールおよび Image コントロールで構成されています。具体的な効果とレイアウトコードの部分は次のとおりです。
- <方向レイアウト
- ohos:id= "$+id:bottom_layout"
- ohos:align_parent_bottom= "true"
- ohos:width= "match_parent"
- ohos:height= "50vp"
- ohos:orientation= "水平"
- ohos:background_element= "#ffffff"
- ohos:alignment= "垂直中央"
- ohos:left_padding= "20vp"
- ohos:right_padding= "20vp"
- >
- <テキストフィールド
- ohos:id= "$+id:テキストファイル"
- ohos:width= "160vp"
- ohos:height= "30vp"
- ohos:left_padding= "5vp"
- ohos:right_padding= "10vp"
- ohos:text_alignment= "垂直中央"
- ohos:text_size= "15vp"
- ohos:hint= 「コメントを入力してください。」
- ohos:background_element= "$graphic:corner_bg_comment" />
- <画像
- ohos:id= "$+id:button1"
- ohos:width= "20vp"
- ohos:height= "20vp"
- ohos:image_src= "$media:message_icon"
- ohos:scale_mode= "ストレッチ"
- ohos:left_margin= "20vp" />
- <画像
- ohos:id= "$+id:button2"
- ohos:width= "20vp"
- ohos:height= "20vp"
- ohos:image_src= "$media:collect_icon"
- ohos:scale_mode= "ストレッチ"
- ohos:left_margin= "20vp" />
- <画像
- ohos:id= "$+id:button3"
- ohos:width= "20vp"
- ohos:height= "20vp"
- ohos:image_src= "$media:like_icon"
- ohos:scale_mode= "ストレッチ"
- ohos:left_margin= "20vp" />
- <画像
- ohos:id= "$+id:button4"
- ohos:width= "20vp"
- ohos:height= "20vp"
- ohos:image_src= "$media:share_icon"
- ohos:scale_mode= "ストレッチ"
- ohos:left_margin= "20vp" />
- </方向レイアウト>
7. 詳細ページデータの初期化NewsListAbilitySliceページからデータを受け入れますニュース リスト項目の追加に関するセクションでは、ニュース ページのタイトルや imgurl などの重要なパラメータがどのように保存されるかについて説明しました。それでは、詳細ページでどのように取得されるかを見てみましょう。 NewsDetailAbilitySlice.java の onStart() には、次のコードがあります。 - パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- super.setUIContent(ResourceTable.Layout_news_detail_layout);
- 読み取り = intent.getStringParam(INTENT_READ);
- いいね! = intent.getStringParam(INTENT_LIKE);
- タイトル = intent.getStringParam(INTENT_TITLE);
- コンテンツ = intent.getStringParam(INTENT_CONTENT);
- イメージ = intent.getStringParam(INTENT_IMAGE);
- }
以前インテント内に保存されていたパラメータが、onStart() 内で 1 つずつ取得されるようになりました。 レイアウトとコントロールの初期化レイアウトを実装するための xml の宣言に加えて、初期化のために NewsDetailAbilitySlice.java の onStart() に initView() メソッドを追加する必要があります。 - プライベートvoid initView() {
- 親レイアウト = (DependentLayout) findComponentById(ResourceTable.Id_parent_layout);
- commentFocus = (テキストフィールド) findComponentById(ResourceTable.Id_text_file);
- iconShared = (画像) findComponentById(ResourceTable.Id_button4);
- テキスト newsRead = (テキスト) findComponentById(ResourceTable.Id_read_num);
- テキスト newsLike = (Text) findComponentById(ResourceTable.Id_like_num);
- テキスト newsTitle = (テキスト) findComponentById(ResourceTable.Id_title_text);
- テキスト newsContent = (テキスト) findComponentById(ResourceTable.Id_title_content);
- 画像 newsImage = (画像) findComponentById(ResourceTable.Id_image_content);
- newsRead.setText( "読み取り: " + 読み取り);
- newsLike.setText( "いいね数: " + いいね数);
- newsTitle.setText( "元のタイトル: " + title);
- newsContent.setText(コンテンツ);
- newsImage.setPixelMap(CommonUtils.getPixelMapFromPath(this, image));
- }
リスナーを追加ページの右下にある共有ボタンをクリックすると、デバイスの検出が実行され、検出されたデバイスのリストが表示されます。ここでは、2 つのリスナーを設定し、NewsDetailAbilitySlice.java の onStart() に initListener() を追加します。 - プライベートvoid initListener() {
- 親レイアウト.setTouchEventListener()
- (コンポーネント、タッチイベント) -> {
- コメントフォーカスがある場合(){
- コメントフォーカスをクリアします。
- }
- 戻る 真実;
- });
- アイコン共有.setClickedListener(
- v-> {
- デバイスの初期化();
- デバイスリストを表示します。
- });
- }
parentLayout の listen イベントは、タッチ フォーカスがデバイス リスト ダイアログにあるかどうかを監視するために使用され、iconShared の listen イベントは、共有ボタンがクリックされたかどうかを監視するために使用されます。
8. デバイスの検出前のセクションでは、共有ボタンをクリックすると監視がトリガーされ、デバイスの検出が実行されることを学習しました。では、監視をトリガーした後、デバイス検出を実行するにはどうすればよいでしょうか? initListener() には、デバイス検出に関連する 2 つのメソッド、initDevices() と showDeviceList() があります。 initDevices() メソッドは、デバイス検出を実装するためのインターフェイスを呼び出し、検出されたデバイスをリストに保存します。これを実装するには次のコードが必要です。 - プライベートvoid initDevices() {
- (デバイスサイズ() > 0)の場合{
- デバイスをクリアします。
- }
- リスト<デバイス情報> デバイス情報 =
- DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- デバイスにデバイス情報を追加します。
- }
検出されたデバイスはダイアログを通じて表示されます。デバイス間転送の対象デバイスを選択できます。 NewsDetailAbilitySlice.java の showDeviceList() に次のコードを追加する必要があります。 - プライベートvoid showDeviceList() {
- //デバイスリストダイアログ
- ダイアログ = 新しい CommonDialog(NewsDetailAbilitySlice.this);
- ダイアログの自動クローズを設定します( true );
- dialog.setTitleText( "HarmonyOS デバイス" );
- ダイアログのサイズを設定します(DIALOG_SIZE_WIDTH、DIALOG_SIZE_HEIGHT);
- リストコンテナデバイスリストコンテナ = 新しいリストコンテナ(getContext());
- DevicesListAdapter の devicesListProvider = 新しい DevicesListProvider(devices, this);
- デバイスリストコンテナにアイテムプロバイダーを設定します。
- デバイスリストコンテナ.setItemClickedListener()
- (リストコンテナ、コンポーネント、位置、ID) -> {
- ダイアログを破棄する()
- // デバイス間で FA をプルアップする
- デバイスの位置を取得し、デバイスIDを取得します。
- });
- デバイスリストアダプタ。データが変更された場合に通知します。
- ダイアログで、デバイスリストコンテナのコンテンツカスタムコンポーネントを設定します。
- ダイアログを表示します。
- }
デバイスを選択すると、選択したデバイスは指定された FA ページをプルアップし、プルアップされた FA ページはリクエストを開始したエンドと一致します。 9. クロスデバイスコラボレーション接続サービス能力では、デバイス間のコラボレーションはどのように実現されるのでしょうか?検出されたデバイス リストも ListContainer を通じて表示されます。デバイス リストには対応する xml と変数宣言もありますが、ここでは繰り返しません。各デバイス項目に対して、デバイス間で FA を開始するためのリスナーを追加します。 NewsDetailAbilitySlice の showDeviceList() に startAlibityFA() メソッドを追加する必要があります。具体的なコードは次のとおりです。 - プライベートvoid startAbilityFA(StringdevicesId) {
- インテントのintent = 新しいIntent();
- 操作操作 =
- 新しい Intent.OperationBuilder()
- .withDeviceId(デバイスID)
- .withBundleName(バンドル名を取得())
- .withAbilityName(SharedService.class.getName())
- // このフラグは分散クロスデバイスシナリオで使用されます
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- 。建てる();
- インテントをsetOperation(操作);
- ブール接続フラグ =
- // リモートサービスアビリティに接続する
- 接続能力
- 意図、
- 新しいIAbilityConnection() {
- @オーバーライド
- パブリックvoid onAbilityConnectDone(
- ElementName 要素名、IRemoteObject iRemoteObject、 int i) {
- INewsDemoIDL sharedManager を NewsDemoIDLStub.asInterface(iRemoteObject);
- 試す {
- sharedManager.tranShare(タイトル、読み取り、いいね、コンテンツ、画像);
- } キャッチ (RemoteException e) {
- LogUtil.i(TAG, "接続は成功しましたが、リモート例外が発生しました" );
- }
- }
- @オーバーライド
- パブリックvoid onAbilityDisconnectDone(ElementName elementName, int i) {
- 切断能力(これ);
- }
- });
- DialogUtil.トースト(
- これ、connectFlag ? 「共有に成功しました!」 : 「共有に失敗しました。しばらくしてからもう一度お試しください。」 、WAIT_TIME);
- }
このメソッドでは、インテントに対して bundlename、abiltyname、devicesId などのパラメータを設定し、connectAbility メソッドを使用してリモートの Service Ability に接続します。接続が成功すると、onAbilityConnectDone で tranShare メソッドが呼び出され、相手側が必要とするデータが渡されます。 リモートサービス能力の定義ローカル エンドは connectAbility を介してリモート サービス アビリティに接続しますが、リモート サービス アビリティはどのように定義されるのでしょうか。 SharedService.java に tranShare() メソッドを追加する必要があります。コードは次のとおりです。 - public void tranShare(文字列タイトル、文字列読み取り、文字列いいね、文字列コンテンツ、文字列画像) {
- インテントのintent = 新しいIntent();
- 操作操作 =
- 新しい Intent.OperationBuilder()
- .withBundleName(バンドル名を取得())
- .withAbilityName(NewsAbility.class.getName())
- .withAction( "アクション.詳細" )
- 。建てる();
- インテントをsetOperation(操作);
- テント.setParam(NewsDetailAbilitySlice.INTENT_TITLE, タイトル);
- intent.setParam(NewsDetailAbilitySlice.INTENT_READ、読み取り)。
- テント.setParam(NewsDetailAbilitySlice.INTENT_LIKE, likes);
- テント.setParam(NewsDetailAbilitySlice.INTENT_CONTENT, コンテンツ);
- テント.setParam(NewsDetailAbilitySlice.INTENT_IMAGE, 画像);
- 開始アビリティ(インテント);
例: 上記のコードはデモの参考用です。 このようにして、指定された FA が startAbility メソッドを通じて起動され、インテントによって運ばれるパラメータが渡されます。 - 仕上げる 現在、FA をリモートで起動するには、少なくとも 2 つのデバイスが同じ分散ネットワーク内にある必要があります。これは、次の構成を操作することで実現できます。 すべてのデバイスは同じネットワークに接続されています。 すべてのデバイスで同じ Huawei アカウントにログインします。 すべてのデバイスで、「設定->その他の接続->マルチデバイスコラボレーション」をオンにします 10. 総括と結論このコードラボでは、アプリケーションのメイン ページと詳細ページを紹介しました。メインページでは、上部のニュースの種類をクリックしてさまざまなニュースのカテゴリを切り替えることができ、それに応じて下のニュースリスト項目全体も切り替わります。以下の特定のニュース項目をクリックすると、ニュースの詳細ページにリダイレクトされます。ニュース詳細ページでは、上下にスクロールしてニュースを閲覧し、下の共有ボタンをクリックすると、FAのデバイス間コラボレーションを実現できます。全体的な効果は図 1 と図 2 に示されています。
11.おめでとうこれでコードラボは正常に完了し、次の内容を学習しました。 ListContainerなどの一般的なコントロールの使い方 レイアウトの書き方とページへのジャンプ方法 FAのデバイス検出とデバイス間連携を実行する方法 12. 参考文献gitee ソースコード github ソースコード 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |