最近のアクセス:
Android 用の外部オブジェクト

通知を自動的にフェードインおよびフェードアウトする GeneXus の msg メソッドを模倣するとします。
GeneXus 内でネイティブ外部オブジェクトを作成できます。呼び出したいメソッドおよびプロパティを公開し、実装して Android プラットフォームと統合します。
ここでは、Android プラットフォーム用の外部オブジェクトを作成する手順について見ていきます。
Android プラットフォーム用の Toast 通知を使用します。これにより、short および long toast の送信が可能です。
ここでは、GeneXus でこの機能を追加するために従う必要のある手順について見ていきます。
  • 外部オブジェクトを作成します。これは GeneXus 内の定義であり、オブジェクトでは定義されているプロパティ、メソッド、イベントを呼び出します。
  • 対象プラットフォーム (この場合は Android) に必要なコードを実装する拡張ライブラリを作成します。

外部オブジェクトの作成

MyApi と呼ばれる新しいネイティブ外部オブジェクトを作成します。次のプロパティ値を必ず設定してください:
Android External name MyApi
External Package Name com.example.samplemodule1
1 - この値は、ライブラリに使用する名前に応じて変わる可能性があります。この例では、既存のサンプルにコンポーネントを追加します。
ShortToast と呼ばれる新しいメソッドを、次の値とともに追加します:
Is Static True
External Member Type Instance
文字パラメーターには次を使用します:
Access Type In
Type VarChar、長さ: 128
同じパラメーターを持つ、LongToast と呼ばれる 2 つ目のメソッドを追加します。次の図のような結果になります:
イメージ:33541.gif
これで GeneXus 側で必要な宣言は完了です。

GeneXus での使用例

外部オブジェクトを保存したら、次の構文で使用できます:
MyApi.ShortToast("Hello Toast!")MyApi.LongToast(&myMessage)
ここで、この外部オブジェクトを動作させるために、いくつかの実装を行う必要があります。

実装

次のステップでは、拡張ライブラリMyApi クラスを実装します。新規で始めたい場合は、この記事を参照してください。

MyApi.Java

新しいクラス MyApi.java をパッケージ com.example.samplemodule に作成します:
package com.example.samplemodule;

import android.support.annotation.NonNull;
import android.widget.Toast;
import com.artech.base.services.Services;
import com.artech.externalapi.ExternalApi;
import com.artech.externalapi.ExternalApiResult;

import java.util.List;

public class MyApi extends ExternalApi
{
    // GeneXus API オブジェクト名
    final static String NAME = "MyApi";

    // API メソッド名
    private static final String METHOD_SHORT_TOAST = "shortToast";
    private static final String METHOD_LONG_TOAST = "longToast";

    public MyApi(ApiAction action) {
        addMethodHandler(METHOD_SHORT_TOAST, 1, mShortToast);
        addMethodHandler(METHOD_LONG_TOAST, 1, mLongToast);
    }

    @SuppressWarnings("FieldCanBeLocal")
    private final IMethodInvoker mShortToast = new IMethodInvoker() {
        @Override
        public @NonNull ExternalApiResult invoke(List<Object> parameters) {
            final String parValue = (String) parameters.get(0);
            sendToast(parValue,Toast.LENGTH_SHORT);
            return ExternalApiResult.SUCCESS_CONTINUE;
        }
    };

    @SuppressWarnings("FieldCanBeLocal")
    private final IMethodInvoker mLongToast = new IMethodInvoker() {
        @Override
        public @NonNull ExternalApiResult invoke(List<Object> parameters) {
            final String parValue = (String) parameters.get(0);
            sendToast(parValue,Toast.LENGTH_LONG);
            return ExternalApiResult.SUCCESS_CONTINUE;
        }
    };

    private void sendToast(final String value, final int duration)
    {
        Services.Log.debug(NAME,"Toast:'"+value+"' duration:"+duration); //$NON-NLS-1$
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getContext(),value,duration).show();
            }
        });
    }
}

外部オブジェクトのメソッド

クラスコンストラクターにメソッドハンドラーを宣言します。次のメソッドを使用できます:
  • addSimpleMethodHandler
  • addMethodHandler
  • addMethodHandlerRequestingPermissions
この例では addMethodHandler を使用します:
addMethodHandler(METHOD_SHORT_TOAST, 1, mShortToast);
addMethodHandler(METHOD_LONG_TOAST, 1, mLongToast);
次に、invoke メソッドを定義し、実装の詳細を指定します。このメソッドは、この例では mShortToast と mLongToast の各ハンドラーに必要です:
@SuppressWarnings("FieldCanBeLocal")
private final IMethodInvoker mShortToast = new IMethodInvoker() {
    @Override
    public @NonNull ExternalApiResult invoke(List<Object> parameters) {
        final String parValue = (String) parameters.get(0);
        sendToast(parValue,Toast.LENGTH_SHORT);
        return ExternalApiResult.SUCCESS_CONTINUE;
    }
};
詳細については、この記事を参照してください。
invoke メソッドのメソッド引数は次のとおりです:
  • parameters: GeneXus 外部オブジェクトで定義されているパラメーターのリストです。
