JAVA Web应用向Android发送推送通知的实现问题咨询
嘿,我之前也折腾过Java Web向Android发推送的需求,目前最成熟也最省心的方案就是用Firebase Cloud Messaging(FCM),给你一步步捋清楚实现流程,都是我实际踩坑后总结的干货:
第一步:先搞定FCM基础环境配置
- 去Firebase控制台创建一个新项目,然后添加你的Android应用,按照提示填包名等信息,最后下载
google-services.json文件,把它放到Android项目的app目录下。 - 回到Firebase控制台,找到项目设置里的「服务账号」选项,下载JSON格式的私钥文件,这个是给Java Web后端用的,用来和FCM服务器鉴权。
第二步:Android端配置推送接收能力
- 首先在Android项目的
build.gradle(Module级别)里添加FCM依赖:implementation 'com.google.firebase:firebase-messaging:23.4.0' - 创建一个继承自
FirebaseMessagingService的类,重写onMessageReceived方法,这里就是你处理推送消息的核心逻辑:public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { // 获取推送的标题和内容 String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); // 调用自定义方法弹出系统通知 showNotification(title, body); // 如果有业务需要的自定义数据,这样获取 Map<String, String> customData = remoteMessage.getData(); String businessKey = customData.get("order_id"); } private void showNotification(String title, String body) { // 这里可以用NotificationManager实现通知弹出逻辑,按需定制样式即可 } } - 在
AndroidManifest.xml里注册这个服务:<service android:name=".MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> - 获取设备的FCM令牌(Token),这个是后端指定推送目标的唯一标识,要传给后端存入数据库:
划重点:如果用户卸载重装APP、清除数据,令牌会更新,一定要在FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { Log.w("FCM", "获取令牌失败", task.getException()); return; } // 获取到的有效令牌 String token = task.getResult(); // 调用后端接口把token存起来 });onNewToken方法里把新令牌同步给后端,避免推送失败。
第三步:Java Web后端实现推送逻辑
- 首先在后端项目里引入FCM的Java SDK依赖(以Maven为例):
<dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>9.2.0</version> </dependency> - 初始化FCM客户端,用之前下载的服务账号私钥:
FileInputStream serviceAccount = new FileInputStream("你的服务账号私钥文件路径"); FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options); - 构建推送消息并发送,比如给指定令牌的设备发推送:
// 从数据库取出目标用户的FCM令牌 String targetToken = "用户的FCM令牌"; Message message = Message.builder() .setToken(targetToken) .setNotification(Notification.builder() .setTitle("订单提醒") .setBody("你的外卖已送达") .build()) // 附加业务自定义数据 .putData("order_id", "123456") .build(); String response = FirebaseMessaging.getInstance().send(message); System.out.println("推送成功,响应ID:" + response);
一些避坑提醒
- 令牌更新机制:Android端一定要监听
onNewToken事件,及时同步新令牌到后端,不然旧令牌会导致推送失败。 - 推送优先级:如果需要即时推送(比如聊天消息),可以设置消息优先级为
high,确保APP在后台也能及时收到通知。 - 测试先行:先用Firebase控制台的「云消息传递」功能发测试推送,验证Android端接收正常后,再对接后端逻辑,减少排障成本。
内容的提问来源于stack exchange,提问作者Hacker Smart
相关产品推荐
相关产品推荐

