Android通知——Notification使用淺析(一) - 台部落

文章推薦指數: 80 %
投票人數:10人

提醒式通知從Android 5.0 開始,通知可以短暫地顯示在浮動窗口中,稱之爲提醒式通知。

這種行爲通常適用於用戶應立即知曉的重要通知,而且僅在設備未 ... 請輸入正確的登錄賬號或密碼 註冊 忘記密碼 首頁 未分類 正文 Android通知——Notification使用淺析(一) 原創 者文 2019-06-1115:47 1.序言 當某個應用程序希望想用戶發出一些提示信息,而該應用程序又不在前臺運行時,就可以藉助通知來實現。

發出一條通知,手機最上方的狀態欄中會顯示一個通知的圖標,下拉狀態欄後可以看到通知的詳細內容。

通知欄和抽屜式通知欄均是由系統控制,用戶可以隨時查看。

通知的用法比較靈活,既可以在服務中創建,又可以在廣播裏創建。

Notification的類型主要有以下幾種: 狀態欄和抽屜式通知欄 發出通知後,通知先以圖標的形式顯示在狀態欄中 之後用戶在狀態欄向下滑動打開抽屜式通知欄,並在其中查看更多詳情及對通知執行操作。

提醒式通知 從Android5.0開始,通知可以短暫地顯示在浮動窗口中,稱之爲提醒式通知。

這種行爲通常適用於用戶應立即知曉的重要通知,而且僅在設備未鎖定時才顯示。

提醒式通知會在應用發出通知後立即出現,稍後便會消失,但仍照常顯示在抽屜式通知欄中。

鎖定屏幕 從Android5.0開始,通知可以顯示在鎖定屏幕上。

您可以程序化地設置您的應用在安全鎖定屏幕上所發佈通知的詳情可見等級,甚至可以設置通知是否顯示在鎖定屏幕上 應用圖標標誌 在所支持的設備(搭載Android8.0(API級別26)及更高版本)啓動器中,應用圖標通過在相應的應用啓動器圖標上顯示彩色“標誌”(又稱“通知圓點”)來表示有新通知。

用戶可以長按應用圖標以查看該應用的通知。

然後,用戶可以關閉通知或者在長按菜單中對通知執行操作(類似於抽屜式通知欄) 通知的常見用途: 顯示接收的短消息,及時消息等信息(如QQ,微信、新浪、短信等) 顯示客戶端的推送消息,如廣告,優惠,版本更新。

常見的第三方SDK有:JPush、個推、信鴿、阿里雲推送等 顯示正在進行的事物,如後臺運行的程序,如音樂播放,下載進度等。

2.Notification基本使用 這裏涉及到的Notification相關使用都是在Android8.0(api26)之前的,關於Notification在Android8.0之後的適配後續詳細講述 通知欄主要涉及到兩個類:Notification和NotificationManager Notification爲通知信息類,裏面對應了通知欄的各個屬性 NotificationManager:是狀態欄通知的管理類,負責發通知,清除通知等操作。

2.1創建通知 通知的設計由系統模板決定,您的應用只需要定義模板中各個部分的內容即可。

通知的部分詳情僅在展開後視圖中顯示。

小圖標:必須提供,通過setSmallIcon()進行設置。

應用名稱:由系統提供。

時間戳:由系統提供,但您可以通過setWhen()將其替換掉或者通過setShowWhen(false)將其隱藏。

大圖標:可選內容(通常僅用於聯繫人照片,請勿將其用於應用圖標),通過setLargeIcon()進行設置。

標題:可選內容,通過setContentTitle()進行設置。

文本:可選內容,通過setContentText()進行設置。

Notification創建前必須要添加的屬性: 小圖標,通過setSmallcom()設置 標題,通過setContentTitle()設置 內容,通過setContentText()設置 通知欄的創建主要涉及到Notification.Builder、Notification和NotificationManager,其中Notification.Builder作用是使用建造者模式構建Notification對象 基本使用步驟如下: 創建NotificationManager 首先需要一個NotificationManager來對通知進行管理,可以調用Context的getSystemService()獲取到。

該方法接收一個字符串參數用於確定獲取系統的哪個服務。

創建通知欄的Builder構造類:Notification.Builder,使用的是建造者模式,創建Notification對象,這裏可以在終極build()之前連綴任意多的設置方法來創建一個豐富的Notification對象。