開発者は、メソッドのパラメーターリストを取得し、必要なキャストを行って、機能を実装するコードに委任する必要があります。基本データタイプの引数を使用する場合、toString メソッドを使用して String パラメーターのリストを取得できます:
final String parValue = (String) parameters.get(0);
この場合、SDT または SDT コレクションオブジェクトを使用していると、Entity または EntityList (パッケージ com.artech.base.model) にキャストする必要があります。
Toast サンプルとの関係で、外部オブジェクトは、文字列引数を使用して ShortToast および LongToast メソッドを定義します。MyApi.ShortToast("Hello Toast!") の実行時には、次のコードが実際に実行されます:
private void sendToast(final String value, final int duration)
{
    Services.Log.debug(NAME,"Toast:'"+value+"' duration:"+duration); //$NON-NLS-1$
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getContext(),value,duration).show();
        }
    });
}
Value 変数は値 "Hello Toast!"、duration パラメーターは、実行する Toast タイプ (Short または Long) になります。最終結果は次のようになります:
イメージ:33540.gif

初期化

外部オブジェクトを初期化し、Module クラスから initialize メソッドを見つけ、以下を追加します:
ExternalApiDefinition mAPI = new ExternalApiDefinition(
        MyApi.NAME,
        MyApi.class
);
この場合、SampleModule.java を使用しているのは、クラスを AndroidExtensionSample から再利用し、.library ファイルで定義されている \Android\ModuleClass タグ内で定義しているからです。
<ModuleClass>com.example.samplemodule.SampleModule</ModuleClass>

宣言

GENEXUS_HOME\Libraries\SampleLibrary\SampleLibrary.library ファイルを探し、外部オブジェクトの新しい値を Implements タグの下に追加します。
<Implements>
    ...<ExternalObject name="MyApi"/>
    ...</Implements>
これで実装セクションは完了です。

コンパイル

Android モジュールの場所から次のコマンドを実行します:
gradlew uploadArchives
プロセスが完了すると、ライブラリがコンパイルされ、次の Android コンパイルに含まれるように GENEXUS_HOME\Android\m2Repository にコピーされます。正常なビルドは次のようになります:
>gradlew uploadArchives
:library:androidSourcesJar
...:library:compileReleaseJavaWithJavac
Incremental compilation of X classes completed in Y secs.... :library:bundleRelease :library:publishDebugPublicationToLocalRepository BUILD SUCCESSFUL
以上です。Android MyApi 外部オブジェクトをテストする準備ができました。

考慮事項

拡張ポイントを使用すると、Knowledge Base Navigator ユーティリティは、定義済みの拡張ポイントを通じて追加されるプラットフォーム特有のコードが含まれていないため、有効なオプションではなくなります。この場合、代わりに APK ファイルを使用します。
オフラインプロシージャーから外部オブジェクトを呼び出す場合、いくつかの条件を考慮する必要があります。
  • 外部オブジェクトのメソッドは静的である必要があります。
  • メソッドの名前は、外部オブジェクトで定義されている名前と同じである必要があります: http://wiki.genexus.jp/hwikibypageid.aspx?17880

互換性

この記事は、GeneXus 15 Upgrade 3 以降のバージョンが対象です。

トラブルシューティング

基本的なトラブルシューティングを行うために、拡張ポイントにログメッセージを追加できます。たとえば、External Object メソッドの呼び出しをログに記録するために Execute メソッドに次の行を追加できます:
android.util.Log.v("GeneXusApplication", "MyApi::"+method);
または、パッケージ com.artech.base.services.Services の GeneXus ヘルパークラス Services.Log を使用できます。
Services.Log.debug("GeneXusApplication", "MyApi::"+method); //$NON-NLS-1$
結果については、Android ログシステムをチェックします。次と似たような結果が表示されるはずです:
V/GeneXusApplication(ProcessID): MyApi::ShortToast

インストールのチェックリスト

GeneXus インストールに外部オブジェクトをデプロイするには:
  • 次の環境変数が設定されていることを確認します。設定されていない場合、プロジェクトはコンパイルできません。
    • GENEXUS_HOME (Genexus のインストールディレクトリー)
    • ANDROID_HOME (Android SDK ディレクトリー)
  • Android 拡張ライブラリの場所 (この例では SampleModule) から gradlew uploadArchives コマンドを実行します。
  • ライブラリファイルを GENEXUS_HOME\Libraries\LibraryName\ folder にコピーします。これで MyAPI 外部オブジェクトの情報が追加されます。
  • 外部オブジェクト定義とともに xpz をインポートし、使用します。
  • スマート デバイス オブジェクトをリビルドします。

参考情報



サブページ
Created: 14/09/18 03:11 by Admin Last update: 22/12/19 02:48 by Admin
カテゴリ
Powered by GXwiki 3.0