手機客戶端用 Mina 維持長連,單純在 Activity 持有 Session 遠遠不夠。本文給出生產級架構:Service 托管連接、CPU 喚醒鎖、定時心跳、休眠輪詢結合。
[Application] --> [ConnectionService (Foreground Service)]
|-- Mina Client (IoSession)
|-- Heartbeat Timer (每 30s 發送 Ping)
|-- WakeLock (PARTIAL_WAKE_LOCK 保 CPU)
|-- NetworkCallback (監聽網路變化,觸發重連)
|-- BroadcastManager (向 UI 發送業務消息)
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("消息服務運行中")
.setSmallIcon(R.drawable.ic_notify)
.setPriority(NotificationCompat.PRIORITY_LOW);
startForeground(SERVICE_ID, builder.build());
// 發送心跳
private void sendHeartbeat() {
if (session != null && session.isConnected()) {
session.write(new HeartbeatPacket());
} else {
reconnect();
}
}
// 指數退避重連
private void reconnect() {
scheduler.schedule(() -> connector.connect(new InetSocketAddress(host, port)),
Math.min(attempt * 2, 60), TimeUnit.SECONDS);
}
AlarmManager.setExactAndAllowWhileIdle 定時喚醒,發起短連 HTTP/HTTPS 輪詢拉取離線消息。若無即時推送需求(如 IM、股票行情),純業務請求用 短連 + Retrofit/OkHttp 更省電、架構更簡單。