コアコンセプト / アプリケーションライフサイクル

アプリケーション管理

applicationモジュールを使用すると、アプリケーションの起動からユーザー定義の設定の保存まで、NativeScriptアプリケーションのライフサイクルを管理できます。

アプリケーション実行

applicationモジュールから実行されるrunメソッドはアプリケーションを起動するために必要であり、ルートXMLファイルへのパスを受け入れます。

注釈:モジュールの初期化後にアプリケーションモジュールのrunメソッドを呼び出す必要があります。 run呼び出しの後のコードは実行されません。

/*
iOS calls UIApplication and triggers the application main event loop.
*/

const application = require("tns-core-modules/application");
application.run({ moduleName: "app-root" });
/*
iOS calls UIApplication and triggers the application main event loop.
*/

import * as application from "tns-core-modules/application";
application.run({ moduleName: "app-root" });
注釈:バージョン4.0.0より前のすべてのNativeScriptアプリケーションは、application.start()メソッドによって暗黙的に作成された単一の最上位のFrameを持っていました。 NativeScript 4.x.x以降では、ルートFrameは暗黙的に作成されなくなりました。 その代わり、application.run({moduleName: "app-root"})を使用しながら、任意のViewをアプリケーションのルートapp-rootになるように指定できます。 ここで、app-rootはルートViewを含むファイルです。 Frame APIとナビゲーションの詳細はナビゲーションの記事を参照してください。

アプリケーションイベントを使用する

NativeScriptアプリケーションには、次のライフサイクルイベントがあります。

const application = require("tns-core-modules/application");

application.on(application.launchEvent, (args) => {
	if (args.android) {
		// For Android applications, args.android is an android.content.Intent class.
		console.log("Launched Android application with the following intent: " + args.android + ".");
	} else if (args.ios !== undefined) {
		// For iOS applications, args.ios is NSDictionary (launchOptions).
		console.log("Launched iOS application with options: " + args.ios);
	}
});

