ネイティブコードでスクリプトと連携してシステムイベントを処理する API です。

EventHandler

モジュールパス: Android: src/main/java/com/suredesigns/alier/_EventHandler.kt iOS: Alier/_EventHandler.swift

概要


ネイティブアプリ内で発生したイベントを JS に伝達します。

JS との連携は以下の記述と MessagePorter を参照してください。

イベント

プラットフォームで検出したイベントをスクリプトに通知し、登録されたコールバックを実行します。

アプリのライフサイクルイベントはすでに登録済みです。ライフルサイクルイベントについて詳しくは Alier.SysEvent を参照してください。


イベントを通知する

  1. EventHandler インスタンスを作成します。
  2. コールバックを登録するためのリスナー関数を登録します。
  3. 検出したイベントを JavaScript に通知します。
//1. インスタンスの生成
val eventHandler = EventHandler(scriptMediator!!)

//2. 関数の登録 function_nameは任意の名称で、対象のインスタンスを用いて、以下のようにaddListenerメソッドを定義する
scriptMediator!!.registerFunction(
    false,
    "somethingEventListener",
    function = { args ->
        eventHandler!!.addListener(
            category = args[0].toString(),
            javaScriptFunctionHandle = HandleObject.from(map = args[1] as Map),
        )
    }
)

//3. JS側へのイベントの通知
func somethingDetectionEvent() {
    eventHandler.post(
        category = "example",
        message = mapOf<String, Any?>( "id" to "something", "code" to "0"),
    )
}
//1. インスタンスの生成
let eventHandler = EventHandler(
    scriptMeditator: self.activity.scriptMediator
) // ScriptMediatorに関しては、関数登録時に取得できる

//2. 関数の登録 functionNameは任意の名称で、対象のインスタンスを用いて、以下のようにaddListenerメソッドを定義する
try self.activity.scriptMediator.registerFunction(
    is_sync: false,
    functionName: "somethingEventListener",
    function: {args in
        eventHandler?.addListener(
            category: args[0] as! String,
            javaScriptFunctionHandle: HandleObject.from(dict: args[1] as! [String: Any?]),
        )
    },
    completionHandler: nil
)

//3. JS側へのイベントの通知
func somethingDetectionEvent() {
    eventHandler.post(
        category: "example",
        message: [ "id": "something", "code": "0" ],
    )
}

イベントを受け取る

JavaScript でイベントを受け取ります。

  1. MessagePorter インスタンスを作成します。
  2. ネイティブのイベントリスナー関数に MessagePorter.post を登録します。
  3. イベント検出時に実行したいコールバックを登録します。
// (JS側実装例) 任意のイベントの取得がしたいとき

// 1. MessagePorterクラスのインスタンスの生成
const sampleMessagePorter = new MessagePorter();

// 2. ネイティブ側に登録した関数にコールバック用のメソッド(post)を登録する
Alier.Native.somethingEventListener("example", (message) => {
    sampleMessagePorter.post(message);
});

// 3. イベントを検知した際にネイティブ側から呼び出したい関数を登録する
sampleMessagePorter.addListener((message) => {
    // システムイベント通知の場合、message として { id: string, code: string } という形の値が渡される。
    // id はイベント名を表す文字列であり、code は 0 以上の整数の文字列である。
    // 個々のリスナーは自由に処理を行える。
    // ただし、post() には自由な値を渡せるため、実際には特定の型の message のみを処理するように分岐を書く必要がある。
    // 上記の id や code の指定は従って、汎用的な MessagePorter に対しては必然的に要求される。
});

メソッド


init()

EventHandler を生成します。

addListener()

JavaScript 関数を指定した種別のイベントのリスナーとして追加します。登録された関数は post() の実行に際し呼び出されます。

post()

addListener() 登録された JavaScript 関数に対してイベントを通知します。