Android我還能夠相信你多少系列文章三之通知欄

我即將在2017.7.8號開一個直播講堂,感興趣的同窗點擊快來參加吧:https://segmentfault.com/l/15...
內容包括:android

  1. Android 知識體系分享面試

  2. 從入門到提升的學習路徑segmentfault

  3. 如何進一步突破瓶頸,進一步提高微信

  4. 充足的時間和你們討論,回答你們問題性能

自我介紹:學習

網易 Android 專家工程師,網易雲音樂 Android 負責人,主導從零開發了網易雲音樂 Android
客戶端,目前是杭州研究院專業委員會成員,負責每一年的評級,規範起草,面試招聘等相關工做。參與並製做了網易雲課堂 Android
微專業相關課程,反響不錯。字體

提及通知欄,是一塊各個應用的必爭之地,不顯示通知欄就意味着沒有存在感,通知欄顯示得不靠前還得千方百計提早。加上OnGoing的通知還能提高進程優先級,大有被濫用的趨勢。爲了保活,雖然沒啥必要也得起個通知。甚至還有一些不顯示通知的前臺Service黑科技廣爲流傳,能夠參考這裏。廠家和開發者的戰鬥越演欲烈,到如今即便OnGoing的Service放後臺也照殺不誤,真是可憐了咱們這羣作音樂的。因而後臺應用保護白名單,下拉鎖定,手機管家,省電模式,神隱模式等等用於限制後臺運行的功能愈來愈多,可想應用怎麼鬥得過系統?spa

還好Android上面有一鍵清除全部通知,不然如今一個App要出N個通知的狀況要吐血。每一條新聞要出個通知,一天要通知好屢次。本身保活不了不算,還要別人拉起來幫忙通知(後臺startService起另一個程序的用法也被好比華爲系統限制)。咱們在抱怨後臺愈來愈被限制的同時,也要思考本身軟件是否作到了儘可能少騷擾用戶。設計

通知欄的開發每一個人心中都會有些傷痛。主要有如下幾點:code

通知欄沒有顯示
通知欄不更新
點擊沒反應
通知欄上面內容看不清
通知欄的樣式長得跟其餘不同,本身的獨樹一幟很突兀

事實上從Android的歷史版原本看,通知欄這個設計也是被改過了很是屢次,不只僅是樣式,還有各類功能改動,包括最新的O版本。爲了保證更好的兼容性,咱們建議:
1.遵循通知的設計的初衷

Communication from other users
    Well-timed and informative task reminders

如官方所描述,通知用於和他人交流或者是有用任務提醒。因此在考慮是否使用通知的時候思考你的通知是否屬於上述兩類。是否用戶一天到晚都須要關心你的通知,你的通知對於用戶價值是咋樣的。你的全部東西都往上面丟也意味着別人可能也這麼作,兩敗俱傷。

  1. 通知欄不顯示

高版本的原生系統自帶通知欄顯示管理功能,默認是容許顯示。但像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.EventContent

Title字體@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

相關文章
相關標籤/搜索