做者:史婧羽,開發技術推廣工程師,Partner DevRelhtml
本文爲 Android 電量管理系列連載的第二篇,但願您能在閱讀過程當中收穫設備續航方面的戰略洞見和實踐指導。android
通知是讓應用用戶保持聯繫和獲取更新的重要渠道。Android 提供通知 API 用於在設備上建立和發佈通知,但這些通知常常由外部事件觸發,並從應用服務器發送至應用。web
本文將解釋什麼時候以及如何生成這些遠程通知,以便爲用戶提供及時更新並儘可能省電。api
咱們推薦使用 Firebase 雲消息 (FCM) 發送遠程通知到 Android 設備。FCM 是一種免費的跨平臺消息傳遞解決方案,每日可靠傳遞千億條消息。尤爲是用於發送遠程通知,以通知客戶端應用數據可同步。若是您仍使用已被棄用的 Google 雲消息 (GCM) 或 C2DM 庫,是時候升級到 FCM 了!服務器
有兩種類型的 FCM 消息可選:網絡
您能夠把數據信息的優先級設爲高或普通。如需進一步瞭解 FCM 消息和消息處理,可參閱 Firebase 博客上的這篇文章。app
FCM 針對 Android 電源管理特性進行了優化。運用合適的消息優先級和類型,能幫您及時通知用戶,還能幫用戶省電。如需進一步瞭解電源管理,可參閱這篇文章:"Android 9 Pie 中的 Moar 電源及將來"。ide
您發送的全部通知都應該設計良好且可執行,而且能爲用戶提供及時相關的信息。咱們推薦您遵循這些通知指導原則,並避免向用戶發送垃圾信息。沒人想被無關或雜亂無章的通知打擾。若是您的應用這樣作,用戶可能屏蔽通知甚至卸載您的應用。測試
Material Design 通知文檔中的 ‘什麼時候不使用’ 通知一節列出了不該該向用戶發送通知的一些狀況。例如,普通優先級 FCM 數據消息的常見用例是告訴應用有新內容準備同步,但這一操做無需用戶交互。因此同步不須要通知用戶,應在後臺靜默進行,而您能夠用 WorkManager (當 WorkManager 達到穩定版本後,將是最爲推薦的後臺處理解決方案。) 或 JobScheduler API 來安排同步。優化
若是您須要發送遠程通知,則應始終在收到 FCM 消息後儘快發佈通知。若是在發佈通知前添加任何額外網絡請求,都會致使發送給某些用戶的通知延遲。若是處理不當,通知可能根本不會被用戶看到,參閱下節 "避免後臺服務"。
⚠️ 發佈通知前應避免添加任何額外網絡請求
還要記住,根據設備狀態、用戶操做和應用行爲,一個或多個省電功能可能會限制應用的後臺工做。應用的 jobs 和 alarmas 可能被延遲,且訪問網絡的功能可能被限制。
所以,爲確保及時傳遞通知,應始終在收到 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 政策近期變動 (自 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 消息的限制。可經過 isBackgroundRestricted API 檢查應用是否處於受限狀態。若是應用處於受限狀態,FCM 消息則根本不會被傳遞至應用。這對高優先級和普通優先級 FCM 消息均適用,且不管應用處於前臺仍是後臺。
應用待機分組根據應用所在的分組實施不一樣程度的限制。根據應用所屬分組,每日發送的高優先級消息數量可能受限。當您發送達到所在分組的最高數量後,全部後續高優先級消息都會被降級爲普通優先級。詳見電源管理限制。
高優先級 FCM 消息的設計初衷是發送會觸發用戶交互的遠程通知。若是您只將高優先級消息用於這些目的,您的高優先級將被當即傳遞且遠程通知會被無延遲顯示。此外,當高優先級消息通知讓用戶打開應用時,應用會被提高至活躍分組,再也不受應用待機分組對 FCM 高優先級數量限制。下面的例子顯示,用戶點了一條高優先級 FCM 消息觸發的通知後,即時通信應用被移至活躍分組。
總之,應僅在傳遞時效性強的通知給用戶時,才使用高優先級 FCM 消息。這樣能夠確保這些消息和後續的高優先級消息可以及時送達用戶且不被降級。而若是是須要觸發無需當即執行的事件,如:時效性不強的通知或後臺數據同步,則應使用普通優先級消息。
咱們強烈推薦您在上述所有電源管理功能環境下測試您的應用。如需進一步瞭解處理代碼中 Android 的 FCM 消息,請訪問 Firebase 博客。
感謝您幫助促進 Android 生態系統,打造更好的應用程序,併爲用戶省電!
點擊這裏前往 Firebase 官方文檔 查看更多信息