HarmonyOS実践ガイド:Stageモデル(UIAbilityコンポーネント)

export default class EntryAbility extends UIAbility {
onForeground() {
// アプリケーションがフォアグラウンドになった際の処理
// 必要なシステムリソースの取得、またはバックグラウンドで解放されたリソースの再取得
}

onBackground() {
    // アプリケーションがバックグラウンドになった際の処理
    // UIが非表示状態になる不要なリソースの解放、または状態保存などの処理
}

}


##### ☀️2.1.4 Destroy状態


Destroy状態は、アプリケーションが完全に破棄された状態を指します。アプリケーションがDestroy状態にある場合、そのすべてのリソースが解放され、活動は一切行われていません。これは、アプリケーションがシステムのアクティブスタックに存在せず、戻るキーや他の方法で再び入力できないことを意味します。


Destroy状態では、システムはアプリケーションのメモリや他のリソースを回收し、他のアプリケーションやシステムにより多くのリソースを提供できるようにする場合があります。Destroy状態では、アプリケーションのライフサイクルは終了しており、ユーザーには表示されません。


Destroy状態は通常、以下の場合に発生します:


* ユーザーが手動でアプリケーションを閉じる
* システムリソースが不足し、アプリケーションのリソースを回收する必要がある
* アプリケーションが異常またはエラーによりシステムによって強制的に破棄される


HarmonyOSでは、アプリケーションのDestroy状態は、Active、Inactive、Pausedなどの他の状態と相互に変換し、完全なアプリケーションライフサイクルを構成します。




import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
onDestroy() {
// システムリソースの解放、データの保存など
}
}


### 3.起動モード


#### 🦋3.1 singleton(シングルトンモード)


シングルトンモードは、インスタンスの作成を1つに限定するデザインパターンです。シングルトンモードでは、クラスは1つのオブジェクトのみを作成でき、そのオブジェクトにアクセスするためのグローバルアクセスポイントを提供します。


シングルトンモードを使用する主な目的は、アプリケーション全体で1つのインスタンスしか存在しないことを保証することです。これにより、システムリソースを節約し、そのインスタンスへのアクセスを簡単に制御できます。


シングルトンモードは通常、以下の方法で実装されます:


1. プライベートコンストラクタ:クラスのコンストラクタをプライベートに設定し、他のクラスが直接このクラスのインスタンスを作成できないようにします。
2. 静的メソッドまたはプロパティを提供してインスタンスを取得:直接インスタンスを作成できないため、静的メソッドまたはプロパティを提供してクラスの唯一のインスタンスを取得します。このメソッドまたはプロパティは、最初の呼び出し時にインスタンスを作成し、それ以降の呼び出しでは同じインスタンスを返します。
3. スレッドセーフティ:マルチスレッド環境では、複数のスレッドが同時にインスタンス取得メソッドを呼び出し、インスタンスの作成を試みる可能性があります。スレッドセーフティを確保するために、同期ロックまたはダブルチェックロック機構を使用して、1つのスレッドのみがインスタンスを作成できるようにします。


シングルトンモードを使用する際の注意点:


1. シングルトンモードはグローバル状態を導入し、システムの複雑さと結合度を増加させる可能性があります。
2. シングルトンモードは、複数のインスタンスが必要なシナリオには適していません。
3. シングルトンモードは、インスタンスがアプリケーションのライフサイクル全体で存在し続ける可能性があるため、メモリリークの原因となる可能性があります。
4. シングルトンモードは、テスト中にインスタンスが共有されるため、テスト結果が他のテストケースに影響を受ける可能性があるため、コードのテスト可能性に影響を与える可能性があります。


HarmonyOSでは、startAbility()メソッドを呼び出すたびに、アプリケーションプロセスにそのタイプのUIAbilityインスタンスが既に存在する場合、システムのUIAbilityインスタンスを再利用します。システムにはそのタイプのUIAbilityインスタンスが1つしか存在せず、最近のタスクリストには1つしか存在しません。


シングルトンモードの設定は以下の通りです:




{
"module": {
// ...
"abilities": [
{
"launchType": "singleton",
// ...
}
]
}
}


#### 🦋3.2 multiton(マルチトンモード)


