現象
- App 在後台、手機鎖屏時收不到個推訊息,但螢幕會亮起。
- 收到推送後,通知欄完全沒有該條訊息。
根因分析
- Android 系統機制:App 進程在後台/鎖屏時極易被系統回收(Doze 模式、App Standby、廠商優化)。**沒有前台 Service(`startForeground`)或系統級推送通道(FCM/華為/小米/OPPO/Vivo 推送),進程無法常駐**,自然收不到訊息。
- 通知未顯示:客戶端收到推送 payload 後,**必須主動呼叫 `NotificationManager.notify()` 建立通知**。若代碼邏輯缺失、Channel 未建立(Android 8.0+)、或進程在處理前被殺,通知自然不會出現。
標準接入檢查清單
- 配置 `IntentService` / `BroadcastReceiver` 接收推送:在 `AndroidManifest` 註冊,`exported="true"`,權限正確。
- 實現 `onMessageReceived` / `onReceive` 中建立通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle(title).setContentText(content).setSmallIcon(R.drawable.ic_push)
.setAutoCancel(true).setContentIntent(pendingIntent);
NotificationManagerCompat.from(this).notify(notifyId, builder.build());
- Android 8.0+ 必須建立 NotificationChannel:`importance` 設為 `DEFAULT` 或 `HIGH`。
- 接入廠商推送 SDK(關鍵):華為 HMS Push、小米 MiPush、OPPO Push、Vivo Push、魅族 Push、FCM(海外)。**個推等第三方推送在國內廠商手機上必須走廠商通道才能在殺進程/鎖屏下送達**。
- 申請自啟動/後台彈窗/通知權限:引導用戶在系統安全中心/電池優化白名單中授權。
快速驗證
- 手機連 USB,`adb logcat | grep -i getui` 觀察推送到達日誌。
- 強制停用 App 後,從個推後台發測試推送,觀察通知欄。
- 對比:集成廠商 SDK 前後送達率差異。
總結
個推收不到/不顯示,**核心在於「進程不活」+「通知建立邏輯缺失/Channel 缺失」**。**必須接入廠商推送 SDK + 前台 Service + NotificationChannel + 白名單引導**,才能在國內 Android 生態實現可靠送達與顯示。