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

說起通知欄,是一塊各個應用的必爭之地,不顯示通知欄就意味著沒有存在感,通知欄顯示得不靠前還得想方設法提前。加上OnGoing的通知還能提升進程優先級,大有被濫用的趨勢。為了?;睿m然沒啥必要也得起個通知。甚至還有一些不顯示通知的前臺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.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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,544評論 25 708
  • 太長了,還是轉載吧...今天在看博客的時候,無意中發現了@Trinea在GitHub上的一個項目Android開源...
    龐哈哈哈12138閱讀 20,282評論 3 283
  • 人生五味,樣樣齊全。你出身自己無法決定,你離開自己依然無法決定,你可以決定怎樣活著。要是你依然無法決定你怎么活著,...
    因癡浪跡閱讀 133評論 0 1
  • 烏云遍天, 車輪滾得飛快。 窗外, 綠影忽閃而過。 打在我熱熱的心臟里。 309公里的思念, 重重拋起, 輕輕落下...
    小二翻身做掌柜閱讀 386評論 0 0