マルチトン(Multiton)は、デザインパターンの一種であり、シングルトンパターンの一変形です。シングルトンパターンではクラスは1つのインスタンスしか持てませんが、マルチトンパターンではクラスは複数のインスタンスを持つことができ、各インスタンスは異なる識別子またはキー値を持つことができます。各インスタンスは独立してアクセスでき、辞書構造に似ています。異なるキー値に基づいて対応するインスタンスを取得できます。


マルチトンパターンは、有限で確定した数のクラスインスタンスを作成する必要があるシナリオで使用されます。各インスタンスは独自の状態と動作を持っていますが、一部の共通リソースを共有して協力することができます。マルチトンパターンは、各インスタンスの独立性を保ちながら、より大きな柔軟性と拡張性を提供します。


マルチトンパターンは、辞書またはマッピング構造を使用して各インスタンスのコレクションを維持し、一意のキー値を使用して各インスタンスを識別します。インスタンスを取得する必要がある場合、提供されたキー値に基づいてコレクションから対応するインスタンスを取得します。コレクションに対応するインスタンスが存在しない場合、新しいインスタンスを作成してコレクションに追加します。


マルチトンパターンの利点には、複数のインスタンスを柔軟に管理およびアクセスでき、より細かい粒度の制御を提供することがあります。一方で、追加の管理と維持作業が必要となり、メモリ使用量が増加する可能性もあります。したがって、マルチトンパターンを使用する際は、具体的な要件とシナリオに基づいてバランスを取る必要があります。


マルチトンモードの設定は以下の通りです:




{
"module": {
// ...
"abilities": [
{
"launchType": "multiton",
// ...
}
]
}
}


#### 🦋3.3 specified(指定インスタンスモード)


指定インスタンスモード(specified instance pattern)は、クラスに固定数のインスタンスしか持てないように制限するために使用されます。このモードでは、クラスのインスタンスは事前に定義された数に制限され、実行時に作成または破棄することはできません。


指定インスタンスモードは、クラスのインスタンス数を制限する必要があるシナリオでよく使用されます。例えば、データベース接続プールの実装では、指定インスタンスモードを使用して接続数を制限し、過剰な接続の作成を防ぎます。もう一つの例はスレッドプールで、指定インスタンスモードを使用してスレッド数を制限します。


指定インスタンスモードでは、通常、内部のインスタンスリストを維持して、作成されたインスタンスを追跡します。インスタンスを取得する必要がある場合、まずこのリストをチェックします。リストに十分なインスタンスが既に存在する場合は、直接呼び出し元にインスタンスを返します。リストに十分なインスタンスが存在しない場合は、要件に基づいて新しいインスタンスを作成し、リストに追加します。インスタンスが不要になった場合、通常はリストから削除し、新しいインスタンスの作成を続けられるようにします。


指定インスタンスモードは、クラスのインスタンス数を効果的に制御し、リソースの浪費や過剰なインスタンス作成の問題を回避します。ただし、インスタンス数が固定されているため、競合条件やリソースのボトルネックの問題が発生する可能性があり、適切な設計とチューニングが必要です。


指定インスタンスモードの設定は以下の通りです:




{
"module": {
// ...
"abilities": [
{
"launchType": "specified",
// ...
}
]
}
}


#### 🦋3.3.1 指定インスタンスモードの実装例


例えば、EntryAbilityとFuncAbilityという2つのUIAbilityがあり、FuncAbilityが指定起動モードに設定されている場合、EntryAbilityのページからFuncAbilityを起動する方法を以下に示します。


1. FuncAbilityで、module.json5設定ファイルの"launchType"フィールドを"specified"に設定します。




{
"module": {
// ...
"abilities": [
{
"launchType": "specified",
// ...
}
]
}
}


2. EntryAbilityで、startAbility()メソッドを呼び出す際にwantパラメータにUIAbilityインスタンスを区別するためのカスタムパラメータ(例:"instanceKey")を追加します。




// 指定インスタンスモードのUIAbilityを起動する際、各UIAbilityインスタンスに独立したキー識別子を設定します
// 例えば、ドキュメント使用シナリオでは、ドキュメントパスをキー識別子として使用できます
function getInstanceKey() {
// ...
}

let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1', // moduleNameはオプションです
parameters: { // カスタム情報
instanceKey: getInstanceKey(),
},
}
// contextは呼び出し元UIAbilityのAbilityContextです
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((err) => {
// ...
})


3. UIAbilityパラメータの取得




import AbilityStage from '@ohos.app.ability.AbilityStage';

