カスタムリスナー
このリファレンス記事では、Android または FireOS アプリケーションのカスタムアプリ内メッセージングリスナーについて説明します。
カスタムリスナーを使用してアプリ内メッセージをカスタマイズする前に、アプリ内メッセージの大部分を処理するBrazeInAppMessageManager
を理解することが重要です。「アプリ内メッセージ連携ガイド」のステップ1で説明したように、アプリ内メッセージを適切に機能させるためには登録する必要があります。
BrazeInAppMessageManager
は Android でのアプリ内メッセージの表示を管理します。ヘルパークラスのインスタンスが含まれており、アプリ内メッセージのライフサイクルと表示の管理に役立ちます。これらのクラスにはすべて標準実装が用意されており、カスタムクラスの定義は完全に任意です。ただし、そうすることで、アプリ内メッセージの表示と動作を別のレベルで制御できます。これらのカスタマイズ可能なクラスには、以下が含まれています。
IInAppMessageManagerListener
- アプリ内メッセージの表示と動作のカスタム管理IInAppMessageViewFactory
- カスタムアプリ内メッセージビューの構築IInAppMessageAnimationFactory
- カスタムアプリ内メッセージのアニメーションの定義IHtmlInAppMessageActionListener
- HTML のアプリ内メッセージの表示と動作のカスタム管理IInAppMessageViewWrapperFactory
- アプリ内メッセージビューの階層操作のカスタム管理
この記事には、廃止予定のニュースフィードの情報が含まれています。Braze では、ニュースフィードツールをご利用のお客様に、コンテンツカードのメッセージングチャネルへの移行を推奨しています。柔軟性、カスタマイズ性、信頼性が向上します。詳細については、移行ガイドをご覧ください。
カスタムマネージャーリスナー
BrazeInAppMessageManager
は、アプリ内メッセージの表示とライフサイクルを自動的に処理します。メッセージのライフサイクルをより詳細に制御する必要がある場合は、カスタムマネージャーリスナーを設定すると、アプリ内メッセージライフサイクルのさまざまなポイントでアプリ内メッセージオブジェクトを受け取ることができ、その表示を自分で処理したり、さらなる処理を実行したり、ユーザーの動作に反応したり、オブジェクトのエクストラなどを処理したりすることができます。
ステップ1: アプリ内メッセージマネージャーリスナーを実装する
IInAppMessageManagerListener
を実装するクラスを作成します。
IInAppMessageManagerListener
内のコールバックは、アプリ内メッセージライフサイクルのさまざまなポイントで呼び出されます。
例えば、Braze からアプリ内メッセージを受け取ったときにカスタムマネージャーリスナーを設定すると、beforeInAppMessageDisplayed()
メソッドが呼び出されます。このメソッドの実装によりInAppMessageOperation.DISCARD
が返される場合、それはアプリ内メッセージがホストアプリによって処理され、Braze によって表示されるべきではないことを Braze に知らせます。InAppMessageOperation.DISPLAY_NOW
が返された場合、Braze はアプリ内メッセージの表示を試行します。この方法は、アプリ内メッセージをカスタマイズされた方法で表示することを選択した場合に使用する必要があります。
IInAppMessageManagerListener
には、メッセージ自体またはいずれかのボタンのクリックに対するデリゲートメソッドも含まれます。一般的なユースケースは、ボタンやメッセージがクリックされたときにメッセージをインターセプトしてさらに処理する場合です。
ステップ2: アプリ内メッセージビューのライフサイクルメソッドにフックする (オプション)
IInAppMessageManagerListener
インターフェイスには、アプリ内メッセージビューのライフサイクルの異なるポイントで呼び出されるアプリ内メッセージビューメソッドがあります。これらのメソッドは次の順序で呼び出されます。
beforeInAppMessageViewOpened
- アプリ内メッセージがアクティビティのビューに追加される直前に呼び出されます。この時点ではまだアプリ内メッセージはユーザーに表示されません。afterInAppMessageViewOpened
- アプリ内メッセージがアクティビティのビューに追加された直後に呼び出されます。この時点で、アプリ内のメッセージがユーザーに表示されます。beforeInAppMessageViewClosed
- アプリ内メッセージがアクティビティのビューから削除される直前に呼び出されます。この時点でも、アプリ内メッセージはユーザーに表示されます。afterInAppMessageViewClosed
- アプリ内メッセージがアクティビティのビューから削除された直後に呼び出されます。この時点では、アプリ内メッセージはユーザーに表示されなくなります。
具体的には、afterInAppMessageViewOpened
とbeforeInAppMessageViewClosed
の間の時間は、アプリ内メッセージビューが画面に表示され、ユーザーが閲覧できる状態にある時間です。
これらのメソッドの実装は必須ではありません。これらは単にアプリ内のメッセージビューのライフサイクルを追跡し、通知するために提供されています。これらのメソッドの実装は空にしておいても機能的には問題ありません。
ステップ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
を参照してください。
アプリ内メッセージをDISCARD
し、アプリ内メッセージビューに置き換える場合は、アプリ内メッセージのクリック数とインプレッション数を手動で記録する必要があります。
Android では、アプリ内メッセージでlogClick
とlogImpression
を呼び出し、全画面のアプリ内メッセージではlogButtonClick
を呼び出すことで行われます。
アプリ内メッセージがスタックに置かれたら、BrazeInAppMessageManager.getInstance().requestDisplayInAppMessage()
を呼び出すことでいつでもそのメッセージの取得と表示を要求できます。このメソッドは、Braze に対しスタックから次に利用可能なアプリ内メッセージを表示するように要求します。
ステップ 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 への他の呼び出しの前に、Application.onCreate()
にIInAppMessageViewFactory
を設定することをお勧めします。これにより、アプリ内メッセージが表示される前にカスタムビューファクトリが設定されます。
Braze ビューインターフェイスの実装
slideup
のアプリ内メッセージビューはIInAppMessageView
を実装しています。full
およびmodal
のタイプのメッセージビューは、IInAppMessageImmersiveView
を実装しています。これらのクラスのいずれかを実装することで、Braze は必要に応じてクリックリスナーをカスタムビューに追加できます。すべての Braze ビュークラスは Android のView
クラスを拡張しています。
IInAppMessageView
を実装すると、カスタムビューの一部をクリック可能と定義できます。IInAppMessageImmersiveView
を実装すると、メッセージボタンビューと閉じるボタンビューを定義できます。
カスタムアニメーションファクトリ
アプリ内メッセージにはアニメーションの動作がプリセットされています。Slideup
メッセージは画面にスライドし、full
やmodal
メッセージはフェードインおよびフェードアウトします。アプリ内メッセージにカスタムアニメーションの動作を定義する場合、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())