publicclassMainActivityextendsAppCompatActivity{ privateTextViewmSendNotifi; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSendNotifi=(TextView)findViewById(R.id.send_notifi); mSendNotifi.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ sendNotification(); } }); } privatevoidsendNotification(){ intid=1; Drawabledrawable=ContextCompat.getDrawable(this,R.drawable.btn_audio_next_normal); Bitmapbitmap=((BitmapDrawable)drawable).getBitmap(); /*創建通知欄的Builder構造類*/ Notification.BuildermBuilder=newNotification.Builder(this); //設置小圖標 mBuilder.setSmallIcon(R.drawable.ic_launcher_background); //設置大圖標 mBuilder.setLargeIcon(bitmap); //設置標題 mBuilder.setContentTitle("這是標題"); //設置通知正文 mBuilder.setContentText("這是正文,當前ID是:"+id); //設置摘要 mBuilder.setSubText("這是摘要"); //設置是否點擊消息後自動clean mBuilder.setAutoCancel(true); //顯示指定文本 mBuilder.setContentInfo("Info"); //與setContentInfo類似,但如果設置了setContentInfo則無效果 //用於當顯示了多個相同ID的Notification時,顯示消息總數 mBuilder.setNumber(2); //通知在狀態欄顯示時的文本 mBuilder.setTicker("在狀態欄上顯示的文本"); //設置優先級 mBuilder.setPriority(Notification.PRIORITY_MAX); //自定義消息時間,以毫秒爲單位,當前設置爲比系統時間少一小時 mBuilder.setWhen(System.currentTimeMillis()-3600000); //設置爲一個正在進行的通知,此時用戶無法清除通知 mBuilder.setOngoing(true); //設置消息的提醒方式,震動提醒:DEFAULT_VIBRATE聲音提醒:NotificationCompat.DEFAULT_SOUND //三色燈提醒NotificationCompat.DEFAULT_LIGHTS以上三種方式一起:DEFAULT_ALL mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND); //設置震動方式,延遲零秒,震動一秒,延遲一秒、震動一秒 mBuilder.setVibrate(newlong[]{0,1000,1000,1000}); //創建NotificationManager NotificationManagermNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); //發送通知 mNotificationManager.notify(id++,mBuilder.build()); } } NotificationManager的notify()可以向系統發送通知 Notification.Builder中有設置通知的大小圖標的兩種方法,如果兩者同時存在,則smallIcon顯示在通知的右下角,largeIcon顯示在左側;如果只設置smallIcon,其顯示在左側。

2.2定義Action操作 設置一個Action,這樣就可以直接跳轉到App的某個Activity、啓動一個Service或者發送一個Broadcast。

否則,Notification僅僅只能起到通知的效果,不能與用戶交互。

//創建intent IntentresultIntent=newIntent(this,SecondActivity.class); resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加爲棧頂Activity resultIntent.putExtra("what",5); PendingIntentresultPendingIntent=PendingIntent.getActivity(this,5,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT); ...... //發送pendingIntent mBuilder.setContentIntent(resultPendingIntent); 可以發現,創建一個具有Action的Notification多創建了Intent、PendingIntent和setContentIntent()這幾步 關於PendingIntent的理解可以查看Android基礎——PendingIntent 2.3Notification更新、取消 更新通知很簡單,只需要再次發送相同ID的通知即可,如果之前的通知還未被取消,則會直接更新該通知相關的屬性。

如果之前的通知已經被取消,則會重新創建一個新通知。

更新通知跟發送通知使用相同的方式。

取消通知有5種方式: 點擊通知欄的清除按鈕,會清除所有可清除的通知 設置了setAutoCancel()或FLAG_AUTO_CANCEL通知,點擊該通知會清除它 通過NotificationManager調用cancel(intid)方法清除指定ID的通知 通過NotificationManager調用cancel(Stringtag,intid)清除指定TAG和ID的通知 通過NotificationManager調用cancelAll()清除所有該應用之前發送的通知 備註: 如果你是通過NotificationManager.notify(Stringtag,intid,Notificationnotify)方法創建的通知,那麼只能通過 NotificationManager.cancel(Stringtag,intid) 方法才能清除對應的通知,調用NotificationManager.cancel(intid)無效。

插一句: notification.flags|=Notification.FLAG_NO_CLEAR; Notification的標誌添加方法如上,flags可以通過|=運算疊加效果。

2.4自定義Notification佈局 通知的框架允許你去自定義通知的佈局。

通過RemoteViews對象來定義通知的外觀。

自定義通知佈局與常規通知相似,但是它是基於定義在XML文件的RemoteViews對象來操作的。

定義通知的可用高度是取決於通知視圖的。

正常的視圖佈局高度限制在64dp,可展開視圖的佈局高度限制在256dp 關於自定義通知欄的基本步驟如下: 創建一個單獨的XML文件,用來定義通知的佈局。

(notification_mobile_play.xml) 在應用裏面,使用RemoteViews對象的方法來給你的通知設置文本和圖標,通過調用setContent()把你的RemoteViews對象放到NotificationCompat.Builder裏面。

避免使用背景圖像,因爲你的文本可能會變得不太好閱讀。

publicclassMainActivityextendsAppCompatActivity{ privateTextViewmSendNotifi; privateTextViewmCancelNotifi; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSendNotifi=(TextView)findViewById(R.id.send_notifi); mCancelNotifi=(TextView)findViewById(R.id.cancel_notifi); mSendNotifi.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ sendNotification(); } }); mCancelNotifi.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ NotificationManagermNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.cancel(1); } }); } privatevoidsendNotification(){ intid=1; Drawabledrawable=ContextCompat.getDrawable(this,R.drawable.btn_audio_next_normal); Bitmapbitmap=((BitmapDrawable)drawable).getBitmap(); Notification.BuildermBuilder=newNotification.Builder(this); mBuilder.setContent(getRemoteViews()) .setSmallIcon(R.drawable.ic_launcher_background); NotificationManagermNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(id++,mBuilder.build()); } privateRemoteViewsgetRemoteViews(){ RemoteViewsremoteViews=newRemoteViews(getPackageName(),R.layout.notification_mobile_play); //設置點擊通知欄的上一首按鈕時要執行的意圖 remoteViews.setOnClickPendingIntent(R.id.btn_pre,getActivityPendingIntent(11)); //設置點擊通知欄的下一首按鈕時要執行的意圖 remoteViews.setOnClickPendingIntent(R.id.btn_next,getActivityPendingIntent(12)); //設置點擊通知欄的播放暫停按鈕時要執行的意圖 remoteViews.setOnClickPendingIntent(R.id.btn_start,getActivityPendingIntent(13)); //設置點擊通知欄的根容器時要執行的意圖 remoteViews.setOnClickPendingIntent(R.id.ll_root,getActivityPendingIntent(14)); remoteViews.setTextViewText(R.id.tv_title,"標題");//設置通知欄上標題 remoteViews.setTextViewText(R.id.tv_artist,"藝術家");//設置通知欄上藝術家 returnremoteViews; } /**獲取一個Activity類型的PendingIntent對象*/ privatePendingIntentgetActivityPendingIntent(intwhat){ Intentintent=newIntent(this,SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加爲棧頂Activity intent.putExtra("what",what); PendingIntentpendingIntent=PendingIntent.getActivity(this,what,intent,PendingIntent.FLAG_UPDATE_CURRENT); returnpendingIntent; } } 備註: RemoteViews.setInt(id、methodName、value):這個方法用來調用子View中需要一個Int型參數的方法,如爲TextView設置背景顏色等。

默認的Notification只能通過setContentIntent設置整體點擊事件,但是RemoteViews可以設置不同地方的不同點擊事件。

RemoteViews只支持4種佈局 FrameLayout LinearLayout RelativeLayout GridLayout 這些佈局下面只支持幾種視圖控件: AnalogClock Button Chronometer ImageButton ProgressBar TextView ViewFlipper ListView GridView StackView AdapterViewFlipper 前述的代碼中運用了setContent()方法,這裏會存在一個問題,通過該方法獲得的Notification是定高的。

如果View的高度比默認高度要高的話,就會有一部分顯示不出來。

默認情況下通知高度一般是64dp,對於(API>=24)可以直接使用setCustomContentView()和setBigCustomContentView()處理,對於低版本情況的處理情況如下: if(android.os.Build.VERSION.SDK_INT>=16){ notification=builder.build(); notification.bigContentView=remoteViews; } notification.contentView=remoteViews; 通知是可以展開收起的,同樣是網易雲音樂的通知,圖一比圖二要大一些。

其實圖一展示的是網易雲音樂通知的展開狀態,使用兩個手指上滑就可以縮起,也就是圖二 bigContentView是在sdk16時引入的,所以需要判斷一下。

如果小於sdk16則只能定高了。

bigContentView的最大高度是256dp 背景色 不同Rom的通知背景色是不同的,所以在UI上需要注意。

主要有兩種方法: 固定背景色: 設定一個固定的背景色,文字和icon顏色都可以固定 缺點如上圖所示,某些Rom的Notification會有一個左右Padding,如果固定背景色會很難看。

透明背景色 另一種方法是讓背景透明,通過特殊方式拿到通知欄字體顏色和字體大小 思路是:通過Notification.Builder生成一條空的Notification,但不調用notify()方法,然後通過這條Notification想辦法獲取裏面的佈局元素,通過遍歷,就能拿到對應的字體和顏色了。

關於這部分的研究,待更新。













發表評論 登录 所有評論 還沒有人評論,想成為第一個評論的人麼?請在上方評論欄輸入並且點擊發布. 相關文章 CentOS7.6安裝飛槳2.3      首先要升級下Python到版本3,經過測試3.9還不支持,得用3.8的       操作步驟可以參考:https://www.cnblogs.com/defyou/p/15762881.html      中級菜鳥 2022-10-0414:26:13 驅動開發:通過Async反向與內核通信 在前幾篇文章中給大傢俱體解釋了驅動與應用層之間正向通信的一些經典案例,本章將繼續學習驅動通信,不過這次我們學習的是通過運用Async異步模式實現的反向通信,反向通信機制在開發中時常被用到,例如一個殺毒軟件如果監控到有異常進程運行或有異常註冊 yshark 2022-10-0414:25:12 驅動開發:應用DeviceIoContro開發模板 內核中執行代碼後需要將結果動態顯示給應用層的用戶,DeviceIoControl是直接發送控制代碼到指定的設備驅動程序,使相應的移動設備以執行相應的操作的函數,如下代碼是一個經典的驅動開發模板框架,在開發經典驅動時會用到的一個通用案例。

yshark 2022-10-0414:25:12 尋找鏈表的入環節點和相交節點問題 尋找鏈表的入環節點和相交節點問題 作者:Grey 原文地址: 博客園:尋找鏈表的入環節點和相交節點問題 CSDN:尋找鏈表的入環節點和相交節點問題 判斷鏈表中是否有環 給你一個鏈表的頭節點head,判斷鏈表中是否有環。

題目鏈接見:Le GreyZeng 2022-10-0414:24:42 php截取字符串中的一部分 php截取字符串中的一部分 字符串截取在php開發中是比較常用的; 而且對於截取的需求也有很多種; 有時我們想截取最後一個斜槓'/'後面的數字; 有時我們又需要截取第一個斜槓'/'前面的內容判斷用戶輸入的url鏈接帶不帶http://等等; 賴忠標 2022-10-0414:24:12 Libgdx遊戲開發(1)——環境配置及demo運行 原文:Libgdx遊戲學習(1)——環境配置及demo運行-Stars-One的雜貨小窩 Libgdx遊戲是基於Java的一款遊戲引擎,可以發佈Android,桌面端,Html,IOS等遊戲,出名的《殺戮尖塔》也是用了此引擎製作的 Stars-one 2022-10-0414:19:42 flask註冊功能  一個項目的簡單結構劃分 首先創建一個新項目    可以正常運行與訪問    創建配置文件並添加配置。

   將這裏拆分到不同的文件中,讓啓動文件更加簡潔。

   創建一個apps包,導入配置模塊,導入Flask,定義創建app函數 馬昌偉 2022-10-0414:14:11 Server2008R2下netshinterfaceportproxy端口轉發未生效,netsh端口代理命令後並未開啓端口監聽 WindowsServer2008R2系統下使用netshinterfaceportproxy進行端口轉發未生效netsh端口代理命令後用netstat-ano發現並未開啓端口監聽 映射端口指令 netshinterface 秋風無葉 2022-10-0414:12:31 numpy的ndarray的一些概念 Numpy(NumericalPython的簡稱)是高性能科學計算和數據分析的基礎包。

ndarray:一個具體矢量算術運算和複雜廣播能力的快速且節省空間的多維數據 矢量化(表達1):是NumPy中的一種強大功能,可以把操作表達爲“在整個 孤舟浮岸 2022-10-0414:04:21 CSharp:QuestPDFcreatepdffileindonetcore6   ///

///geovindu,GeovinDu,塗聚文Edit /// publicclassDuModel { p ®GeovinDuDreamPark™ 2022-10-0414:00:50 CSharp:PrototypePatternindonetcore3   /// ///PrototypePattern原型設計模式 /// publicabstractclassBasicCar { / ®GeovinDuDreamPark™ 2022-10-0414:00:50 CSharp:FactoryMethodPatternindonetcore3   #regionAnimalHierarchy /* *BoththeDogandTigerclasseswill *implementtheIAnimalinterfac ®GeovinDuDreamPark™ 2022-10-0414:00:50 CSharp:BuilderPatternindonetcore3   /// ///CarisaConcreteBuilder ///生成器BuilderPattern ///geovindueidit ///



請為這篇文章評分?