Skip to content

カスタムリスナー

このリファレンス記事では、Android または FireOS アプリケーションのカスタムアプリ内メッセージングリスナーについて説明します。

カスタムリスナーを使用してアプリ内メッセージをカスタマイズする前に、アプリ内メッセージの大部分を処理するBrazeInAppMessageManagerを理解することが重要です。「アプリ内メッセージ連携ガイド」のステップ1で説明したように、アプリ内メッセージを適切に機能させるためには登録する必要があります。

BrazeInAppMessageManagerは Android でのアプリ内メッセージの表示を管理します。ヘルパークラスのインスタンスが含まれており、アプリ内メッセージのライフサイクルと表示の管理に役立ちます。これらのクラスにはすべて標準実装が用意されており、カスタムクラスの定義は完全に任意です。ただし、そうすることで、アプリ内メッセージの表示と動作を別のレベルで制御できます。これらのカスタマイズ可能なクラスには、以下が含まれています。

カスタムマネージャーリスナー

BrazeInAppMessageManagerは、アプリ内メッセージの表示とライフサイクルを自動的に処理します。メッセージのライフサイクルをより詳細に制御する必要がある場合は、カスタムマネージャーリスナーを設定すると、アプリ内メッセージライフサイクルのさまざまなポイントでアプリ内メッセージオブジェクトを受け取ることができ、その表示を自分で処理したり、さらなる処理を実行したり、ユーザーの動作に反応したり、オブジェクトのエクストラなどを処理したりすることができます。

ステップ1: アプリ内メッセージマネージャーリスナーを実装する

IInAppMessageManagerListenerを実装するクラスを作成します。

IInAppMessageManagerListener内のコールバックは、アプリ内メッセージライフサイクルのさまざまなポイントで呼び出されます。

例えば、Braze からアプリ内メッセージを受け取ったときにカスタムマネージャーリスナーを設定すると、beforeInAppMessageDisplayed()メソッドが呼び出されます。このメソッドの実装によりInAppMessageOperation.DISCARDが返される場合、それはアプリ内メッセージがホストアプリによって処理され、Braze によって表示されるべきではないことを Braze に知らせます。InAppMessageOperation.DISPLAY_NOWが返された場合、Braze はアプリ内メッセージの表示を試行します。この方法は、アプリ内メッセージをカスタマイズされた方法で表示することを選択した場合に使用する必要があります。

IInAppMessageManagerListenerには、メッセージ自体またはいずれかのボタンのクリックに対するデリゲートメソッドも含まれます。一般的なユースケースは、ボタンやメッセージがクリックされたときにメッセージをインターセプトしてさらに処理する場合です。

ステップ2: アプリ内メッセージビューのライフサイクルメソッドにフックする (オプション)

IInAppMessageManagerListenerインターフェイスには、アプリ内メッセージビューのライフサイクルの異なるポイントで呼び出されるアプリ内メッセージビューメソッドがあります。これらのメソッドは次の順序で呼び出されます。

  • beforeInAppMessageViewOpened - アプリ内メッセージがアクティビティのビューに追加される直前に呼び出されます。この時点ではまだアプリ内メッセージはユーザーに表示されません。
  • afterInAppMessageViewOpened - アプリ内メッセージがアクティビティのビューに追加された直後に呼び出されます。この時点で、アプリ内のメッセージがユーザーに表示されます。
  • beforeInAppMessageViewClosed - アプリ内メッセージがアクティビティのビューから削除される直前に呼び出されます。この時点でも、アプリ内メッセージはユーザーに表示されます。
  • afterInAppMessageViewClosed - アプリ内メッセージがアクティビティのビューから削除された直後に呼び出されます。この時点では、アプリ内メッセージはユーザーに表示されなくなります。

具体的には、afterInAppMessageViewOpenedbeforeInAppMessageViewClosedの間の時間は、アプリ内メッセージビューが画面に表示され、ユーザーが閲覧できる状態にある時間です。

ステップ3: Braze にアプリ内メッセージマネージャリスナーを使用するように指示する

IInAppMessageManagerListenerを作成したら、BrazeInAppMessageManager.getInstance().setCustomInAppMessageManagerListener()を呼び出してBrazeInAppMessageManagerに対し デフォルトのリスナーの代わりにカスタムのIInAppMessageManagerListenerを使用するよう指示します。

Braze への他の呼び出しの前に、Application.onCreate()IInAppMessageManagerListenerを設定することをお勧めします。これにより、アプリ内メッセージが表示される前にカスタムリスナーが設定されます。

表示前のアプリ内メッセージの変更

新しいアプリ内メッセージを受信し、すでに表示されているアプリ内メッセージがある場合、新しいメッセージはスタックの一番上に置かれ、後で表示できます。

ただし、アプリ内メッセージが表示されない場合は、IInAppMessageManagerListenerの以下のデリゲートメソッドが呼び出されます。

1
2
3
4
@Override
public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessageBase) {
  return InAppMessageOperation.DISPLAY_NOW;
}
1
2
3
override fun beforeInAppMessageDisplayed(inAppMessageBase: IInAppMessage): InAppMessageOperation {
  return InAppMessageOperation.DISPLAY_NOW
}

InAppMessageOperation()の戻り値により、メッセージを表示するタイミングを制御できます。この方法が推奨されるケースは、アプリ内メッセージがアプリのユーザーエクスペリエンスを妨害する場合にDISPLAY_LATERを返すことで、アプリの特定の部分でメッセージを遅延させることです。

InAppMessageOperationの戻り値 動作
DISPLAY_NOW メッセージが表示されます
DISPLAY_LATER メッセージはスタックに返され、次に利用可能な機会に表示されます
DISCARD メッセージは破棄されます
null メッセージは無視されます。このメソッドはnull返しません

詳細については、InAppMessageOperation.javaを参照してください。

Android では、アプリ内メッセージでlogClicklogImpressionを呼び出し、全画面のアプリ内メッセージではlogButtonClickを呼び出すことで行われます。

ステップ 4ダークテーマの動作のカスタマイズ (オプション){#android-in-app-message-dark-theme-customization}

デフォルトのIInAppMessageManagerListenerロジックでは、beforeInAppMessageDisplayed()の場合システム設定がチェックされ、条件付きで次のコードでメッセージのダークテーマスタイルが有効になります。

1
2
3
4
5
6
7
@Override
public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
  if (inAppMessage instanceof IInAppMessageThemeable && ViewUtils.isDeviceInNightMode(BrazeInAppMessageManager.getInstance().getApplicationContext())) {
    ((IInAppMessageThemeable) inAppMessage).enableDarkTheme();
  }
  return InAppMessageOperation.DISPLAY_NOW;
}
1
2
3
4
5
6
override fun beforeInAppMessageDisplayed(inAppMessage: IInAppMessage): InAppMessageOperation {
  if (inAppMessage is IInAppMessageThemeable && ViewUtils.isDeviceInNightMode(BrazeInAppMessageManager.getInstance().applicationContext!!)) {
    (inAppMessage as IInAppMessageThemeable).enableDarkTheme()
  }
  return InAppMessageOperation.DISPLAY_NOW
}

独自の条件付きロジックを使用する場合は、表示前処理の任意のステップでenableDarkThemeを呼び出すことができます。

カスタムビューファクトリ

Braze のアプリ内メッセージタイプには、ほとんどのカスタムユースケースをカバーする汎用性があります。しかし、デフォルトのタイプを使用する代わりにアプリ内メッセージの視覚的な外観を完全に定義したい場合、Braze ではカスタムビューファクトリを設定することで行うことができます。

ステップ1: アプリ内メッセージビューファクトリを実装する

