アクティビティ

Activity は、特定のタスクを担当するアプリケーションUIの一部です。例えば、メディアプレーヤーアプリケーションには、ラジオ、ミュージックプレーヤー、AUXといったアクティビティが含まれることがあります。

しかし、アクティビティは、メディアプレーヤーでユーザーが音量を変更したときにのみ表示されるポップアップ音量インジケーターのアクティビティのような小さなタスクである場合もあります。アクティビティは視覚的であることもありますが、必ずしもそうである必要はありません。たとえば、視覚的なアクティビティはポップアップウィンドウを表示するためにプレハブをインスタンス化することができますが、視覚的でないアクティビティは他のアクティビティに関係なくバックグラウンドで音楽を再生する音楽再生であることができます。

Activity Host は、そのアクティビティがアクティブになる条件を定義します。Kanzi には、次のアクティビティホストがあります。

  • Exclusive Activity Host と Data-Driven Exclusive Activity Host は、その子アクティビティのうち一つだけをアクティブにすることができます。データ駆動型排他アクティビティホストまたは排他アクティビティホストの子アクティビティの一つがアクティブな場合、そのアクティビティホストの他のすべてのアクティビティは非アクティブになります。

    例えば、アプリケーション内でビューを切り替えるために、Data-Driven Exclusive Activity Host または Exclusive Activity Host を使用することができます。エクスクルーシブアクティビティホスト と データ駆動型エクスクルーシブアクティビティホスト を参照してください。

    エクスクルーシブアクティビティホスト

    ../../_images/exclusive-activity-host.gif

    データ駆動型エクスクルーシブアクティビティホスト

    ../../_images/data-driven-exclusive-activity-host.gif
  • Parallel Activity Host は、複数の子アクティビティを同時にアクティブ化できます。アクティビティをアクティブ化すると、パラレルアクティビティホストがそのアクティビティを前面に表示します。パラレルアクティビティホストでは、アクティビティをグループ化して、アクティビティツリーで定義した順序でグループを表示できます。グループ内のアクティビティをアクティブ化すると、パラレルアクティビティホストがそのグループ内のアクティビティを前面に表示します。

    例えば、この方法を使用すると、エンジン故障のような重要なメッセージを、電話の着信通知のような通常の通知の前に表示することができます。どちらのグループでも、Parallel Activity Host はアクティビティをアクティベーションの順に表示します。パラレルアクティビティホスト を参照してください。

    ../../_images/parallel-activity-host.gif

アクティビティホストにアクティビティをリアルタイムで追加できます。これにより、Kanzi Engine APIを使用してアクティビティを生成したり、アプリケーションに別のアプリケーションを追加したりすることができます。この場合、アクティビティの構造はアプリケーションを実行するまで不明です。例えば、Kanzi Engine APIを使用して、ユーザーに表示したい多数のメニューページを生成することができます。

アプリケーションUI構造とナビゲーション

アクティビティ、データ駆動型エクスクルーシブアクティビティホスト、エクスクルーシブアクティビティホスト、およびパラレルアクティビティホストを組み合わせることで、アプリケーション内でユーザーがナビゲートできるUIを作成できます。ユーザーの操作やアプリケーションに届くデータの変化に反応してアクティビティをアクティブ化および非アクティブ化することで、アプリケーションビューを切り替えたり、ポップアップウィンドウのような異なるアプリケーションレイヤーを表示したりします。これにより、アプリケーションUIのどの部分をユーザーが閲覧および操作できるかを制御できます。

アクティビティ、データ駆動型エクスクルーシブアクティビティホスト、エクスクルーシブアクティビティホスト、およびパラレルアクティビティホストを使用して、ナビゲーショングラフを形成します。アクティビティはコンテンツ要素を定義し、アクティビティホストはアプリケーションUIのナビゲーションパターンを定義します。各アクティビティホストでは、アクティビティを使用して、アクティビティホストが表すアプリケーション内のUIコンテンツを作成します。たとえば、アクティビティホストとアクティビティを使用して、アプリケーション内でメディアプレーヤー、連絡先、電話ビューなどの異なるビューを表示したり、ポップアップウィンドウでコンテンツを表示したりするようにUIを整理できます。

アクティビティホストを使用して、アクティビティをアクティブ化および非アクティブ化します。

  • アクティビティがアクティブな場合、アクティビティプレハブはノードツリーにアタッチされ、表示され、ユーザーはそのコンテンツと対話できます。

  • アクティビティが非アクティブな場合、アクティビティのプレハブはノードツリーにアタッチされず、表示されず、ユーザーはそのコンテンツと対話することができません。

