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

数据库新增订单条目时如何向服务器应用发送通知

监听Firebase新订单并通知服务器的实现方案

看起来你已经找对了方向——用Firebase的ChildEventListener监听requests节点的新增记录,是实现实时触发通知的最佳方式之一!下面我来帮你完善代码,补上向服务器发送通知的核心逻辑:

1. 补全Firebase监听代码

首先把你的监听逻辑补全,确保能正确获取到新订单的数据:

database = FirebaseDatabase.getInstance();
myRef = database.getReference("requests");

myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        // 这里假设你有一个Order实体类来映射订单数据
        Order newOrder = dataSnapshot.getValue(Order.class);
        
        if (newOrder != null) {
            // 触发向服务器发送通知的方法
            notifyServerAboutNewOrder(newOrder);
            Toast.makeText(MainActivity.this, "订单提交成功,已通知服务器", Toast.LENGTH_SHORT).show();
        }
    }

    // 其他必须实现的接口方法可以留空,或者根据需求添加逻辑
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {}

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // 处理监听失败的情况,给用户反馈
        Toast.makeText(MainActivity.this, "监听订单失败:" + databaseError.getMessage(), Toast.LENGTH_LONG).show();
    }
});

2. 实现向服务器发送通知的核心逻辑

这里提供两种最常用的实现方式,你可以根据服务器的架构选择:

方式一:直接调用服务器API(OkHttp示例)

如果你的服务器提供了接收新订单通知的HTTP接口,用OkHttp发送POST请求是最直接的方式:

private void notifyServerAboutNewOrder(Order order) {
    OkHttpClient client = new OkHttpClient();
    
    // 把订单对象转成JSON字符串,方便服务器解析
    Gson gson = new Gson();
    String orderJson = gson.toJson(order);
    
    RequestBody requestBody = RequestBody.create(
        orderJson,
        MediaType.parse("application/json; charset=utf-8")
    );
    
    Request request = new Request.Builder()
        .url("你的服务器API地址,比如https://your-server.com/api/orders/new")
        .post(requestBody)
        .build();
    
    // 异步发送请求,避免阻塞UI线程
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            // 请求失败时,切换回UI线程提示用户
            MainActivity.this.runOnUiThread(() -> 
                Toast.makeText(MainActivity.this, "通知服务器失败:" + e.getMessage(), Toast.LENGTH_SHORT).show()
            );
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                MainActivity.this.runOnUiThread(() -> 
                    Toast.makeText(MainActivity.this, "服务器已收到新订单通知", Toast.LENGTH_SHORT).show()
                );
            } else {
                MainActivity.this.runOnUiThread(() -> 
                    Toast.makeText(MainActivity.this, "通知服务器失败:服务器返回错误", Toast.LENGTH_SHORT).show()
                );
            }
        }
    });
}

别忘了在你的build.gradle(Module级别)里添加依赖:

implementation 'com.squareup.okhttp3:okhttp:4.11.0'
implementation 'com.google.code.gson:gson:2.10.1'

方式二:用Firebase Cloud Messaging(FCM)推送

如果你的服务器应用也集成了FCM,或者是一个需要实时接收通知的服务,用FCM推送会更高效:

  1. 确保客户端已经集成FCM,并且服务器端有对应的FCM令牌(或者用主题订阅的方式,比如订阅new_orders主题)
  2. 构建并发送FCM消息:
private void notifyServerAboutNewOrder(Order order) {
    // 服务器端的FCM令牌,或者主题名称
    String target = "SERVER_FCM_TOKEN"; // 或者 "/topics/new_orders"
    
    // 构建通知内容和数据
    JSONObject notification = new JSONObject();
    try {
        notification.put("title", "新订单提醒");
        notification.put("body", "用户" + order.getCustomerName() + "提交了新订单");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
    JSONObject data = new JSONObject();
    try {
        data.put("orderId", order.getId());
        data.put("totalAmount", order.getTotalAmount());
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
    JSONObject fcmPayload = new JSONObject();
    try {
        fcmPayload.put("to", target);
        fcmPayload.put("notification", notification);
        fcmPayload.put("data", data);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
    // 发送FCM请求到Google的FCM服务器
    OkHttpClient client = new OkHttpClient();
    RequestBody body = RequestBody.create(
        fcmPayload.toString(),
        MediaType.parse("application/json; charset=utf-8")
    );
    
    Request request = new Request.Builder()
        .url("https://fcm.googleapis.com/fcm/send")
        .post(body)
        .addHeader("Authorization", "key=你的FCM服务器密钥")
        .build();
    
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            MainActivity.this.runOnUiThread(() -> 
                Toast.makeText(MainActivity.this, "推送通知失败:" + e.getMessage(), Toast.LENGTH_SHORT).show()
            );
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                MainActivity.this.runOnUiThread(() -> 
                    Toast.makeText(MainActivity.this, "已向服务器推送新订单通知", Toast.LENGTH_SHORT).show()
                );
            } else {
                MainActivity.this.runOnUiThread(() -> 
                    Toast.makeText(MainActivity.this, "推送通知失败:服务器返回错误", Toast.LENGTH_SHORT).show()
                );
            }
        }
    });
}

注意:FCM服务器密钥要妥善保管,不要硬编码在客户端——最好的做法是客户端先把订单数据发给自己的后端,再由后端调用FCM API发送通知,避免密钥泄露。

3. 关键注意事项

  • 线程安全:所有网络请求必须在后台线程执行,上面的示例都用了OkHttp的异步回调,并且更新UI时切换回了UI线程,避免ANR。
  • 错误处理:一定要处理网络失败、数据库监听失败等异常情况,给用户明确的反馈,同时避免应用崩溃。
  • 安全性:如果用HTTP请求,务必使用HTTPS;FCM相关的密钥和令牌不要暴露在客户端代码中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:58:41