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
相关产品推荐
相关产品推荐

