天天看點

Android自定義狀态欄通知(Status Notification)的正确實作

在android應用開發中,經常會使用到狀态欄通知(status notification),例如新浪微網誌、網易新聞等提供的推送消息,軟體背景更新時進度的顯示等等,如下圖所示:

Android自定義狀态欄通知(Status Notification)的正确實作

看了網上很多關于notification的部落格文章,發現幾乎沒有一個能将自定義狀态欄通知完全實作正确的,是以,本文就來說說實作自定義狀态欄通知經常被忽略的一些知識點。

1) 使用notification最常見的場景

運作在背景的service當需要和使用者互動時,由于它不能直接啟動一個activity,是以,service必須使用notification來間接的啟動activity(當使用者點選notification時跳轉)。

2) 自定義布局檔案支援的控件類型

notification 的自定義布局是remoteviews,是以,它僅支援framelayout、linearlayout、relativelayout三種布局控件, 同時支援analogclock、chronometer、button、imagebutton、imageview、progressbar、 textview、viewflipper、listview、gridview、stackview和adapterviewflipper這些ui控 件。對于其他不支援的控件,使用時将會抛出classnotfoundexception異常。

3) notification支援的intent類型(都是pendingintent類的執行個體)

contentintent:在通知視窗區域,notification被單擊時的響應事件由該intent觸發;

deleteintent:在通知視窗區域,當使用者點選全部清除按鈕時,響應該清除事件的intent;

fullscreenintent:響應緊急狀态的全屏事件(例如來電事件),也就是說通知來的時候,跳過在通知區域點選通知這一步,直接執行fullscreenintent代表的事件。

上面三種pendingintent可以拉起activity、service和broadcastreceiver,如圖所示:

Android自定義狀态欄通知(Status Notification)的正确實作

4) 狀态欄通知字型的設定

不同的手機,不同的 android平台版本,狀态欄通知視窗的背景顔色可能千差萬别,例如android2.3之前的版本通知視窗預設背景是白色的,android4.0之 後的版本通知視窗背景預設是黑色的,這就需要在設定notification的字型時加以差別,否則,很容易導緻通知的字型顔色和背景色一樣,進而看不到 字型部分,市面上很多app就存在這個問題。如下圖所示,華為智彙雲和百度音樂這兩款應用就明顯存在這個問題。

Android自定義狀态欄通知(Status Notification)的正确實作

從android2.3(api level 9)開始,系統為預設通知欄布局的字型定義了樣式如下:

是以,在2.3之後的版本中我們自定義布局檔案中的字型直接應用這個樣式就可以。對于2.3之前的版本,由于背景色是白色的,是以,我們使用如下系統預定義樣式指定字型的顔色:

?android:attr/textcolorprimary

是以,在res的values目錄下定義styles.xml檔案如下:

在res的values-v9目錄下定義styles.xml檔案如下:

自定義通知布局檔案使用styles檔案如下:

繼續閱讀