export default class MyAbilityStage extends AbilityStage {
onAcceptWant(want): string {
// 呼び出し先のAbilityStageで、起動モードがspecifiedのUIAbilityに対してUIAbilityインスタンスに対応するキー値を返します
// 現在の例はmodule1モジュールのFuncAbilityを指します
if (want.abilityName === 'FuncAbility') {
// 返される文字列キー識別子はカスタムで連結した文字列内容です
return ControlModule_EntryAbilityInstance_${want.parameters.instanceKey};
}

    return '';
}

}


### 4.基本的な使用方法


#### 🦋4.1 UIAbilityの起動ページの指定


UIAbilityの起動ページを指定するには、onWindowStageCreateライフサイクルメソッド内でwindowStage.loadContent()メソッドを使用します。




import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: Window.WindowStage) {
// メインウィンドウが作成されたので、このAbilityのメインページを設定します
windowStage.loadContent('pages/Index', (err, data) => {
// ...
});
}

// ...

}


#### 🦋4.2 UIAbilityのコンテキスト情報の取得


UIAbilityContextを使用して、UIAbilityの関連設定情報を取得できます。これには、パスコードパス、バンドル名、Ability名、アプリケーションが必要とする環境状態などの属性情報が含まれます。また、UIAbilityContextが提供するメソッドを使用してUIAbilityインスタンスを操作することもできます。例えば、startAbility()、connectServiceExtensionAbility()、terminateSelf()などです。




import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
// UIAbilityインスタンスのコンテキストを取得します
let abilityContext = this.context;

    // ...
}

}


ページ内での取得方法は以下の通りです:




import common from '@ohos.app.ability.common';

@Entry
@Component
struct IndexPage {
private context = getContext(this) as common.UIAbilityContext;

startAbilityTest() {
let wantInfo = {
// Wantパラメータ情報
};
this.context.startAbility(wantInfo);
}

// ページ表示
build() {
// ...
}
}


### 5.UIAbilityコンポーネントとUIのデータ同期


主に2つの方法があります:




| 方法 | 説明 |
| --- | --- |
| EventHub | パブリッシュ/サブスクライブモデルに基づいて実装され、イベントは先にサブスクライブしてからパブリッシュする必要があります。サブスクライバーはメッセージを受信した後に処理を実行します。 |
| globalThis | ArkTSエンジンインスタンス内のグローバルオブジェクトで、ArkTSエンジンインスタンス内のどこからでもアクセスできます。 |


#### 🦋5.1 EventHubを使用したデータ通信


1. イベントの登録(以下のいずれかを使用)




import UIAbility from '@ohos.app.ability.UIAbility';

const LOG_TAG: string = '[Example].[Entry].[EntryAbility]';

export default class EntryAbility extends UIAbility {
eventHandler(...data) {
// イベントをトリガーし、対応するビジネス操作を実行します
console.info(LOG_TAG, '1. ' + JSON.stringify(data));
}

onCreate(want, launch) {
    // eventHubを取得
    let eventHub = this.context.eventHub;
    // サブスクライブ操作を実行
    eventHub.on('customEvent', this.eventHandler);
    eventHub.on('customEvent', (...data) => {
        // イベントをトリガーし、対応するビジネス操作を実行
        console.info(LOG_TAG, '2. ' + JSON.stringify(data));
    });
}

}


2. イベントのトリガー




import common from '@ohos.app.ability.common';

@Entry
@Component
struct IndexPage {
private context = getContext(this) as common.UIAbilityContext;

triggerEvent() {
// パラメータなしでカスタム"customEvent"イベントをトリガー
this.context.eventHub.emit('customEvent');
// 1つのパラメータでカスタム"customEvent"イベントをトリガー
this.context.eventHub.emit('customEvent', 1);
// 2つのパラメータでカスタム"customEvent"イベントをトリガー
this.context.eventHub.emit('customEvent', 2, 'test');
// 開発者は実際のビジネスシナリオに基づいてイベント渡しのパラメータを設計できます
}

// ページ表示
build() {
// ...
}
}


3. イベントのキャンセル




// contextはUIAbilityインスタンスのAbilityContextです
this.context.eventHub.off('customEvent');


#### 🦋5.2 globalThisを使用したデータ同期


HarmonyOSでは、globalThisはグローバルオブジェクトであり、異なる環境でのグローバルオブジェクトにアクセスするための統一された方法を提供します。HarmonyOSでは、globalThisを使用して現在の実行環境のグローバルオブジェクトにアクセスできます。これは、ブラウザ環境のwindowオブジェクトでもNode.js環境のglobalオブジェクトでも構いません。


