[[389002]] 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com 1. はじめに開発者は、分散スケジューリング機能をアプリケーションに統合し、指定された機能の分散インターフェイスを呼び出すことによって、デバイス間の機能スケジューリングを実装します。分散タスク スケジューリングでは、アビリティ テンプレートとインテントに応じて、リモート FA の開始 (Feature Ability)、リモート PA の開始 (Particle Ability)、リモート PA のシャットダウン、リモート PA の接続、リモート PA の切断、および FA のデバイス間移行という 6 つの機能が開発者に提供されます。分散タスク スケジューリングの詳細については、「分散タスク スケジューリング」を参照してください。 🕮 説明FA をリモートで起動するには、少なくとも 2 つのデバイスが同じ分散ネットワーク内にある必要があります。これは次の操作によって実現できます。 1. すべてのデバイスが同じネットワークに接続されています。 2. すべてのデバイスで同じ Huawei アカウントにログインします。 3. すべてのデバイスで、「設定 -> その他の接続 -> 複数デバイスのコラボレーション」をオンにします。 このチュートリアルでは、「分散スケジューリングに基づく FA のリモート起動」を例に、許可申請、ボタンイベント応答、デバイスリストの取得、FA のリモート起動の開発プロセスを組み合わせ、分散スケジューリング機能をすぐに理解できるようにします。 2. 必要な許可を申請するentry\src\main\config.json で次の 4 つの権限を申請します。 1. ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE: 分散ネットワーク内のデバイス状態の変化を監視できるようにするために使用されます。 2. ohos.permission.GET_DISTRIBUTED_DEVICE_INFO: 分散ネットワーク内のデバイス リストとデバイス情報を取得するために使用されます。 3. ohos.permission.GET_BUNDLE_INFO: 他のアプリケーションの情報を照会するために使用されます。 4. ohos.permission.DISTRIBUTED_DATASYNC: 異なるデバイス間でのデータ交換を許可するために使用されます。 サンプルコードは次のとおりです。 - モジュール": {
- ......
- 「必要な権限」 : [
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE」
- },
- {
- 「名前」 : 「ohos.permission.GET_DISTRIBUTED_DEVICE_INFO」
- },
- {
- 「名前」 : 「ohos.permission.GET_BUNDLE_INFO」
- },
- {
- 「名前」 : 「ohos.permission.DISTRIBUTED_DATASYNC」
- }
- ]
- }
さらに、アビリティを実装するコードで、マルチデバイスの共同アクセスを使用する権限を明示的に宣言する必要もあります。サンプルコードは次のとおりです。 - パブリッククラスMainAbilityはAbilityを拡張します{
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- requestPermissionsFromUser(新しい文字列[]{ "ohos.permission.DISTRIBUTED_DATASYNC" },0);
- super.onStart(インテント);
- }
- }
3. クリックイベントに応答するボタンを実装するMainAbilitySlice.java でページを開発し、そのページにボタンを描画します。サンプルコードは次のとおりです。 - @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- DirectionalLayout レイアウト = 新しい DirectionalLayout(this);
- ComponentContainer.LayoutConfig config = 新しいComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_PARENT);
- レイアウトを設定します。
- ボタン btn = new Button(getContext());
- ShapeElement buttonBg = 新しい ShapeElement();
- ボタンの背景色をRgbColorに設定します(新しいRgbColor(0, 125, 255));
- ボタンの背景のコーナー半径を設定します(25);
- btn.setBackground(ボタンの背景);
- ComponentContainer.LayoutConfig btnConfig = 新しいComponentContainer.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_PARENT,
- ComponentContainer.LayoutConfig.MATCH_CONTENT);
- btn.setLayoutConfig(btnConfig);
- btn.setTextSize(50);
- btn.setPadding(10, 10, 10, 10);
- btn.setText( "リモートFAを開始" );
- レイアウトにコンポーネントを追加します(btn);
- btn.setClickedListener(コンポーネント -> {
- // ボタンの応答を処理します。詳細については、手順 3「デバイス リストを取得する」を参照してください。
- });
- super.setUIContent(レイアウト);
- }
4. デバイスリストを取得するリモートスタートFAボタンの応答で、デバイスリストが取得されます。 DeviceManager.getDeviceList(int flag) はデバイス リストを取得するために使用されます。このフラグは DeviceInfo.FLAG_GET_ONLINE_DEVICE に渡され、分散ネットワーク内のすべてのオンライン デバイスを照会します。返された DeviceInfo リスト オブジェクトを解析することで、リモート起動する FA デバイスの deviceId が取得されます。サンプルコードは次のとおりです。 - btn.setClickedListener(コンポーネント -> {
- // ボタンの応答を処理し、オンラインデバイスのリストを取得します
- リスト<デバイス情報> deviceInfoList =
- DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- (デバイス情報デバイス情報:デバイス情報リスト) {
- // FA をリモートで開始します。詳細については手順 4 を参照してください。
- }
- });
5. FAをリモートで起動するFA をリモートで起動するための Intent を構築し、FA をリモートで起動します。 BUNDLE_NAME と ABILITY_NAME はグローバル変数であり、起動する必要があるリモート FA の BundleName (パッケージ名) と AbilityName (起動するアビリティ名) を示します。サンプルコードは次のとおりです。 - // FAをリモートで起動する
- インテント remoteIntent = 新しい Intent();
- //開始するFAのbundleNameとabilityNameを指定します
- // 例: BUNDLE_NAME = "com.huawei.codelab"
- // ABILITY_NAME = "com.huawei.codelab.MainAbility"
- // 現在の分散機能が関係していることを示すために分散フラグを設定します
- 操作 operation = new Intent.OperationBuilder().withDeviceId(deviceInfo.getDeviceId())
- .withBundleName(バンドル名)
- .withAbilityName(アビリティ名)
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- 。建てる();
- リモートインテントの操作を設定します。
- 試す {
- // ターゲットデバイスに指定されたFAが含まれているかどうか
- リスト<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);
- (abilityInfoList != null && !abilityInfoList.isEmpty())の場合 {
- リモートインテントを開始します。
- }
- } キャッチ (RemoteException e) {
- // 例外を処理する
- }
6. 完全な例携帯電話を例にとると、ページ ボタンをクリックすると、同じ Huawei アカウントでログインしている同じネットワーク内の他の携帯電話で指定された FA が表示されます。ここでの確認には少なくとも 2 台の携帯電話が必要です。効果は以下のとおりです。 サンプルコードは次のとおりです。 - ohos.aafwk.ability.AbilitySlice をインポートします。
- ohos.aafwk.content.Intent をインポートします。
- ohos.aafwk.content.Operation をインポートします。
- ohos.agp.colors.RgbColor をインポートします。
- ohos.agp.components.Button をインポートします。
- ohos.agp.components.ComponentContainer をインポートします。
- ohos.agp.components.DirectionalLayout をインポートします。
- ohos.agp.components.element.ShapeElement をインポートします。
- ohos.bundle.AbilityInfo をインポートします。
- ohos.distributedschedule.interwork.DeviceInfo をインポートします。
- ohos.distributedschedule.interwork.DeviceManager をインポートします。
- ohos.rpc.RemoteException をインポートします。
-
- java.util.List をインポートします。
-
- パブリッククラス MainAbilitySlice は AbilitySlice を拡張します {
- //リモートで起動したFAのBundleName。自分で入力してください
- プライベート静的最終文字列 BUNDLE_NAME = "com.huawei.codelab" ;
- // FAをリモート起動するためのAbilityName。自分で入力してください
- プライベート静的最終文字列 ABILITY_NAME = "com.huawei.codelab.MainAbility" ;
-
- @オーバーライド
- パブリックvoid onStart(インテント インテント) {
- super.onStart(インテント);
- DirectionalLayout レイアウト = 新しい DirectionalLayout(this);
- ComponentContainer.LayoutConfig config = 新しいComponentContainer.LayoutConfig(
- ComponentContainer.LayoutConfig.MATCH_PARENT、
- ComponentContainer.LayoutConfig.MATCH_PARENT);
- レイアウトを設定します。
- ボタン btn = new Button(getContext());
- ShapeElement buttonBg = 新しい ShapeElement();
- ボタンの背景色をRgbColorに設定します(新しいRgbColor(0, 125, 255));
- ボタンの背景のコーナー半径を設定します(25);
- btn.setBackground(ボタンの背景);
- ComponentContainer.LayoutConfig btnConfig = 新しいComponentContainer.LayoutConfig(
- ComponentContainer.LayoutConfig.MATCH_PARENT、
- ComponentContainer.LayoutConfig.MATCH_CONTENT);
- btn.setLayoutConfig(btnConfig);
- btn.setTextSize(50);
- btn.setPadding(10, 10, 10, 10);
- btn.setText( "リモートFAを開始" );
- レイアウトにコンポーネントを追加します。
- btn.setClickedListener(コンポーネント -> {
- // ボタンの応答を処理し、オンラインデバイスのリストを取得します
- リスト<DeviceInfo> deviceInfoList = DeviceManager.getDeviceList(DeviceInfo.FLAG_GET_ONLINE_DEVICE);
- (デバイス情報デバイス情報:デバイス情報リスト) {
- // FAをリモートで起動する
- インテント remoteIntent = 新しい Intent();
- 操作 operation = new Intent.OperationBuilder()
- .withDeviceId(デバイス情報.getDeviceId())
- .withBundleName(バンドル名)
- .withAbilityName(アビリティ名)
- .withFlags(Intent.FLAG_ABILITYSLICE_MULTI_DEVICE)
- 。建てる();
- リモートインテントの操作を設定します。
- 試す {
- リスト<AbilityInfo> abilityInfoList = getBundleManager().queryAbilityByIntent(remoteIntent, 0, 0);
- (abilityInfoList != null && !abilityInfoList.isEmpty())の場合 {
- リモートインテントを開始します。
- }
- } キャッチ (RemoteException e) {
- // 例外を処理する
- }
- }
- });
- super.setUIContent(レイアウト);
- }
- }
🕮 説明上記のコードはデモの参考用です。製品コードでは、データの検証と国際化を考慮する必要があります。 詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノロジーコミュニティ https://harmonyos..com |