首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 用 Mina 長連接:Service 守護 + 心跳重連 + 喚醒機制,才是正確打開方式

     編輯:程式設計綜合問答

手機客戶端用 Mina 維持長連,單純在 Activity 持有 Session 遠遠不夠。本文給出生產級架構:Service 托管連接、CPU 喚醒鎖、定時心跳、休眠輪詢結合。

為什麼 Activity 直接持有 Session 不行?

  • Activity 生命週期不可控,切換頁面、鎖屏、系統回收皆會斷開連接。
  • 移動網路頻繁切換(WiFi/4G/5G),TCP 連接極易失效。
  • Android 6.0+ Doze 模式會切斷非必要網路,純長連無法存活。

推薦架構圖

[Application] --> [ConnectionService (Foreground Service)]
                        |-- Mina Client (IoSession)
                        |-- Heartbeat Timer (每 30s 發送 Ping)
                        |-- WakeLock (PARTIAL_WAKE_LOCK 保 CPU)
                        |-- NetworkCallback (監聽網路變化,觸發重連)
                        |-- BroadcastManager (向 UI 發送業務消息)

關鍵實現細節

1. 前台 Service 避免被殺

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("消息服務運行中")
    .setSmallIcon(R.drawable.ic_notify)
    .setPriority(NotificationCompat.PRIORITY_LOW);
startForeground(SERVICE_ID, builder.build());

2. 心跳 + 重連邏輯

// 發送心跳
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);
}

3. Doze 模式下的「偽長連」策略

  • 螢幕亮/用戶活躍 → 真長連(Mina 持續在線)。
  • 進入休眠 → 釋放連接,改用 AlarmManager.setExactAndAllowWhileIdle 定時喚醒,發起短連 HTTP/HTTPS 輪詢拉取離線消息。
  • 網路恢復/用戶解鎖 → 立即建立長連,補拉漏發消息。

何時可考慮放棄長連?

若無即時推送需求(如 IM、股票行情),純業務請求用 短連 + Retrofit/OkHttp 更省電、架構更簡單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved