最近一直在研究 android ,并一邊研究一邊做應用。其中遇到了把程式通知常駐在 notification 欄,并且不能被 clear 掉(就像android qq一樣)的問題。經過研究實作了其功能,現把 notification 的使用總結如下:
notification 的使用需要導入 3 個類
代碼示例及說明
下面依次對每一段代碼進行分析:
建立 notificationmanager,其中建立的 nm 對象負責“發出”與“取消” notification。
建立 notification ,參數依次為:icon的資源id,在狀态欄上展示的滾動資訊,時間。其中建立的 n 對象用來描述出現在系統通知欄的資訊,之後我們将會看到會在 n 對象上設定點選此條通知發出的intent。
設定 n.flags 為 notification.flag_auto_cancel ,該标志表示當使用者點選 clear 之後,能夠清除該通知。
建立一個intent,該intent使得當使用者點選該通知後發出這個intent
請注意,如果要以該intent啟動一個activity,一定要設定 intent.flag_activity_new_task 标記。
intent.flag_activity_clear_top :如果在目前task中,有要啟動的activity,那麼把該acitivity之前的所有activity都關掉,并把此activity置前以避免建立activity的執行個體
intent.flag_activity_new_task :系統會檢查目前所有已建立的task中是否有該要啟動的activity的task,若有,則在該task上建立activity,若沒有則建立具有該activity屬性的task,并在該建立的task上建立activity。更多請參見 “ (轉載)android下affinities和task ”
pendingintent 為intent的包裝,這裡是啟動intent的描述,pendingintent.getactivity 傳回的pendingintent表示,此pendingintent執行個體中的intent是用于啟動 activity 的intent。pendingintent.getactivity的參數依次為:context,發送者的請求碼(可以填0),用于系統發送的intent,标志位。
其中 pendingintent.flag_update_current 表示如果該描述的pendingintent已存在,則改變已存在的pendingintent的extra資料為新的pendingintent的extra資料。
這裡再簡要說一下 intent 與 pendingintent 的差別:
intent :意圖,即告訴系統我要幹什麼,然後系統根據這個intent做對應的事。如startactivity相當于發送消息,而intent是消息的内容。
pendingintent :包裝intent,intent 是我們直接使用 startactivity , startservice 或 sendbroadcast 啟動某項工作的意圖。而某些時候,我們并不能直接調用startactivity , startservide 或 sendbroadcast ,而是當程式或系統達到某一條件才發送intent。如這裡的notification,當使用者點選notification之後,由系統發出一條activity 的 intent 。是以如果我們不用某種方法來告訴系統的話,系統是不知道是使用 startactivity ,startservice 還是 sendbroadcast 來啟動intent 的(當然還有其他的“描述”),是以這裡便需要pendingintent。
設定顯示在通知下拉框中的資訊,參數依次為:context,标題,内容,pendingintent。
啟動notification,參數依次為:在你的程式中辨別notification的id值(用來區分同一程式中的不同notifycation,如果程式中隻有一個notification那麼這裡随便你填什麼都可以,不過類型必須要為int),要通知的notification。
如何使自己的notification像android qq一樣能出現在 “正在運作的”欄目下面
其實很簡單,隻需設定notification.flags = notification.flag_ongoing_event;便可以了。
如何改變 notification 在“正在運作的”欄目下面的布局
建立 remoteviews 并賦給 notification.contentview ,再把 pendingintent 賦給 notification.contentintent 便可以了,如:
注意,如果使用了contentview,那麼便不要使用notification.setlatesteventinfo。如果setlatesteventinfo在賦給 notification.contentview 的代碼之後,那麼contentview的效果将被覆寫,顯示的便是 setlatesteventinfo 的效果;如果 setlatesteventinfo 在 notification.contentview 的代碼之前,那麼顯示的便是 notification.contentview 的效果,也就是說不管你想要setlatesteventinfo 或 contentview 的自定義效果,請保證始終隻有一句設定代碼,因為在最後一句綁定的時候,之前的設定contentview或setlatesteventinfo的代碼都是完全沒有必要的。