globalThisを使用すると、異なる環境で汎用的なコードを簡単に記述でき、特定の環境に対して特別な処理を行う必要がありません。例えば、globalThisを使用してグローバルのconsoleオブジェクトにアクセスし、ブラウザ環境でもNode.js環境でもconsole.log()を使用してログを出力できます。


実際のプログラミングでは、globalThisは汎用的なグローバルオブジェクトへのアクセス方法を提供しますが、具体的な環境に応じて対応するグローバルオブジェクトを使用することが推奨されます。


##### ☀️5.2.1 UIAbilityとPage間でのglobalThisの使用


1. 登録(UIAbility側)




import UIAbility from '@ohos.app.ability.UIAbility'

export default class EntryAbility extends UIAbility {
onCreate(want, launch) {
globalThis.abilityWantData = want;
// ...
}

// ...

}


2. 取得(Page側)




let abilityWantData;

@Entry
@Component
struct IndexPage {
aboutToAppear() {
abilityWantData = globalThis.abilityWantData;
}

// ページ表示
build() {
// ...
}
}


##### ☀️5.2.2 UIAbility間でのglobalThisの使用


1. 登録(AbilityA側)




import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityA extends UIAbility {
onCreate(want, launch) {
globalThis.abilityName = 'AbilityA'; // AbilityAが文字列"AbilityA"をglobalThisに保存
// ...
}
}


2. 取得(AbilityB側)




import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityB extends UIAbility {
onCreate(want, launch) {
// AbilityBがglobalThisからnameを読み出し出力
console.info('name from global ability: ' + globalThis.abilityName);
// ...
}
}


##### ☀️5.2.3 globalThis使用時の注意点


globalThisを使用する際の重要な注意点は、異なるUIAbility間で同じプロパティ名を使用すると、後から設定された値が前に設定された値を上書きしてしまうことです。これは、アプリケーションがバックグラウンドからフォアグラウンドに戻った際に予期しない動作を引き起こす可能性があります。


#### 🦋5.2.4 globalThis使用の具体例


以下にglobalThisの使用例を示します:


1. AbilityAファイルでglobalThisにUIAbilityContextを保存します。




import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityA extends UIAbility {
onCreate(want, launch) {
globalThis.abilityContext = this.context; // AbilityContextをglobalThisに保存
// ...
}
}


2. AbilityAのページでこのUIAbilityContextを取得して使用します。使用後、AbilityAインスタンスをバックグラウンドに切り替えます。




@Entry
@Component
struct IndexPage {
onPageShow() {
let context = globalThis.abilityContext; // globalThisからcontextを取得して使用
let permissions = ['com.example.permission']
context.requestPermissionsFromUser(permissions,(result) => {
// ...
});
}
// ページ表示
build() {
// ...
}
}


3. AbilityBファイルでglobalThisにUIAbilityContextを保存し、同じ名前を使用します。




import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityB extends UIAbility {
onCreate(want, launch) {
// AbilityBがglobalThisに保存されたcontextを上書きします
globalThis.abilityContext = this.context;
// ...
}
}


4. AbilityBのページでこのUIAbilityContextを取得して使用します。この時点で取得したglobalThis.abilityContextはAbilityBに設定されたUIAbilityContextを表します。




@Entry
@Component
struct IndexPage {
onPageShow() {
let context = globalThis.abilityContext; // globalThisからcontextを取得して使用
let permissions = ['com.example.permission']
context.requestPermissionsFromUser(permissions,(result) => {
console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
});
}
// ページ表示
build() {
// ...
}
}


5. AbilityBインスタンスをバックグラウンドに切り替え、AbilityAインスタンスをバックグラウンドからフォアグラウンドに切り替えます。この時点でAbilityAのonCreateライフサイクルは再度実行されません。




import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityA extends UIAbility {
onCreate(want, launch) { // AbilityAがバックグラウンドからフォアグラウンドに戻っても、このライフサイクルは再度実行されません
globalThis.abilityContext = this.context;
// ...
}
}


6. AbilityAのページが再びフォアグラウンドに戻ったとき、取得したglobalThis.abilityContextはAbilityBのUIAbilityContextを表しており、AbilityAのページで使用するとエラーが発生します。




