Android personalizado na caixa de entrada móvel

Prev Next

Implemente uma caixa de entrada personalizada no seu aplicativo Android.

Por padrão, o XtremePush SDK renderiza a caixa de entrada como um WebView embutido. Uma caixa de entrada personalizada substitui isso pela sua própria interface nativa, dando controle total sobre o layout e a interação.

Quando você implementa uma caixa de entrada personalizada, o SDK continua a lidar:

  • Buscar e paginar mensagens da caixa de entrada da plataforma

  • Excluindo mensagens

  • Contagens de crachás de rastreamento

  • Enviando eventos analíticos abertos/clicados (quando você chama os métodos de relatório)

Seu aplicativo passa a ser responsável por:

  • Renderização de cada mensagem (título, corpo, imagem, ícone, layout de cartão vs alerta)

  • Gerenciando ações de tap (navegação por deeplink, abertura de URLs)

  • Chamando os métodos de reporte no momento certo

Configuração

  1. Implemente a InboxListListener interface na sua Application aula:

public class XPushApplication extends Application implements InboxListListener {
    @Override
    public void inboxListReceived(ArrayList<InboxMessageListItem> inboxList, WeakReference<Context> uiReference) {
        // render your inbox UI
    }
    @Override
    public void inboxListFailed() {
        // handle error
    }
}
class XPushApplication : Application(), InboxListListener {
    override fun inboxListReceived(inboxList: ArrayList<InboxMessageListItem>, uiReference: WeakReference<Context>) {
        // render your inbox UI
    }
    override fun inboxListFailed() {
        // handle error
    }
}

  1. Registre o ouvinte ao inicializar o SDK. Se você não ligar setInboxListListener, o SDK usa sua caixa de entrada embutida do WebView.

new PushConnector.Builder(XPUSH_APP_KEY, GOOGLE_PROJECT_NUMBER)
    .setInboxListListener(this)
    .create(this);

Recuperar mensagens da caixa de entrada

Ligue inboxListWithOffset para buscar mensagens. Os resultados são entregues ao inboxListReceived callback.

mPushConnector.inboxListWithOffset(context, LIMIT, OFFSET);

CaixaDe EntradaMensagemItensLista

Cada item da lista possui os seguintes campos:

Campo

Tipo

Descrição

identifier

int

ID de mensagem único

isOpened

boolean

Se a mensagem foi marcada como aberta

isClicked

boolean

Se a mensagem foi marcada como clicada

isDelivered

boolean

Se a mensagem foi entregue

createTimestamp

Long

Carimbo de data e hora do Unix de quando a mensagem foi criada

expirationTimestamp

Long

Carimbo de data de expiração do Unix, ou nulo se a mensagem não expirar

style

HashMap<String, String>

Valores de estilo — tecles: bg (cor de fundo), title_bg (cor da barra de título)

isCard

boolean

true para layout de cartões (imagem de banner de largura total), false para layout de alerta (miniatura pequena)

message

Message

Contém conteúdo da mensagem e ação de toque — veja abaixo

Trabalhando com conteúdo de mensagens

O message campo em cada InboxMessageListItem um contém o conteúdo completo da mensagem:

Campo

Tipo

Definido por

id

String

Plataforma (designada ao sistema)

campaignId

String

Plataforma (designada ao sistema)

title

String

Campanha — Campanha pelo título

text

String

Campanha — Push texto / campo do corpo

icon

String

Campanha — Empurrar o campo do ícone (volta para o ícone do app, depois ícone do projeto, se não estiver definido)

deeplink

String

Campanha — presente quando o tipo de ação é Deeplink; null caso contrário

url

String

Campanha — presente quando o tipo de ação for URL; null caso contrário

data

HashMap<String, String>

Campanha — Campos personalizados de carga útil (a partir da data chave na mensagem JSON)

deeplink e url são mutuamente exclusivos — apenas um será definido dependendo do tipo de ação configurado na campanha. Se nenhum dos dois estiver definido, a mensagem não tem ação de toque.