アクティビティノードとアクティビティホストノードは、ContentLayout2D クラスと ContentLayout3D クラスを継承して、Content Layout ノードのようにコンテンツを配置します。Content Layout ノードを使用する を参照してください。

アクティビティのステータスマネジメント

各アクティビティには、そのアクティビティの状態を示す Activity Status プロパティがあります。アクティビティがアクティブまたは非アクティブになると、Activity Status プロパティが変化し、アプリケーション内でこれらの変化に反応することができます。アクティビティをアクティブにすると、そのアクティビティホストがアクティビティプレハブをインスタンス化します。アクティビティを非アクティブにすると、そのアクティビティホストがノードツリーからアクティビティプレハブを削除します。

Activity Status プロパティは、これらの状態を定義します。

アクティビティステータス

ディスクリプション (Description)

アクティブ

アクティビティはアクティブで、そのコンテンツを表示しています。

非アクティブ化

アクティビティが非アクティブ状態に移行しています。

この状態は、Data-Driven Exclusive Activity Host と Exclusive Activity Host の遷移アニメーションを同期するために使用されます。

非アクティブな

アクティビティは非アクティブであり、そのコンテンツを表示しません。

アクティベート中

アクティビティがアクティブ状態に移行しています。

この状態は、Data-Driven Exclusive Activity Host と Exclusive Activity Host の遷移アニメーションを同期するために使用されます。

Data-Driven Exclusive Activity Host ノードおよび Exclusive Activity Host ノードで:

  • 一度にアクティブにできる子アクティビティは1つだけです。

  • 1つのアクティビティが非アクティブ化状態にある間、別のアクティビティが同時にアクティブ化状態にあることができます。

Parallel Activity Host ノードでは、複数のアクティビティが同時にアクティブ状態になることができるため、どのアクティビティも任意の状態になることができます。

Activity Host がアクティブになったときにアクティブにする Activity を設定するには、

アクティビティ遷移

これらのトランジションは、アクティビティトランジションを定義します。

  • Active -> Deactivating

  • Deactivating -> Inactive

  • Inactive -> Activating

  • Activating -> Active

ステータスの変更中、アクティビティはこれらの遷移を使用し、中間のアクティベーティングおよびディアクティベーティング状態を含む遷移を含みます。これらの中間状態をスキップする遷移、例えば Active -> Inactive (ディアクティベーティング状態なし)や Inactive -> Active (アクティベーティング状態なし)は、たとえ作成しても発生しません。

../../_images/transitions-between-statuses.svg

アクティビティツリーで子アクティビティを持つアクティビティを非アクティブ化すると、Activity Host は Active -> Deactivating および Deactivating -> Inactive トランジションを適用せずに、子アクティビティを即座に非アクティブ化します。一方、子アクティビティを持つアクティビティをアクティブ化すると、Activity Host は Inactive -> Activating および Activating -> Active トランジションを適用して子アクティビティをアクティブ化します。

アクティビティ間の遷移を作成する方法を学ぶには、アクティビティ間の遷移を作成する を参照してください。

Data-Driven Exclusive Activity Host ノードおよび Exclusive Activity Host ノードでは、アクティビティ間の遷移は次のように進行します。

  1. アクティビティ 1: ステータスは Active です。

    アクティビティ2: アクティビティが読み込まれていません。

  2. アクティビティ1: State Manager が Active -> Deactivating トランジションアニメーションを再生します(ある場合)。Activity Host が ActivityConcept::ActivityDeactivatingMessage と ActivityConcept::StatusChangedMessage メッセージを送信します。

    アクティビティ2: Activity Host はアクティビティのリソースをロードします。

  3. アクティビティ1: ステータスはDeactivatingです。

    アクティビティ2: ステータスはInactiveです。

  4. アクティビティ1: State Manager が Deactivating -> Inactive トランジションアニメーションを再生します(ある場合)。Activity Host が ActivityConcept::ActivityDeactivatedMessage と ActivityConcept::StatusChangedMessage メッセージを送信します。

    アクティビティ2: State Manager が Inactive -> Activating トランジションアニメーションを再生します(ある場合)。Activity Host が ActivityConcept::ActivityActivatingMessage と ActivityConcept::StatusChangedMessage メッセージを送信します。

  5. アクティビティ1: ステータスはInactiveです。

    アクティビティ2: ステータスはActivatingです。

  6. アクティビティ1: Activity Host はアクティビティのリソースをアンロードします。

    アクティビティ2: State Manager が Activating -> Active トランジションアニメーションを再生します(ある場合)。Activity Host が ActivityConcept::ActivityActivatingMessage と ActivityConcept::StatusChangedMessage メッセージを送信します。

  7. アクティビティ1: アクティビティはアンロードされました。

    アクティビティ2: ステータスはActiveです。