@Entry
@Component
struct IndexPage {
onPageShow() {
let ctx = globalThis.abilityContext; // この時点でのglobalThisのcontextはAbilityBのcontextです
let permissions=['com.example.permission'];
ctx.requestPermissionsFromUser(permissions,(result) => { // このオブジェクトを使用するとプロセスがクラッシュします
console.info('requestPermissionsFromUser result:' + JSON.stringify(result));
});
}
// ページ表示
build() {
// ...
}
}


### 6.UIAbilityコンポーネント間の連携(デバイス内)


#### 🦋6.1 同じアプリ内のUIAbilityの起動


1. 呼び出し側(起動元)




let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1', // moduleNameはオプションです
parameters: { // カスタム情報
message: 'EntryAbility Indexページから',
},
}
// contextは呼び出し元UIAbilityのAbilityContextです
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((err) => {
// ...
})


2. 受け取り側(起動先)




import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';

export default class FuncAbility extends UIAbility {
onCreate(want, launchParam) {
// 呼び出し元UIAbilityから渡されたパラメータを受け取ります
let receivedWant = want;
let message = receivedWant?.parameters?.message;
// ...
}
}


FuncAbilityのビジネス処理が完了した後、現在のUIAbilityインスタンスを停止する必要がある場合は、FuncAbility内でterminateSelf()メソッドを呼び出して実現します。




// contextは停止するUIAbilityインスタンスのAbilityContextです
this.context.terminateSelf((err) => {
// ...
});


#### 🦋6.2 同じアプリ内のUIAbilityを起動して結果を取得


1. 呼び出し側(起動元)




let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1', // moduleNameはオプションです
parameters: { // カスタム情報
data: 'EntryAbility Indexページから',
},
}
// contextは呼び出し元UIAbilityのAbilityContextです
this.context.startAbilityForResult(wantInfo).then((result) => {
// ...
}).catch((err) => {
// ...
})


2. 受け取り側(起動先)




const RESULT_CODE: number = 1001;
let abilityResult = {
resultCode: RESULT_CODE,
want: {
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1',
parameters: {
response: 'FuncAbility Indexページから',
},
},
}
// contextは受け取り側UIAbilityのAbilityContextです
this.context.terminateSelfWithResult(abilityResult, (err) => {
// ...
});


3. 結果の取得(呼び出し側)




const RESULT_CODE: number = 1001;

// ...

// contextは呼び出し側UIAbilityのAbilityContextです
this.context.startAbilityForResult(want).then((data) => {
if (data?.resultCode === RESULT_CODE) {
// 受け取り側UIAbilityから返された情報を解析します
let response = data.want?.parameters?.response;
// ...
}
}).catch((err) => {
// ...
})


#### 🦋6.3 別のアプリのUIAbilityを起動


1. 受け取り側の設定情報




{
"module": {
"abilities": [
{
// ...
"skills": [
{
"entities": [
// ...
"entity.system.default"
],
"actions": [
// ...
"ohos.want.action.viewData"
]
}
]
}
]
}
}


2. 呼び出し側(起動元)




let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
// 特定のバンドルでのみ暗黙的にクエリを実行する場合は、以下のコメントを解除します。
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.viewData',
// entitiesは省略可能です。
entities: ['entity.system.default'],
}

// contextは呼び出し側UIAbilityのAbilityContextです
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((err) => {
// ...
})


処理が完了したら、受け取り側のUIAbilityを停止することを忘れないでください。




// contextは停止するUIAbilityインスタンスのAbilityContextです
this.context.terminateSelf((err) => {
// ...
});


#### 🦋6.4 別のアプリのUIAbilityを起動して結果を取得


1. 受け取り側の設定情報




{
"module": {
"abilities": [
{
// ...
"skills": [
{
"entities": [
// ...
"entity.system.default"
],
"actions": [
// ...
"ohos.want.action.editData"
]
}
]
}
]
}
}


2. 呼び出し側(起動元)




let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
// 特定のバンドルでのみ暗黙的にクエリを実行する場合は、以下のコメントを解除します。
// bundleName: 'com.example.myapplication',
action: 'ohos.want.action.editData',
// entitiesは省略可能です。
entities: ['entity.system.default'],
}

// contextは呼び出し側UIAbilityのAbilityContextです
this.context.startAbilityForResult(wantInfo).then((data) => {
// ...
}).catch((err) => {
// ...
})


3. 結果の返却(受け取り側)




