--- title: "Android personalizado na caixa de entrada móvel" slug: "android-custom-inbox" updated: 2026-06-12T10:30:51Z published: 2026-06-12T10:30:51Z canonical: "docs.xtremepush.com/android-custom-inbox" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.xtremepush.com/llms.txt > Use this file to discover all available pages before exploring further. # Android personalizado na caixa de entrada móvel 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: **Java** ```java public class XPushApplication extends Application implements InboxListListener {    @Override    public void inboxListReceived(ArrayList inboxList, WeakReference uiReference) {        // render your inbox UI    }    @Override    public void inboxListFailed() {        // handle error    } } ``` **Kotlin** ```kotlin class XPushApplication : Application(), InboxListListener {    override fun inboxListReceived(inboxList: ArrayList, uiReference: WeakReference) {        // 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. ```java 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. ```java 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`. **Java** ```java // Reading a custom payload field String ctaLabel = item.message.data != null ? item.message.data.get("cta_label") : null; if (ctaLabel != null) {    button.setText(ctaLabel); } ``` **Kotlin** ```kotlin val ctaLabel = item.message.data?.get("cta_label") ctaLabel?.let { button.text = it } ``` > [!NOTE] > 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. ## Lidar com ações de mensagens (deeplink & URL) 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. **Java** ```java 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    } } ``` **Kotlin** ```kotlin 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. **Java** ```java mPushConnector.reportMessageOpened(item.message, null, null); ``` **Kotlin** ```kotlin 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. **Java** ```java mPushConnector.reportMessageClicked(item.message, null, null); ``` **Kotlin** ```kotlin mPushConnector.reportMessageClicked(item.message, null, null) ``` ## Excluir uma mensagem de caixa de entrada **Java** ```java mPushConnector.deleteInboxMessage(String.valueOf(item.identifier), activity); ``` **Kotlin** ```kotlin 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. **Java** ```java int badge = mPushConnector.getInboxBadge(); ``` **Kotlin** ```kotlin val badge = mPushConnector.getInboxBadge() ```