You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android前台状态下如何取消推送通知默认弹窗并自定义弹窗?

解决前台自定义推送弹窗的问题

刚接触推送通知很正常,这个问题其实是很多新手都会碰到的——系统默认的通知弹窗不符合需求,想要换成自己的样式对吧?咱们一步步来搞定:

核心思路

当应用处于前台时,onMessageReceived方法会被触发,这时候我们要绕过系统的默认通知逻辑,自己解析推送内容,然后展示自定义弹窗。

第一步:修改onMessageReceived方法

首先,不要调用父类的super.onMessageReceived(remoteMessage),因为父类方法会自动触发系统默认通知。我们自己解析推送的标题和内容:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // 注释掉super,避免系统弹出默认通知
    // super.onMessageReceived(remoteMessage);

    String pushTitle = "";
    String pushContent = "";

    // 解析通知消息(服务器用通知格式发送的内容)
    if (remoteMessage.getNotification() != null) {
        pushTitle = remoteMessage.getNotification().getTitle();
        pushContent = remoteMessage.getNotification().getBody();
    }

    // 解析数据消息(服务器自定义的键值对数据)
    if (!remoteMessage.getData().isEmpty()) {
        pushTitle = remoteMessage.getData().get("title");
        pushContent = remoteMessage.getData().get("content");
        // 这里还可以获取其他自定义参数,比如跳转链接、页面标识等
    }

    // 调用自定义弹窗方法
    showCustomPushDialog(pushTitle, pushContent);
}

第二步:实现自定义弹窗

注意:onMessageReceived是在后台线程执行的,所以要切换到主线程才能展示UI弹窗。这里我们用AlertDialog做示例,你也可以换成自己的自定义布局Dialog:

private void showCustomPushDialog(String title, String content) {
    // 切换到主线程更新UI
    new Handler(Looper.getMainLooper()).post(() -> {
        Context context = getApplicationContext();

        // 检查Android 8.0+的弹窗权限(必须申请,否则弹窗不显示)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) {
            // 引导用户去设置开启权限
            Intent permissionIntent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + context.getPackageName()));
            permissionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(permissionIntent);
            return;
        }

        // 创建自定义弹窗
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
        dialogBuilder.setTitle(title)
                .setMessage(content)
                .setPositiveButton("查看", (dialog, which) -> {
                    // 点击后的逻辑,比如跳转到指定页面
                    Intent intent = new Intent(context, YourTargetActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                    dialog.dismiss();
                })
                .setNegativeButton("关闭", (dialog, which) -> dialog.dismiss());

        AlertDialog customDialog = dialogBuilder.create();

        // Android 8.0+需要设置弹窗类型
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            customDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
        }

        customDialog.show();
    });
}

第三步:配置必要权限

在AndroidManifest.xml中添加弹窗权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

额外提示

  • 如果服务器能控制推送类型,建议发送数据消息,而不是通知消息。数据消息不会被系统自动处理,所有逻辑都由你在onMessageReceived中控制,更灵活。
  • 如果你想让弹窗绑定到当前前台Activity(而不是应用上下文),可以写一个全局的Activity管理类,用来获取栈顶的Activity,这样弹窗的生命周期会更贴合当前页面。

内容的提问来源于stack exchange,提问作者Pooja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:36:58