Android我還可以相信你多少系列文章三之通知欄
說起通知欄,是一塊各個應用的必爭之地,不顯示通知欄就意味著沒有存在感,通知欄顯示得不靠前還得想方設法提前。加上OnGoing的通知還能提升進程優先順序,大有被濫用的趨勢。為了保活,雖然沒啥必要也得起個通知。甚至還有一些不顯示通知的前台Service黑科技廣為流傳,可以參考這裡。廠家和開發者的戰鬥越演欲烈,到現在即使OnGoing的Service放後台也照殺不誤,真是可憐了我們這群做音樂的。於是後台應用保護白名單,下拉鎖定,手機管家,省電模式,神隱模式等等用於限制後台運行的功能越來越多,可想應用怎麼斗得過系統?
還好Android上面有一鍵清除所有通知,否則現在一個App要出N個通知的情況要吐血。每一條新聞要出個通知,一天要通知好多次。自己保活不了不算,還要別人拉起來幫忙通知(後台startService起另外一個程序的用法也被比如華為系統限制)。我們在抱怨後台越來越被限制的同時,也要思考自己軟體是否做到了盡量少騷擾用戶。
通知欄的開發每個人心中都會有些傷痛。主要有以下幾點:
- 通知欄沒有顯示
- 通知欄不更新
- 點擊沒反應
- 通知欄上面內容看不清
- 通知欄的樣式長得跟其他不一樣,自己的獨樹一幟很突兀
事實上從Android的歷史版本來看,通知欄這個設計也是被改過了非常多次,不僅僅是樣式,還有各種功能改動,包括最新的O版本。為了保證更好的兼容性,我們建議:
1.遵循通知的設計的初衷
- Communication from other users
- Well-timed and informative task reminders
如官方所描述,通知用於和他人交流或者是有用任務提醒。所以在考慮是否使用通知的時候思考你的通知是否屬於上述兩類。是否用戶一天到晚都需要關心你的通知,你的通知對於用戶價值是咋樣的。你的所有東西都往上面丟也意味著別人可能也這麼做,兩敗俱傷。
2. 通知欄不顯示
高版本的原生系統自帶通知欄顯示管理功能,默認是允許顯示。但像oppo系統卻默認不允許顯示。 和廠家溝通是為了減少對用戶的影響。這種粗暴的管理方式甚至連音樂App也無法倖免。國內默認白名單的估計也就是QQ和微信了。對於這種特權App待遇處理又無奈又憤怒。我們能做的只能是檢測手機然後做引導提醒。
3.通知欄不更新
同樣發現在oppo,vivo手機上面,可能是出於性能考慮限制了更新頻率,通知發送太快可能會被忽略,這樣偶爾會導致通知欄不更新。這種情況可能在音樂App上容易出現,更新信息同時需要更新圖片。我們能做的就是故意做點延遲,目前經驗值是200ms。
4.點擊沒反應
除了代碼bug,廠家這邊的問題有發現在華為部分系統上面,因為對通知欄進行了修改增加了第一次顯示通知時同時顯示是否允許按鈕,懷疑這個修改導致了bug,用戶即使點了允許顯示了通知,也無法對通知上面的按鈕進行操作,直到下一次通知刷新才正常。
5.通知上面的內容看不清,通知樣式長得跟其他通知不一樣
這個問題是因為使用了RemoteView來實現自定義通知。原生系統其實提供了很多style,但往往需求的實現是複雜的。不可避免的在使用自定義通知的時候我們可能有幾種方法盡量增加兼容性:
5.1 不要使用自定義背景,顯示了指定一個顏色意味著你就很特殊,很大幾率跟別人長得不一樣。而且即使是給RemoteView設置background,據我們經驗仍然在有些機器上面不起作用,很可能廠家考慮到了這個問題直接忽略掉了背景。當然指定背景也能解決一部分文字看不清問題,但這個方案不怎麼推薦
5.2 通過起一個通知來獲取文字顏色,原生系統提供了三行文字,對於文字樣式不多的情況可以嘗試這種方法,但據我們之前嘗試也還是存在獲取顏色失敗等兼容問題,相關代碼類似這樣,來源這裡
5.3 讀取系統通知的style來設置文字樣式,style高低版本上面有所區別:Title字體@android:style/TextAppearance.StatusBar.EventContent.Title
Content字體@android:style/TextAppearance.StatusBar.EventContentTitle字體@android:style/TextAppearance.Material.Notification.Title
Content字體@android:style/TextAppearance.Material.Notification.Line2
雲音樂目前採用的就是這個方案,但也會有坑,直到某一天廠家來反饋說我們修改了系統通知欄底色,但忘記修改上面提到的style了。。。最終雲音樂使用了這個方案結合修改通知欄底色,不過修改底色是放在設置裡面作為一個用戶選項。
5.4 沒什麼特殊情況,請盡量使用系統通知Style。這種兼容性肯定是最好的,事實上隨著Android這些版本的升級,加入了越來越多的模板能夠滿足了絕大部分的需求。如果你還是遇到需要自定義的情況,要麼是開發沒想到可以用系統模板,要麼就是視覺交互不滿意原生樣式。是時候拿出上面這些理由了。
接下來我想聊一聊通知欄的跳轉設計。
通知的點擊代碼很簡單,調用setOnClickPendingIntent設置下就可以了。但往往業務邏輯沒有那麼簡單,有些頁面打開是需要登錄的,程序還沒任何頁面啟動話需要看一次廣告等必須要解決前置一些條件。或者程序運行中task裡面的root activity必須是我們的首頁。這種情況其實比較常見,因為我們很不想加的退出應用功能最好的方式就是通過Intent的FLAG_ACTIVITY_CLEAR_TOP來實現的。清理掉root activty上面的所有activity之後再finish自己。這種實現就要求root activity比較固定。
所以最好設計一個跳轉協議,如果頁面還未啟動則走正常啟動流程,頁面已經啟動了則直接打開目標頁面,大概代碼可能是這樣,這是RedirectActivity里onCreate的代碼:
以上經驗來自我的團隊,感謝我的團隊。如果有遇到問題可以留言和我們討論。如果感興趣,請關注微信公眾號:anzhuozhimei
推薦閱讀:
※在安卓上部署伺服器 - 部署腳本和博客
※從事 Android 應用開發4年有餘,現在工資7500。很不爽!怎麼辦?
※身體大不如以前,怎麼辦?
※Android性能優化之虛擬機調優
※Google已退出大陸市場,Google Play 如何入華?