IInAppMessageViewFactoryを実装するクラスを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class CustomInAppMessageViewFactory implements IInAppMessageViewFactory {
  @Override
  public View createInAppMessageView(Activity activity, IInAppMessage inAppMessage) {
    // Uses a custom view for slideups, modals, and full in-app messages.
    // HTML in-app messages and any other types will use the Braze default in-app message view factories
    switch (inAppMessage.getMessageType()) {
      case SLIDEUP:
      case MODAL:
      case FULL:
        // Use a custom view of your choosing
        return createMyCustomInAppMessageView();
      default:
        // Use the default in-app message factories
        final IInAppMessageViewFactory defaultInAppMessageViewFactory = BrazeInAppMessageManager.getInstance().getDefaultInAppMessageViewFactory(inAppMessage);
        return defaultInAppMessageViewFactory.createInAppMessageView(activity, inAppMessage);
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CustomInAppMessageViewFactory : IInAppMessageViewFactory {
  override fun createInAppMessageView(activity: Activity, inAppMessage: IInAppMessage): View {
    // Uses a custom view for slideups, modals, and full in-app messages.
    // HTML in-app messages and any other types will use the Braze default in-app message view factories
    when (inAppMessage.messageType) {
      MessageType.SLIDEUP, MessageType.MODAL, MessageType.FULL ->
        // Use a custom view of your choosing
        return createMyCustomInAppMessageView()
      else -> {
        // Use the default in-app message factories
        val defaultInAppMessageViewFactory = BrazeInAppMessageManager.getInstance().getDefaultInAppMessageViewFactory(inAppMessage)
        return defaultInAppMessageViewFactory!!.createInAppMessageView(activity, inAppMessage)
      }
    }
  }
}

ステップ2: Braze にアプリ内メッセージビューファクトリを使用するように指示する

IInAppMessageViewFactoryを作成したら、BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewFactory()を呼び出してBrazeInAppMessageManagerに対し デフォルトのビューファクトリの代わりにカスタムのIInAppMessageViewFactoryを使用するよう指示します。

Braze ビューインターフェイスの実装

slideupのアプリ内メッセージビューはIInAppMessageViewを実装しています。fullおよびmodalのタイプのメッセージビューは、IInAppMessageImmersiveViewを実装しています。これらのクラスのいずれかを実装することで、Braze は必要に応じてクリックリスナーをカスタムビューに追加できます。すべての Braze ビュークラスは Android のViewクラスを拡張しています。

IInAppMessageViewを実装すると、カスタムビューの一部をクリック可能と定義できます。IInAppMessageImmersiveViewを実装すると、メッセージボタンビューと閉じるボタンビューを定義できます。

カスタムアニメーションファクトリ

アプリ内メッセージにはアニメーションの動作がプリセットされています。Slideupメッセージは画面にスライドし、fullmodalメッセージはフェードインおよびフェードアウトします。アプリ内メッセージにカスタムアニメーションの動作を定義する場合、Braze ではカスタムアニメーションファクトリを設定することで行うことができます。

ステップ1: アプリ内のメッセージアニメーションファクトリを実装する

IInAppMessageAnimationFactoryを実装するクラスを作成します。

```java public class CustomInAppMessageAnimationFactory implements IInAppMessageAnimationFactory {

@Override public Animation getOpeningAnimation(IInAppMessage inAppMessage) { Animation animation = new AlphaAnimation(0, 1); animation.setInterpolator(new AccelerateInterpolator()); animation.setDuration(2000L); return animation; }

@Override public Animation getClosingAnimation(IInAppMessage inAppMessage) { Animation animation = new AlphaAnimation(1, 0); animation.setInterpolator(new DecelerateInterpolator()); animation.setDuration(2000L); return animation; } } ```

```kotlin class CustomInAppMessageAnimationFactory :IInAppMessageAnimationFactory { override fun getOpeningAnimation(inAppMessage: IInAppMessage): Animation { val animation: Animation = AlphaAnimation(0, 1) animation.interpolator = AccelerateInterpolator() animation.duration = 2000L return animation }

override fun getClosingAnimation(inAppMessage:IInAppMessage):Animation { val animation: Animation = AlphaAnimation(1, 0) animation.interpolator = DecelerateInterpolator() animation.duration = 2000L return animation } } ```

ステップ2: Braze にアプリ内メッセージビューファクトリを使用するように指示する

IInAppMessageAnimationFactoryを作成したら、BrazeInAppMessageManager.getInstance().setCustomInAppMessageAnimationFactory()を呼び出してBrazeInAppMessageManagerに対し デフォルトのアニメーションの代わりにカスタムのIInAppMessageAnimationFactoryを使用するよう指示します。

Braze への他の呼び出しの前に、Application.onCreate()IInAppMessageAnimationFactoryを設定することをお勧めします。これにより、アプリ内メッセージが表示される前にカスタムアニメーションファクトリが設定されます。

カスタムの HTML アプリ内メッセージアクションリスナー

Braze SDK にはデフォルトのDefaultHtmlInAppMessageActionListenerクラスがあり、カスタムリスナーが定義されていない場合に使用され、適切なアクションを自動的に実行します。ユーザーがカスタムの HTML アプリ内メッセージ内のさまざまなボタンを操作する方法をより詳細に制御する必要がある場合は、カスタムIHtmlInAppMessageActionListenerクラスを実装します。

ステップ1: カスタムの HTML アプリ内メッセージアクションリスナーを実装する

IHtmlInAppMessageActionListenerを実装するクラスを作成します。

IHtmlInAppMessageActionListener内のコールバックは、ユーザーが HTML アプリ内メッセージ内で以下のアクションを開始するたびに呼び出されます。

  • 閉じるボタンをクリックする
  • カスタムイベントを起動する
  • HTML アプリ内メッセージ内の URL をクリックする

```java public class CustomHtmlInAppMessageActionListener implements IHtmlInAppMessageActionListener { private final Context mContext;

public CustomHtmlInAppMessageActionListener(Context context) { mContext = context; }

@Override public void onCloseClicked(IInAppMessage inAppMessage, String url, Bundle queryBundle) { Toast.makeText(mContext, “HTML In App Message closed”, Toast.LENGTH_LONG).show(); BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false); }

@Override public boolean onCustomEventFired(IInAppMessage inAppMessage, String url, Bundle queryBundle) { Toast.makeText(mContext, “Custom event fired.Ignoring.”, Toast.LENGTH_LONG).show(); return true; }

@Override public boolean onNewsfeedClicked(IInAppMessage inAppMessage, String url, Bundle queryBundle) { Toast.makeText(mContext, “Newsfeed button pressed.Ignoring.”, Toast.LENGTH_LONG).show(); BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false); return true; }

@Override public boolean onOtherUrlAction(IInAppMessage inAppMessage, String url, Bundle queryBundle) { Toast.makeText(mContext, “Custom url pressed: “ + url + “ . Ignoring”, Toast.LENGTH_LONG).show(); BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false); return true; } } ```

```kotlin class CustomHtmlInAppMessageActionListener(private val mContext:Context) :IHtmlInAppMessageActionListener {

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
override fun onCloseClicked(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle) {
    Toast.makeText(mContext, "HTML In App Message closed", Toast.LENGTH_LONG).show()
    BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false)
}

override fun onCustomEventFired(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle): Boolean {
    Toast.makeText(mContext, "Custom event fired. Ignoring.", Toast.LENGTH_LONG).show()
    return true
}

override fun onNewsfeedClicked(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle): Boolean {
    Toast.makeText(mContext, "Newsfeed button pressed. Ignoring.", Toast.LENGTH_LONG).show()
    BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false)
    return true
}

override fun onOtherUrlAction(inAppMessage: IInAppMessage, url: String, queryBundle: Bundle): Boolean {
    Toast.makeText(mContext, "Custom url pressed: $url . Ignoring", Toast.LENGTH_LONG).show()
    BrazeInAppMessageManager.getInstance().hideCurrentlyDisplayingInAppMessage(false)
    return true
} } \`\`\`

ステップ2: Braze に HTML アプリ内メッセージアクションリスナーの使用を指示する

IHtmlInAppMessageActionListenerを作成したら、BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener()を呼び出して、デフォルトのアクションリスナーの代わりにカスタムIHtmlInAppMessageActionListenerを使用するようにBrazeInAppMessageManagerに指示します。

Braze への他の呼び出しの前に、Application.onCreate()IHtmlInAppMessageActionListenerを設定することをお勧めします。これにより、アプリ内メッセージが表示される前にカスタムアクションリスナーが設定されます。

1
BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener(new CustomHtmlInAppMessageActionListener(context));
1
BrazeInAppMessageManager.getInstance().setCustomHtmlInAppMessageActionListener(CustomHtmlInAppMessageActionListener(context))

カスタムビューラッパーファクトリ

BrazeInAppMessageManagerは、デフォルトでDefaultInAppMessageViewWrapperを使用して、既存のアクティビティビュー階層へのアプリ内メッセージモデルの配置を自動的に処理します。アプリ内メッセージをビュー階層に配置する方法をカスタマイズする必要がある場合は、カスタムのIInAppMessageViewWrapperFactoryを使用する必要があります。

ステップ1: アプリ内メッセージビューラッパーファクトリを実装する

IInAppMessageViewWrapperFactoryを実装し、IInAppMessageViewWrapperを返すクラスを作成します。

このファクトリは、アプリ内メッセージビューが作成された直後に呼び出されます。カスタムのIInAppMessageViewWrapperを実装する最も簡単な方法は、デフォルトのDefaultInAppMessageViewWrapperを拡張することです。

```java public class CustomInAppMessageViewWrapper extends DefaultInAppMessageViewWrapper { public CustomInAppMessageViewWrapper(View inAppMessageView, IInAppMessage inAppMessage, IInAppMessageViewLifecycleListener inAppMessageViewLifecycleListener, BrazeConfigurationProvider brazeConfigurationProvider, Animation openingAnimation, Animation closingAnimation, View clickableInAppMessageView) { super(inAppMessageView, inAppMessage, inAppMessageViewLifecycleListener, brazeConfigurationProvider, openingAnimation, closingAnimation, clickableInAppMessageView); }

@Override public void open(@NonNull Activity activity) { super.open(activity); Toast.makeText(activity.getApplicationContext(), “Opened in-app message”, Toast.LENGTH_SHORT).show(); }

@Override public void close() { super.close(); Toast.makeText(mInAppMessageView.getContext().getApplicationContext(), “Closed in-app message”, Toast.LENGTH_SHORT).show(); } } ```

```kotlin class CustomInAppMessageViewWrapper(inAppMessageView:View, inAppMessage:IInAppMessage, inAppMessageViewLifecycleListener:IInAppMessageViewLifecycleListener, brazeConfigurationProvider:BrazeConfigurationProvider, openingAnimation:Animation, closingAnimation:Animation, clickableInAppMessageView:View) : DefaultInAppMessageViewWrapper(inAppMessageView, inAppMessage, inAppMessageViewLifecycleListener, brazeConfigurationProvider, openingAnimation, closingAnimation, clickableInAppMessageView) {

override fun open(activity:Activity) { super.open(activity) Toast.makeText(activity.applicationContext, “Opened in-app message”, Toast.LENGTH_SHORT).show() }

override fun close() { super.close() Toast.makeText(mInAppMessageView.context.applicationContext, “Closed in-app message”, Toast.LENGTH_SHORT).show() } } ```

ステップ2: Braze にカスタムビューラッパーファクトリを使用するように指示する

IInAppMessageViewWrapperを作成したら、BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory()を呼び出して、デフォルトのビューラッパーファクトリの代わりにカスタムのIInAppMessageViewWrapperFactoryを使用するようにBrazeInAppMessageManagerに指示します。

Braze への他の呼び出しの前に、Application.onCreate()IInAppMessageViewWrapperFactoryを設定することをお勧めします。これにより、アプリ内メッセージが表示される前にカスタムビューラッパーファクトリが設定されます。

1
BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(new CustomInAppMessageViewWrapper());
1
BrazeInAppMessageManager.getInstance().setCustomInAppMessageViewWrapperFactory(CustomInAppMessageViewWrapper())
「このページはどの程度役に立ちましたか?」
New Stuff!