AbilitySlice of Hongmeng Intermediateの詳細な使用(HarmonyOS Hongmeng開発の基本的な知識)

能力スライス

ページテンプレートを使用するアビリティの基本単位として、アビリティスライスはサービスロジックとUI表示用のキャリアを備えた機能を提供します。
機能は複数の機能スライスを持つことができます。デフォルトの能力スライスを指定するには、Ability#onStart(Intent)メソッドをオーバーライドする必要があります。Ability#setMainRoute(String)を使用して、このデフォルトルートを指定します。

AbilitySliceクラスを継承して独自のアビリティスライスを実装し、そのUIをonStart(ohos.aafwk.content.Intent)メソッドで設定できます。setUIContent(ohos.agp.components.ComponentContainer)またはsetUIContent(int)を使用してUIを設定できます。通常、機能スライスのライフサイクル全体で、UIを設定する必要があるのは1回だけです。サンプルコード:

 public class MyAbilitySlice extends AbilitySlice {
     protected void onStart(Intent intent) {
         super.onStart(intent);
         // setup UI content from a layout resource
         setUIContent(R.res.layout);
     }
 }

上記のコードは、実行時にエントリルートのみを定義します。機能の機能を他の機能に公開するには、操作フィールドを構成ファイルconfig.jsonに登録する必要があります。サンプルコード:

 {
     "module":{
         ...
         "abilities":[
           {
               ...
               "description": "Main ability of hiworld",
               "name": ".MainAbility",
               "label": "main ability",
               "icon": "main-ability.png",
               "type": "page",
               "visible": true,
               "orientation": "unspecified",
               "launch-mode": "standard",
               "skills"[
                   {
                       "actions":[
                           "action.pay",
                           "action.scan"
                       ]
                   }
               ]
               ...
           }
         ]
         ...
     }
 }
 

上記の方法でサポートされているアクションを登録した後、他のアビリティは指定されたアクションを通じて自分のアビリティを使用し、対応するアビリティスライスを直接開くことができます。サンプルコード:

     
     Intent intent = new Intent();
     Operation operation = new Intent.OperationBuilder()
             .withAction("action.pay")
             .withDeviceId("")
             .withBundleName("xxx")
             .withAbilityName("yyy")
             .build();
     intent.setOperation(operation);
     startAbility(intent);
     

AbilitySliceライフサイクル

機能スライスのライフサイクルは、それを運ぶ機能に関連しています。関数スライスには、ホスト関数と同じライフサイクル状態とライフサイクルコールバックメソッドがあります。能力のライフサイクル状態が変更されると、その能力スライスは同じ変更を受け、同じコールバックメソッドが呼び出されます。機能スライスは、独立したライフサイクルの変更を持つこともできます。この独立した変化は、能力の切り替え中に切り替わります。ただし、このような切り替えは、ホストの機能のライフサイクルには影響しません。

機能スライスには、次の4つのライフサイクル状態があります。

  • 初期:機能スライスがメモリに読み込まれましたが、実行されていません。これは、すべての機能スライスの初期状態です。
  • 非アクティブ:機能スライスが読み込まれて実行されますが、インタラクティブではありません。通常、これは機能スライスがアクティブまたはバックグラウンドになる前の中間状態です。この状態では、機能スライスのUIは表示されている可能性がありますが、入力イベントを受け取ることはできません。
  • アクティビティ:アビリティスライスは表示され、インタラクティブです。機能スライスにフォーカスがあると思います。
  • 背景:機能スライスは表示されません。ホスト能力もバックグラウンドにある場合、メモリが不足すると能力と能力スライスが破壊されます。
    関数と同様に、関数スライスは次のライフサイクルコールバックメソッドを提供します。それらを上書きできます。
 
  public class MainAbilitySlice extends AbilitySlice {
      protected void onStart(Intent intent);
 
      protected void onActive();
 
      protected void onInactive();
 
      protected void onForeground(Intent intent);
 
      protected void onBackground();
 
      protected void onStop();
  }
 
 

次の図は、機能スライスの完全なライフサイクルを示しています。機能スライスは、常に1つの状態にしかできません。すべての州が直接移行をサポートしているわけではありません。

image.png

注:onStart(ohos.aafwk.content.Intent)メソッドは、ライフサイクル全体で1回だけ呼び出すことができます。

各ライフサイクルコールバックメソッドの意味といくつかのベストプラクティスの提案を以下に示します。

  • onStart(ohos.aafwk.content.Intent):このメソッドは、setUIContent(int)などのUI初期設定用に実装する必要があります。このメソッドは、ライフサイクル全体で1回だけ呼び出すことができます。呼び出し元は、Intentクラスを使用していくつかのカスタムキーを保持し、インテントが提供するメソッドを通じてこれらのパラメーターを取得できます。
  • onActive():このメソッドは、関数の一部がアクティブ状態に戻ったときに呼び出されます。コールバック後、UIはインタラクティブになります。
  • onInactive():このメソッドは、機能スライスが完全または部分的にカバーされたときに呼び出されます。コールバック後、UIはインタラクティブではありません。
  • onForeground(ohos.aafwk.content.Intent)()}:このメソッドは、長編映画がフォアグラウンドに戻ったときに呼び出されます。アプリケーションの対話ロジックは、コールバックで復元または初期化できます。アビリティスライスがフォアグラウンドに戻るときに新しいカスタムパラメーターを指定する必要がある場合は、新しいインテンションパラメーターを送信できます。
  • onBackground():このメソッドは、機能スライスがバックグラウンドに入るときに呼び出されます。この状態では、システムがバックグラウンドプログラムをいつでも停止する可能性があるため、バックグラウンドタスクを長時間実行することはできません。
  • onStop():このメソッドを呼び出して、機能スライスを破棄します。このメソッドを使用して、リソースを再利用できます。
    機能スライス間の切り替え
    現在の(ohos.aafwk.ability.AbilitySlice、ohos.aafwk.content.Intent)メソッドを使用して新しい機能スライスを提示し、Intentを使用してカスタムパラメータを送信できます。サンプルコード:
 
     Button button = new Button(this);
     button.setClickedListener(listener -> {
         AbilitySlice targetSlice = new MyAbilitySlice();
         Intent intent = new Intent();
         intent.setParam("value", 10);
         present(targetSlice, intent);
     });
 

注:最大1024個のアビリティスライスを1つのアビリティに表示できます。1025番目のアビリティスライスを表示しようとすると、システムはアビリティを強制的にクラッシュさせます。これを回避するには、多数の機能スライスを同時に表示する必要がある場合、コードを改善する必要があります。


無断転載禁止


より技術的な交換のために、QQグループに参加してください

グループ名:harmonyos Hongmeng Technology Exchange
グループ番号:856567895


HarmonyOS Hongmeng 2.0開発をゼロから学ぶ

おすすめ

転載: blog.csdn.net/iCloudEnd/article/details/108734793