Layout e estilo estão no item da lista:

Campo

Tipo

Definido por

isCard

boolean

Campanha — configuração do tipo de caixa de entrada. true = layout de cartões (banner de largura total), false = layout de alerta (miniatura pequena)

style.get("bg")

String

Campanha — cor de fundo estilo caixa de entrada

style.get("title_bg")

String

Campanha — cor da barra de título estilo caixa de entrada

Campos personalizados de carga útil

Se a interface da sua caixa de entrada exigir dados além dos campos padrão — por exemplo, um rótulo CTA, uma URL secundária ou um valor de distintivo — adicione campos personalizados na seção de Carga Personalizada (payload_add) da campanha. Esses são entregues em item.message.data.

// Reading a custom payload field
String ctaLabel = item.message.data != null ? item.message.data.get("cta_label") : null;
if (ctaLabel != null) {
    button.setText(ctaLabel);
}
val ctaLabel = item.message.data?.get("cta_label")
ctaLabel?.let { button.text = it }

Modelos de Campanha

Como sua interface personalizada da caixa de entrada foi feita para renderizar uma estrutura de conteúdo específica, considere definir um modelo de campanha reutilizável na caixa de entrada na plataforma Xtremepush que preencha consistentemente os campos que sua interface espera. Por exemplo, se o layout do seu cartão sempre mostrar título, corpo, cor de fundo, ação de deeplink e um rótulo personalizado de CTA, defina esses campos como campos obrigatórios para qualquer campanha de entrada que tenha como alvo sua implementação personalizada.

Quando um usuário digitar uma mensagem, inspecione item.message para determinar o que fazer. O SDK não dispara DeeplinkListener callbacks automaticamente em uma caixa de entrada personalizada — seu app gerencia a navegação diretamente.

Sempre ligue reportMessageClicked para que a interação seja registrada na plataforma.

private void onInboxItemTapped(InboxMessageListItem item) {
    // Register the click with the platform
    mPushConnector.reportMessageClicked(item.message, null, null);
    if (item.message.deeplink != null && !item.message.deeplink.isEmpty()) {
        // Route through your app's navigation handler
        // MyRouter.navigate(item.message.deeplink);
    } else if (item.message.url != null && !item.message.url.isEmpty()) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(item.message.url));
        context.startActivity(intent);
    } else {
        // No tap action configured — message is informational only
    }
}
private fun onInboxItemTapped(item: InboxMessageListItem) {
    // Register the click with the platform
    mPushConnector.reportMessageClicked(item.message, null, null)
    when {
        !item.message.deeplink.isNullOrEmpty() -> {
            // Route through your app's navigation handler
            // MyRouter.navigate(item.message.deeplink)
        }
        !item.message.url.isNullOrEmpty() -> {
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(item.message.url))
            startActivity(intent)
        }
        else -> {
            // No tap action configured — message is informational only
        }
    }
}

Mensagem de reporte aberta na caixa de entrada

Chame isso quando uma mensagem se torna visível para o usuário (por exemplo, rolada para a visualização de um feed) sem um toque deliberado.

mPushConnector.reportMessageOpened(item.message, null, null);
mPushConnector.reportMessageOpened(item.message, null, null)

Mensagem de reportar entrada clicada

Chame isso quando um usuário deliberadamente toca uma mensagem. Isso também marca automaticamente a mensagem como aberta. Não ligue reportMessageOpened separadamente para mensagens grampeadas.

mPushConnector.reportMessageClicked(item.message, null, null);
mPushConnector.reportMessageClicked(item.message, null, null)

Excluir uma mensagem de caixa de entrada

mPushConnector.deleteInboxMessage(String.valueOf(item.identifier), activity);
mPushConnector.deleteInboxMessage(item.identifier.toString(), activity)

Receba o número do crachá da caixa de entrada

Retorna a contagem de não lidos em cache — use isso para exibir um badge sem fazer uma solicitação de rede.

int badge = mPushConnector.getInboxBadge();
val badge = mPushConnector.getInboxBadge()