寻求无需Google Play服务的Android开源推送通知解决方案
推荐方案:EMQX + MQTT Android 客户端
完全匹配你所有需求的开源免费方案,以下是详细说明和实现步骤:
方案适配性验证
- 无Google Play依赖:基于标准MQTT协议,Android客户端仅需网络权限,无需安装Google Play服务或应用商店。
- 高并发支持:EMQX开源免费版原生支持10万+并发连接,轻松覆盖10000+客户端需求,集群模式可进一步扩容。
- 多目标推送能力:
- 单个客户端:为每个设备分配唯一Client ID,发送消息到主题
device/{clientId},对应客户端订阅该主题即可接收。 - 客户端群组:创建群组主题(如
group/{groupId}),同组客户端统一订阅该主题,发布消息到该主题即可实现群组推送。 - 所有客户端:使用全局广播主题(如
broadcast/all),所有客户端订阅后即可接收全量推送。
- 单个客户端:为每个设备分配唯一Client ID,发送消息到主题
- 授权机制: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
相关产品推荐
相关产品推荐

