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

寻求无需Google Play服务的Android开源推送通知解决方案

推荐方案:EMQX + MQTT Android 客户端

完全匹配你所有需求的开源免费方案,以下是详细说明和实现步骤:

方案适配性验证

  • 无Google Play依赖:基于标准MQTT协议,Android客户端仅需网络权限,无需安装Google Play服务或应用商店。
  • 高并发支持:EMQX开源免费版原生支持10万+并发连接,轻松覆盖10000+客户端需求,集群模式可进一步扩容。
  • 多目标推送能力:
    • 单个客户端:为每个设备分配唯一Client ID,发送消息到主题device/{clientId},对应客户端订阅该主题即可接收。
    • 客户端群组:创建群组主题(如group/{groupId}),同组客户端统一订阅该主题,发布消息到该主题即可实现群组推送。
    • 所有客户端:使用全局广播主题(如broadcast/all),所有客户端订阅后即可接收全量推送。
  • 授权机制:EMQX支持ACL访问控制、JWT/HTTP认证,可配置为仅授权服务器(指定Client ID或携带认证Token)能发布消息,客户端仅允许订阅、禁止发布。
  • 纯数据消息支持:MQTT消息本身为二进制/文本纯数据,Android客户端接收后可直接解析,完全由应用自定义处理逻辑(执行操作、显示应用内通知等),无需系统通知栏介入。

Android客户端实现步骤(最新稳定版)

1. 添加依赖

在Module级别的build.gradle中引入官方MQTT客户端库:

dependencies {
    implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
    implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}

2. 配置权限与服务

在AndroidManifest.xml中添加必要权限和MQTT服务:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<service android:name="org.eclipse.paho.android.service.MqttService" />

3. 核心代码实现

import android.content.Context;
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.*;

public class MqttPushHandler {
    private static final String BROKER_ADDRESS = "tcp://你的EMQX服务器IP:1883";
    private MqttAndroidClient mqttClient;
    private final String clientId = "android_device_" + System.currentTimeMillis(); // 生成唯一设备ID

    // 初始化连接
    public void initConnection(Context context) {
        mqttClient = new MqttAndroidClient(context, BROKER_ADDRESS, clientId);
        MqttConnectOptions connectOptions = new MqttConnectOptions();
        connectOptions.setCleanSession(false); // 开启持久会话,断线重连后接收未达消息
        connectOptions.setAutomaticReconnect(true); // 自动重连机制

        try {
            mqttClient.connect(connectOptions, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken token) {
                    // 连接成功后订阅所需主题
                    subscribeToTargets();
                }

                @Override
                public void onFailure(IMqttToken token, Throwable exception) {
                    // 连接失败处理(如重试提示)
                }
            });

            // 设置消息回调,处理纯数据消息
            mqttClient.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    // 连接丢失后的重连逻辑已由自动重连处理
                }

                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    // 收到纯数据消息,自定义业务逻辑
                    String dataPayload = new String(message.getPayload());
                    // 示例:解析数据、触发应用内操作、显示内部通知
                    handleReceivedData(dataPayload);
                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {
                    // 客户端无需发布消息,此方法可留空
                }
            });
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    // 订阅单个设备、群组、全局主题
    private void subscribeToTargets() {
        try {
            mqttClient.subscribe("device/" + clientId, 0); // 单个设备主题
            mqttClient.subscribe("group/your_target_group", 0); // 群组主题
            mqttClient.subscribe("broadcast/all_devices", 0); // 全局广播主题
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    // 自定义数据处理逻辑
    private void handleReceivedData(String payload) {
        // 这里写入你的业务代码,比如解析JSON、执行本地操作、显示应用内弹窗等
    }

    // 断开连接(如应用退出时调用)
    public void disconnect() {
        try {
            if (mqttClient != null && mqttClient.isConnected()) {
                mqttClient.disconnect();
            }
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}

EMQX服务端授权配置

1. 认证设置

在EMQX控制台开启JWT认证,要求发布消息的服务器携带有效JWT Token,EMQX验证通过后允许发布操作。

2. ACL规则配置

添加以下ACL规则,限制客户端仅能订阅、禁止发布,仅授权服务器能发布消息:

# 允许客户端订阅自身设备主题、群组主题、全局主题
allow subscribe device/%c
allow subscribe group/#
allow subscribe broadcast/#

# 仅允许指定授权服务器的Client ID发布所有主题
allow publish # if clientid = "authorized_server_id"

备选方案:Mosquitto

如果并发需求相对较低(1万+完全足够),Mosquitto是轻量型MQTT broker,配置更简单,Android端代码与上述完全通用,适合资源有限的部署场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:11:02