application.on(application.suspendEvent, (args) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

application.on(application.resumeEvent, (args) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

application.on(application.displayedEvent, (args) => {
	// args is of type ApplicationEventData
	console.log("displayedEvent");
});

application.on(application.orientationChangedEvent, (args) => {
	// args is of type OrientationChangedEventData
	console.log(args.newValue); // "portrait", "landscape", "unknown"
});

application.on(application.exitEvent, (args) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

application.on(application.lowMemoryEvent, (args) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

application.on(application.uncaughtErrorEvent, (args) => {
	console.log("Error: " + args.error);
});

application.run({ moduleName: "app-root" });
import { displayedEvent, exitEvent, launchEvent, lowMemoryEvent,
	orientationChangedEvent, resumeEvent, suspendEvent, uncaughtErrorEvent,
	ApplicationEventData, LaunchEventData, OrientationChangedEventData, UnhandledErrorEventData,
	on as applicationOn, run as applicationRun } from "tns-core-modules/application";

applicationOn(launchEvent, (args: LaunchEventData) => {
	if (args.android) {
		// For Android applications, args.android is an android.content.Intent class.
		console.log("Launched Android application with the following intent: " + args.android + ".");
	} else if (args.ios !== undefined) {
		// For iOS applications, args.ios is NSDictionary (launchOptions).
		console.log("Launched iOS application with options: " + args.ios);
	}
});

applicationOn(suspendEvent, (args: ApplicationEventData) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

applicationOn(resumeEvent, (args: ApplicationEventData) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

applicationOn(displayedEvent, (args: ApplicationEventData) => {
	console.log("displayedEvent");
});

applicationOn(orientationChangedEvent, (args: OrientationChangedEventData) => {
	// "portrait", "landscape", "unknown"
	console.log(args.newValue)
});

applicationOn(exitEvent, (args: ApplicationEventData) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

applicationOn(lowMemoryEvent, (args: ApplicationEventData) => {
	if (args.android) {
		// For Android applications, args.android is an android activity class.
		console.log("Activity: " + args.android);
	} else if (args.ios) {
		// For iOS applications, args.ios is UIApplication.
		console.log("UIApplication: " + args.ios);
	}
});

applicationOn(uncaughtErrorEvent, function (args: UnhandledErrorEventData) {
	console.log("Error: " + args.error);
});

applicationRun({ moduleName: "app-root" });

Androidアクティビティイベント

NativeScriptアプリケーションには、次のAndroid固有のアクティビティイベントがあります。

const application = require("tns-core-modules/application");

if (application.android) {
		application.android.on(application.AndroidApplication.activityCreatedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity + ", Bundle: " + args.bundle);
	});

	application.android.on(application.AndroidApplication.activityDestroyedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	application.android.on(application.AndroidApplication.activityStartedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	application.android.on(application.AndroidApplication.activityPausedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	application.android.on(application.AndroidApplication.activityResumedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	application.android.on(application.AndroidApplication.activityStoppedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	application.android.on(application.AndroidApplication.saveActivityStateEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity + ", Bundle: " + args.bundle);
	});

	application.android.on(application.AndroidApplication.activityResultEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity +
		", requestCode: " + args.requestCode + ", resultCode: " + args.resultCode + ", Intent: " + args.intent);
	});

	application.android.on(application.AndroidApplication.activityBackPressedEvent, function (args) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
		// Set args.cancel = true to cancel back navigation and do something custom.
	});
}

application.run({ moduleName: "app-root" });
import { android, AndroidApplication, AndroidActivityBundleEventData } from "tns-core-modules/application";

// Android activity events
if (android) {
	android.on(AndroidApplication.activityCreatedEvent, function (args: AndroidActivityBundleEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity + ", Bundle: " + args.bundle);
	});

	android.on(AndroidApplication.activityDestroyedEvent, function (args: AndroidActivityEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	android.on(AndroidApplication.activityStartedEvent, function (args: AndroidActivityEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	android.on(AndroidApplication.activityPausedEvent, function (args: AndroidActivityEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	android.on(AndroidApplication.activityResumedEvent, function (args: AndroidActivityEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	android.on(AndroidApplication.activityStoppedEvent, function (args: AndroidActivityEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
	});

	android.on(AndroidApplication.saveActivityStateEvent, function (args: AndroidActivityBundleEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity + ", Bundle: " + args.bundle);
	});

	android.on(AndroidApplication.activityResultEvent, function (args: AndroidActivityResultEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity +
		", requestCode: " + args.requestCode + ", resultCode: " + args.resultCode + ", Intent: " + args.intent);
	});

	android.on(AndroidApplication.activityBackPressedEvent, function (args: AndroidActivityBackPressedEventData) {
		console.log("Event: " + args.eventName + ", Activity: " + args.activity);
		// Set args.cancel = true to cancel back navigation and do something custom.
	});
}

application.run({ moduleName: "app-root" });

iOS UIApplicationDelegate

NativeScriptではiOSアプリケーションにカスタムのUIApplicationDelegateを指定できます。

const application = require("tns-core-modules/application");
const MyDelegate = (function (_super) {
	__extends(MyDelegate, _super);
	function MyDelegate() {
		_super.apply(this, arguments);
	}
	MyDelegate.prototype.applicationDidFinishLaunchingWithOptions = function (application, launchOptions) {
		console.log("applicationWillFinishLaunchingWithOptions: " + launchOptions);
		return true;
	};
	MyDelegate.prototype.applicationDidBecomeActive = function (application) {
		console.log("applicationDidBecomeActive: " + application);
	};
	MyDelegate.ObjCProtocols = [UIApplicationDelegate];
	return MyDelegate;
})(UIResponder);
application.ios.delegate = MyDelegate;
application.run({ moduleName: "app-root" });
import { ios, run as applicationRun } from "tns-core-modules/application";
class MyDelegate extends UIResponder implements UIApplicationDelegate {
	public static ObjCProtocols = [UIApplicationDelegate];

	applicationDidFinishLaunchingWithOptions(application: UIApplication, launchOptions: NSDictionary<string, any>): boolean {
		console.log("applicationWillFinishLaunchingWithOptions: " + launchOptions)

		return true;
	}

	applicationDidBecomeActive(application: UIApplication): void {
		console.log("applicationDidBecomeActive: " + application)
	}
}
ios.delegate = MyDelegate;
applicationRun({ moduleName: "main-page" });
注釈:NativeScriptアプリケーションでTypeScriptを使用している場合は、 UIApplicationDelegateなどのネイティブiOS APIのタイピングを追加するために、 tns-platform-declarationsプラグインをインストールする必要があります。

アプリケーション設定の保持と復元

ユーザー定義の設定を保持するには、application-settingsモジュールを使う必要があります。 このapplication-settingsモジュールは、アプリケーションのキーと値のペアを格納する静的なシングルトンハッシュテーブルです。

取得(getter)メソッドには、キーと、指定されたキーが存在しない場合に返すデフォルト値(オプション)の2つのパラメータがあります。設定(setter)メソッドには、キーと値の2つの必須パラメータがあります。

const applicationSettings = require("tns-core-modules/application-settings");
// Event handler for Page "loaded" event attached in main-page.xml.
function pageLoaded(args) {
	applicationSettings.setString("Name", "John Doe");
	console.log(applicationSettings.getString("Name")); // Prints "John Doe".
	applicationSettings.setBoolean("Married", false);
	console.log(applicationSettings.getBoolean("Married")); // Prints false.
	applicationSettings.setNumber("Age", 42);
	console.log(applicationSettings.getNumber("Age")); // Prints 42.
	console.log(applicationSettings.hasKey("Name")); // Prints true.
	applicationSettings.remove("Name"); // Removes the Name entry.
	console.log(applicationSettings.hasKey("Name")); // Prints false.
}
exports.pageLoaded = pageLoaded;
import { EventData } from "tns-core-modules/data/observable";
import * as applicationSettings from "tns-core-modules/application-settings";
// Event handler for Page "loaded" event attached in main-page.xml.
export function pageLoaded(args: EventData) {
	applicationSettings.setString("Name", "John Doe");
	console.log(applicationSettings.getString("Name"));// Prints "John Doe".
	applicationSettings.setBoolean("Married", false);
	console.log(applicationSettings.getBoolean("Married"));// Prints false.
	applicationSettings.setNumber("Age", 42);
	console.log(applicationSettings.getNumber("Age"));// Prints 42.
	console.log(applicationSettings.hasKey("Name"));// Prints true.
	applicationSettings.remove("Name");// Removes the Name entry.
	console.log(applicationSettings.hasKey("Name"));// Prints false.
}
入門

コアコンセプト

ユーザーインターフェース

ツール

ハードウェアアクセス

プラグインの開発

リリース

アプリテンプレート

パフォーマンスの最適化

フレームワークモジュール

ガイド

サポートを受ける

トラブルシューティング

Siedkick