const RESULT_CODE: number = 1001;
let abilityResult = {
resultCode: RESULT_CODE,
want: {
bundleName: 'com.example.myapplication',
abilityName: 'EntryAbility',
moduleName: 'entry',
parameters: {
payStatus: 'OK',
},
},
}
// contextは受け取り側UIAbilityのAbilityContextです、返却パラメータ
this.context.terminateSelfWithResult(abilityResult, (err) => {
// ...
});


4. 結果の取得(呼び出し側)




const RESULT_CODE: number = 1001;

let want = {
// Wantパラメータ情報
};

// contextは呼び出し側UIAbilityのAbilityContextです
this.context.startAbilityForResult(want).then((data) => {
if (data?.resultCode === RESULT_CODE) {
// 受け取り側UIAbilityから返された情報を解析します
let payStatus = data.want?.parameters?.payStatus;
// ...
}
}).catch((err) => {
// ...
})


#### 🦋6.5 UIAbilityの特定ページの起動


##### ☀️6.5.1 呼び出し側UIAbilityで起動ページを指定


呼び出し側UIAbilityで、起動先UIAbilityの特定のページを指定するには、wantパラメータにページ情報を含めることができます。




let wantInfo = {
deviceId: '', // deviceIdが空の場合はデバイス自身を意味します
bundleName: 'com.example.myapplication',
abilityName: 'FuncAbility',
moduleName: 'module1', // moduleNameはオプションです
parameters: { // カスタムパラメータでページ情報を渡します
targetPage: 'pageA',
},
}
// contextは呼び出し側UIAbilityのAbilityContextです
this.context.startAbility(wantInfo).then(() => {
// ...
}).catch((err) => {
// ...
})


##### ☀️6.5.2 起動先UIAbilityの初回起動


起動先UIAbilityが初めて起動する場合、パラメータに基づいて適切なページをロードするように実装します。




import UIAbility from '@ohos.app.ability.UIAbility'
import Window from '@ohos.window'

export default class FuncAbility extends UIAbility {
receivedWant;

onCreate(want, launch) {
this.receivedWant = want;
}

onWindowStageCreate(windowStage: Window.WindowStage) {
// パラメータに基づいて適切なページをロードします
let targetPage = 'pages/Index'; // デフォルトページ
if (this.receivedWant?.parameters?.targetPage === 'pageA') {
targetPage = 'pages/PageA';
} else if (this.receivedWant?.parameters?.targetPage === 'pageB') {
targetPage = 'pages/PageB';
}
windowStage.loadContent(targetPage, (err, data) => {
// ...
});
}

// ...

}


##### ☀️6.5.3 起動先UIAbilityが既に存在する場合


起動先UIAbilityが既に存在する場合(指定インスタンスモードなど)、onNewWantライフサイクルメソッドを使用してパラメータを処理し、必要に応じてページを切り替えます。




import UIAbility from '@ohos.app.ability.UIAbility'
import Window from '@ohos.window'

export default class FuncAbility extends UIAbility {
onNewWant(want, launch) {
// 新しいパラメータを処理します
let targetPage = 'pages/Index'; // デフォルトページ
if (want?.parameters?.targetPage === 'pageA') {
targetPage = 'pages/PageA';
} else if (want?.parameters?.targetPage === 'pageB') {
targetPage = 'pages/PageB';
}
// 現在のウィンドウステージを取得します
let windowStage = this.windowStage;
// 必要に応じてページを切り替えます
windowStage.loadContent(targetPage, (err, data) => {
// ...
});
}

// ...

}


### 7.まとめ


本記事では、HarmonyOSのStageモデルにおけるUIAbilityコンポーネントの基本的な概念と実装方法について解説しました。UIAbilityのライフサイクル、起動モード、基本的な使用方法、UIとのデータ同期方法、そしてUIAbility間の連携方法について詳しく説明しました。


これらの知識を理解し、適切に実装することで、HarmonyOSアプリケーションをより効果的に開発することができます。UIAbilityはHarmonyOSアプリケーションの基本的な構成要素であり、そのライフサイクルと連携方法を理解することは、高品質なアプリケーションを開発する上で不可欠です。


今後の記事では、より高度なUIAbilityの使用方法や、HarmonyOSの他の重要なコンポーネントについても解説予定です。ご期待ください。 

タグ: HarmonyOS Stageモデル UIAbility アプリ開発 モバイルOS

6月11日 19:33 投稿