../../_images/eah-ddeah-activity-transitions.svg../../_images/activity-transition-steps.gif

アクティビティのデータとロジックプログラミング

各アクティビティごとに、そのアクティビティに特有のプロパティを定義することができます。これらのプロパティはアクティビティプロパティと呼ばれます。例えば、音楽プレーヤーのアクティビティでは、音楽のオンオフを切り替えたり、音量レベルを変更したりすることができます。

アクティビティノードにプロパティを手動で作成する場合、そのプロパティの名前空間を ActivityProperty に設定します。int、bool、float、およびenumデータ型のプロパティを作成できます。アクティビティに Code Behind を使用する場合、Kanzi はそのアクティビティのプロパティを Code Behind に追加します。

アクティビティプロパティの値は、Kanzi アプリケーションのステートマシンとロジックを実装します。そのため、Kanzi はアクティビティが非アクティブ化されてもこれらのプロパティの値を保持します。Kanzi がアクティビティを非アクティブ化すると、そのアクティビティのアクティビティプロパティをシリアライズし、Kanzi がそのアクティビティをアクティブ化すると、そのアクティビティの状態をデシリアライズしてアクティビティプロパティの値を復元します。

アクティビティのプログラミングロジックの詳細については、コードビハインドを使用したプログラミングアクティビティ を参照してください。

仮想化

Activity の仮想化の主な目的は、アプリケーションのメモリ消費を効率的に管理することです。アプリケーション全体のナビゲーショングラフは大きくなる可能性があるため、UI とアセットを常にメモリに読み込んだままにしておくことはほとんどの場合現実的ではありません。

Activity をアクティブ化すると、その Activity Host はプレハブを動的に読み込み、必要なリソースを非同期で読み込みます。非アクティブ化時には、Activity Host は Activity をノードツリーから切り離し、Activity インスタンスを削除します。

デフォルトでは、取得したリソースはメモリに残ります。この動作を変更するには、Activity Browser で OptimizeMemory プロパティを有効にします。有効にすると、Kanzi はそれらの Activity のためにプリロードされたリソースを自動的にアンロードします。

ResourceManager::purge を呼び出して、非アクティブ化された Activity のリソースを解放することもできます。

仮想化の制御

デフォルトで、アクティビティを非アクティブ化すると、Kanzi はそのアクティビティおよびその子アクティビティのアクティビティプロパティの値をシリアライズします。追加したアクティビティプロパティの値に加えて、アクティビティのフォーカスとアクティブ化状態に関する情報も含まれます。Kanzi は、他の非アクティビティプロパティのランタイム状態をシリアライズしないことに注意してください。

非アクティブ化されたアクティビティをアクティブ化すると、Kanzi はそのアクティビティとその子アクティビティのアクティビティプロパティの値を復元します。仮想化を無効にすると、Kanzi はアクティビティプロパティの値を保持しません。

アクティビティをアクティブ化する前または非アクティブ化した後に、そのアクティビティのシリアライズされた状態をリセットすることもできます。デフォルトで、Kanzi はシリアライズされた状態を復元します。

排他的アクティビティホストでの仮想化の制御 と Parallel Activity Host での仮想化の制御 を参照してください。

Activity の永続化

デフォルトでは、Activity を非アクティブ化すると、Kanzi は Activity をノードツリーから切り離し、Activity インスタンスを削除します。Activity が非アクティブ化されたときに Activity インスタンスを保持するように Kanzi を設定できます。そのような Activity を再度アクティブ化すると、その Activity の仮想化を無効にしている場合でも、Kanzi は Activity ノードを非アクティブ化前と同じ状態に復元します。これにより、Activity を再度アクティブ化するときに Activity のインスタンス化を省略できます。

エクスクルーシブアクティビティホストでのアクティビティの永続性の制御、Parallel Activity Host でのアクティビティの永続性の制御、および データ駆動型エクスクルーシブアクティビティホストでのアクティビティの永続性の制御 を参照してください。

関連項目

アクティビティブラウザの使用

アクティビティ間の遷移を作成する

チュートリアル: アプリケーションUIの構造

チュートリアル: アプリケーションUIを制御する

チュートリアル: データソースからUIを生成する

チュートリアル: C++コードビハインドでアクティビティをプログラムする