アクティビティ¶
Activity は、特定のタスクを担当するアプリケーションUIの一部です。例えば、メディアプレーヤーアプリケーションには、ラジオ、ミュージックプレーヤー、AUXといったアクティビティが含まれることがあります。
しかし、アクティビティは、メディアプレーヤーでユーザーが音量を変更したときにのみ表示されるポップアップ音量インジケーターのアクティビティのような小さなタスクである場合もあります。アクティビティは視覚的であることもありますが、必ずしもそうである必要はありません。たとえば、視覚的なアクティビティはポップアップウィンドウを表示するためにプレハブをインスタンス化することができますが、視覚的でないアクティビティは他のアクティビティに関係なくバックグラウンドで音楽を再生する音楽再生であることができます。
Activity Host は、そのアクティビティがアクティブになる条件を定義します。Kanzi には、次のアクティビティホストがあります。
Exclusive Activity Host と Data-Driven Exclusive Activity Host は、その子アクティビティのうち一つだけをアクティブにすることができます。データ駆動型排他アクティビティホストまたは排他アクティビティホストの子アクティビティの一つがアクティブな場合、そのアクティビティホストの他のすべてのアクティビティは非アクティブになります。
例えば、アプリケーション内でビューを切り替えるために、Data-Driven Exclusive Activity Host または Exclusive Activity Host を使用することができます。エクスクルーシブアクティビティホスト と データ駆動型エクスクルーシブアクティビティホスト を参照してください。
エクスクルーシブアクティビティホスト
データ駆動型エクスクルーシブアクティビティホスト
Parallel Activity Host は、複数の子アクティビティを同時にアクティブ化できます。アクティビティをアクティブ化すると、パラレルアクティビティホストがそのアクティビティを前面に表示します。パラレルアクティビティホストでは、アクティビティをグループ化して、アクティビティツリーで定義した順序でグループを表示できます。グループ内のアクティビティをアクティブ化すると、パラレルアクティビティホストがそのグループ内のアクティビティを前面に表示します。
例えば、この方法を使用すると、エンジン故障のような重要なメッセージを、電話の着信通知のような通常の通知の前に表示することができます。どちらのグループでも、Parallel Activity Host はアクティビティをアクティベーションの順に表示します。パラレルアクティビティホスト を参照してください。
アクティビティホストにアクティビティをリアルタイムで追加できます。これにより、Kanzi Engine APIを使用してアクティビティを生成したり、アプリケーションに別のアプリケーションを追加したりすることができます。この場合、アクティビティの構造はアプリケーションを実行するまで不明です。例えば、Kanzi Engine APIを使用して、ユーザーに表示したい多数のメニューページを生成することができます。
アクティビティのステータスマネジメント¶
各アクティビティには、そのアクティビティの状態を示す 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 を設定するには、
Exclusive Activity Host または Parallel Activity Host で、Activity の InitiallyActive プロパティを設定します。最初にアクティブにするアクティビティの設定 と 初期状態でアクティブなアクティビティの設定 を参照してください。
Data-Driven Exclusive Activity Host では、Active Activity Index プロパティを使用します。Active Activity Index プロパティの値は、Data-Driven Exclusive Activity Host がアクティビティを作成するために使用するリストデータオブジェクト内のアイテムを指します。
アクティビティ遷移¶
これらのトランジションは、アクティビティトランジションを定義します。
Active -> Deactivating
Deactivating -> Inactive
Inactive -> Activating
Activating -> Active
ステータスの変更中、アクティビティはこれらの遷移を使用し、中間のアクティベーティングおよびディアクティベーティング状態を含む遷移を含みます。これらの中間状態をスキップする遷移、例えば Active -> Inactive (ディアクティベーティング状態なし)や Inactive -> Active (アクティベーティング状態なし)は、たとえ作成しても発生しません。
Activity ツリーで、子 Activity を持つ Activity を非アクティブ化すると、Activity Host は Active -> Deactivating と Deactivating -> Inactive のトランジションを適用せずに、子 Activity を即座に非アクティブ化します。これらのトランジションがスキップされても、ステータスメッセージはスキップされません。各子 Activity は引き続き ActivityConcept::ActivityDeactivatedMessage と ActivityConcept::StatusChangedMessage メッセージを送信し、その Deactivated トリガーも実行されます。一方、子 Activity を持つ Activity をアクティブ化すると、Activity Host は Inactive -> Activating と Activating -> Active のトランジションを適用して子 Activity をアクティブ化します。
アクティビティ間の遷移を作成する方法を学ぶには、アクティビティ間の遷移を作成する を参照してください。
Data-Driven Exclusive Activity Host ノードおよび Exclusive Activity Host ノードでは、アクティビティ間の遷移は次のように進行します。
アクティビティ 1: ステータスは Active です。
アクティビティ2: アクティビティが読み込まれていません。
アクティビティ1: State Manager が Active -> Deactivating トランジションアニメーションを再生します(ある場合)。Activity Host が
ActivityConcept::ActivityDeactivatingMessageとActivityConcept::StatusChangedMessageメッセージを送信します。アクティビティ2: Activity Host はアクティビティのリソースをロードします。
アクティビティ1: ステータスはDeactivatingです。
アクティビティ2: ステータスはInactiveです。
アクティビティ1: State Manager が Deactivating -> Inactive トランジションアニメーションを再生します(ある場合)。Activity Host が
ActivityConcept::ActivityDeactivatedMessageとActivityConcept::StatusChangedMessageメッセージを送信します。アクティビティ2: State Manager が Inactive -> Activating トランジションアニメーションを再生します(ある場合)。Activity Host が
ActivityConcept::ActivityActivatingMessageとActivityConcept::StatusChangedMessageメッセージを送信します。アクティビティ1: ステータスはInactiveです。
アクティビティ2: ステータスはActivatingです。
アクティビティ1: Activity Host はアクティビティのリソースをアンロードします。
アクティビティ2: State Manager が Activating -> Active トランジションアニメーションを再生します(ある場合)。Activity Host が
ActivityConcept::ActivityActivatedMessageとActivityConcept::StatusChangedMessageメッセージを送信します。アクティビティ1: アクティビティはアンロードされました。
アクティビティ2: ステータスはActiveです。
アクティビティのデータとロジックプログラミング¶
各アクティビティごとに、そのアクティビティに特有のプロパティを定義することができます。これらのプロパティはアクティビティプロパティと呼ばれます。例えば、音楽プレーヤーのアクティビティでは、音楽のオンオフを切り替えたり、音量レベルを変更したりすることができます。
アクティビティノードにプロパティを手動で作成する場合、そのプロパティの名前空間を 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 でのアクティビティの永続性の制御、および データ駆動型エクスクルーシブアクティビティホストでのアクティビティの永続性の制御 を参照してください。
アクティビティのライフサイクルについて¶
アクティビティをアクティブ化および非アクティブ化すると、Kanzi は各アクティビティに対して一連のアタッチとステータスの変更を順に行います。信頼性の高い Code Behind とトリガーを作成するには、これらの変更の順序を理解する必要があります。
アクティビティノードのアタッチ¶
Kanzi はノードをアタッチするとき、まず中間の Attaching ステートを設定し、onAttached チェーン全体を実行して、そのチェーンが戻った後にのみ Attached ステートを設定します。このため、onAttached 内でアタッチ済みステートを照会すると false が返されます。
onAttached 内でノードがアタッチ中またはアタッチ済みであることを検出するには、アタッチ済みステート (Node::isAttached) とアタッチ中ステート (Node::isAttaching) の両方をチェックします。たとえば isAttached() || isAttaching() のようにします。
アクティビティノードの場合、Kanzi は ActivityElementImpl::onAttachedOverride オーバーライドを実行する直前に ActivityElement.Attached プロパティも true に設定します。このプロパティはランタイムでのみ使用でき、Kanzi Studio には表示されません。
ActivityElement.Attached プロパティは、Kanzi がノードをアクティビティツリーの有効な要素として登録しているかどうかを示します。これはノードのアタッチとは異なります。Kanzi がコンテンツを保持するアクティビティを非表示にすると、ノードはアタッチされたまま、このプロパティは false に設定されます。Kanzi がそのアクティビティを再び表示すると、ActivityElementImpl::onAttachedOverride オーバーライドを実行せずにこのプロパティを true に設定します。
アタッチとアクティブ化の順序について¶
アクティビティのプレハブとそのリソースは非同期にロードされます。Kanzi はロードが完了するとアクティビティノードをアタッチし、ステータスマシンが Active ステートに達した後にのみ ActivityConcept::ActivityActivatedMessage をディスパッチします。アクティビティノードのアタッチは常にアクティブ化より先に行われ、ロードが遅い場合は両者の間隔が広がるだけです。アクティビティのステータスステートとそれらの間のトランジションについては、アクティビティ遷移 を参照してください。
ライフサイクル内の定められた時点でロジックを実行するには、アタッチに反応するのではなく、ライフサイクルメッセージをサブスクライブします。
アクティブ化されたアクティビティのプレハブがノードツリーにアタッチされたときにロジックを実行するには、
ActivityHostConcept::ActivityPrefabAttachedMessageを使用します。アクティビティホストトリガー を参照してください。アクティビティの各ステータストランジションに反応するには、対応するアクティビティトリガーとそのメッセージ (Activating、Activated、Deactivating、Deactivated) を使用します。アクティビティがアクティブになったときにロジックを実行するには、Activated (
ActivityConcept::ActivityActivatedMessage) を使用します。アクティビティトリガー を参照してください。
どの子アクティビティをアクティブにするかを制御するには、トリガー、Data Trigger、または ActivityHostConcept::ActivateActivityMessage メッセージと ActivityHostConcept::DeactivateActivityMessage メッセージを使用した Kanzi Engine API を使用します。アクティビティのアクティベーション、パラレルアクティビティホスト、データ駆動型エクスクルーシブアクティビティホスト、および データトリガー を参照してください。
関連項目¶
チュートリアル: C++コードビハインドでアクティビティをプログラムする