使用 FCM 通知您的使用者
作者:史婧羽,開發技術推廣工程師,Partner DevRel
本文為 Android 電量管理系列連載的第二篇,希望您能在閱讀過程中收穫裝置續航方面的戰略洞見和實踐指導。
通知是讓應用使用者保持聯絡和獲取更新的重要渠道。Android 提供通知 API 用於在裝置上建立和釋出通知,但這些通知經常由外部事件觸發,並從應用伺服器傳送至應用。
本文將解釋何時以及如何生成這些遠端通知,以便為使用者提供及時更新並儘量省電。
用 FCM 實現遠端通知
我們推薦使用Firebase 雲訊息 (FCM) 傳送遠端通知到 Android 裝置。FCM 是一種免費的跨平臺訊息傳遞解決方案,每日可靠傳遞千億條訊息。尤其是用於傳送遠端通知,以通知客戶端應用資料可同步。如果您仍使用已被棄用的Google 雲訊息 (GCM) 或C2DM 庫,是時候升級到 FCM 了!
有兩種型別的 FCM 訊息可選:
- 通知訊息,簡化了通知處理且預設高優先順序。
- 資料訊息,適用於在客戶端應用內處理 FCM 訊息。
您可以把資料資訊的優先順序設為高或普通。如需進一步瞭解 FCM 訊息和訊息處理,可參閱 ofollow,noindex">Firebase 部落格上的這篇文章 。
FCM 針對 Android 電源管理特性進行了優化。運用合適的訊息優先順序和型別,能幫您及時通知使用者,還能幫使用者省電。如需進一步瞭解電源管理,可參閱這篇文章:" Android 9 Pie 中的 Moar 電源及未來 "。
是否需要傳送通知?
您傳送的所有通知都應該設計良好且可執行,並且能為使用者提供及時相關的資訊。我們推薦您遵循這些通知指導原則,並避免向用戶傳送垃圾資訊。沒人想被無關或雜亂無章的通知打擾。如果您的應用這樣做,使用者可能遮蔽通知甚至解除安裝您的應用。
Material Design 通知文件 中的 ‘何時不使用’ 通知一節列出了不應該向使用者傳送通知的一些情況。例如,普通優先順序 FCM 資料訊息的常見用例是告訴應用有新內容準備同步,但這一操作無需使用者互動。所以同步不需要通知使用者,應在後臺靜默進行,而您可以用WorkManager (當 WorkManager 達到穩定版本後,將是最為推薦的後臺處理解決方案。) 或JobScheduler API 來安排同步。
先發佈一個通知
如果您需要傳送遠端通知,則應始終在收到 FCM 訊息後儘快釋出通知。如果在釋出通知前新增任何額外網路請求,都會導致傳送給某些使用者的通知延遲。如果處理不當,通知可能根本不會被使用者看到,參閱下節 "避免後臺服務"。
:warning: 釋出通知前應避免新增任何額外網路請求
還要記住,根據裝置狀態、使用者操作和應用行為,一個或多個省電功能可能會限制應用的後臺工作。應用的 jobs 和 alarmas 可能被延遲,且訪問網路的功能可能被限制。
因此,為確保及時傳遞通知,應始終在收到 FCM 訊息後立即顯示通知,然後再進行網路獲取或排程任務等其他工作。
善用 FCM 訊息有效負載
如果您需要在收到 FCM 訊息後釋出通知,則應在 FCM 訊息有效負載中包含通知所需的全部資料。
這個建議同樣也適用於資料同步——我們推薦應用在 FCM 有效負載中傳送儘量多的資料,如必要,在應用開啟時再載入剩餘資料。如果網路良好,資料很可能在使用者開啟應用前就同步完成,所以使用者不會看到載入進度條。如果網路不好,使用 FCM 有效負載中的內容就可以確保發一條通知給使用者,從而仍然可以及時通知使用者。然後使用者可以開啟應用再載入全部資料。
您還可以用Capillary等庫對 FCM 訊息進行端到端加密。下圖顯示了 FCM 訊息的一般處理流程。

需要更多資料?
雖然 FCM 訊息有效負載很方便,但有最大 4KB 限制。如果您需要傳送帶圖片等豐富媒體內容的通知,或想通過嚮應用持續同步媒體內容來改善使用者體驗,就需要超過 4KB 有效負載限制。對此,我們推薦將 FCM 訊息與 WorkManager 或 JobScheduler API 配合使用。
如果您需要釋出有豐富媒體內容的通知,我們推薦您先用 FCM 訊息中的部分內容釋出通知。然後排程一項任務獲取其餘內容。任務完成後再更新通知 (如果此時通知仍處於活躍狀態)。例如,可以在 FCM 有效負載中包含內容縮圖或預覽並先在通知中釋出。然後排程一項任務獲取媒體檔案。注意,如果從 FCM 的 handler 中進行任務排程,則有可能當用戶啟動應用時,所排程的任務還沒完成。這種情況應妥善處理。
簡言之,用 FCM 訊息有效負載中的資料釋出通知,並保持首先更新應用內容。如果需要更多資料,則用 WorkManager 或 JobScheduler API 排程任務。
避免後臺服務
常見錯誤是在 FCM 的 handler 中使用後臺服務,因為根據 Google+Play/">Google Play 政策近期變更 ( 自 2018 年末起,Google Play 將要求最低目標 API Level ), 系統會停止後臺服務 。
Android 9 Pie 也會在開啟省電模式時強制限制後臺執行。當使用普通優先順序的 FCM 訊息時,啟動後臺服務會導致 IllegalStateException。高優先順序訊息會授權您短暫白名單視窗,允許啟動後臺服務。但使用這個視窗來啟動後臺服務從而進行網路連線,服務可能被系統終止,因為這個白名單視窗是為用於釋出通知而設計的。
總而言之,應避免使用後臺服務,而是用 WorkManager 或 JobScheduler API 來執行後臺操作。
電源和訊息優先順序
Android 6 Marshmallow 引入了 Doze 模式。FCM 針對 Doze 進行了優化,您可使用高優先順序 FCM 訊息立即通知使用者。在 Doze 模式,普通優先順序訊息被延遲至維護視窗。這一功能讓系統能在裝置空閒時省電,但同時確保使用者收到時效性強的通知。例如:即時通訊應用需要向用戶傳送好友訊息或來電,而家庭監護應用需要向用戶傳送警報通知。在這些場景中,可以使用高優先順序 FCM 訊息。
此外,Android 9 Pie還引入了應用待機分組和應用限制的新功能。
下表顯示了不同電源管理功能對 FCM 訊息傳遞行為的影響。

Doze "on the go": developer.android.google.cn/about/versi…
應用待機分組: developer.android.google.cn/about/versi…
應用限制: developer.android.google.cn/topic/perfo…
省電模式: developer.android.google.cn/about/versi…
可能受限: developer.android.google.cn/topic/perfo…
★ 注意:自 2019 年 1 月起,應用限制(在電池設定裡) 將包括對 FCM 訊息的限制。可通過 ActivityManager%23isBackgroundRestricted()" rel="nofollow,noindex">isBackgroundRestricted API 檢查應用是否處於受限狀態。如果應用處於受限狀態,FCM 訊息則根本不會被傳遞至應用。這對高優先順序和普通優先順序 FCM 訊息均適用,且無論應用處於前臺還是後臺。
應用待機分組根據應用所在的分組實施不同程度的限制。根據應用所屬分組,每日傳送的高優先順序訊息數量可能受限。當您傳送達到所在分組的最高數量後,所有後續高優先順序訊息都會被降級為普通優先順序。詳見電源管理限制。
高優先順序 FCM 訊息的設計初衷是傳送會觸發使用者互動的遠端通知。如果您只將高優先順序訊息用於這些目的,您的高優先順序將被立即傳遞且遠端通知會被無延遲顯示。此外,當高優先順序訊息通知讓使用者開啟應用時,應用會被提升至活躍分組,不再受應用待機分組對 FCM 高優先順序數量限制。下面的例子顯示,使用者點了一條高優先順序 FCM 訊息觸發的通知後,即時通訊應用被移至活躍分組。

但如果您使用高優先順序訊息傳送通知給被已被使用者遮蔽的通知渠道或觸發無需使用者互動的後臺任務,就可能浪費應用分組的高優先順序訊息份額。達到數量上限後,將再也無法傳送緊急通知。
總之,應僅在傳遞時效性強的通知給使用者時,才使用高優先順序 FCM 訊息。這樣可以確保這些訊息和後續的高優先順序訊息能夠及時送達使用者且不被降級。而如果是需要觸發無需立即執行的事件,如:時效性不強的通知或後臺資料同步,則應使用普通優先順序訊息。
用 Android 9 測試!
我們強烈推薦您在上述全部電源管理功能環境下測試您的應用。如需進一步瞭解處理程式碼中 Android 的 FCM 訊息,請訪問Firebase 部落格。
感謝您幫助促進 Android 生態系統,打造更好的應用程式,併為使用者省電!
點選這裡前往 Firebase 官方文件 檢視更多資訊