Notification深入淺出

1、Notification(通知)編碼方式

1.1 創(chuàng)建NotificationManager對通知進(jìn)行管理

無論在哪里創(chuàng)建通知玫膀,整體步驟都是相同的氧急,要使用通知,首先需要創(chuàng)建一個通知管理器NotificationManager,通知管理器可以通過getSystemService()方法接收一個字符串參數(shù)用于確定獲取系統(tǒng)的哪個服務(wù)们何。這里需要傳入Context. NOTIFICATION_SERVICE,因此可以通過代碼:

NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

1.2 Builder構(gòu)造器

接下來需要使用一個Builder構(gòu)造器來創(chuàng)建Notification對象,但問題在于控轿,幾乎Android系統(tǒng)的每一個版本都會對通知這部分功能進(jìn)行或多或少的修改冤竹,API不穩(wěn)定性在通知這個方面顯得十分突出,解決辦法就是使用support庫中提供的兼容API解幽。通過使用NotificationCompat類的Builder構(gòu)造器就可以使得我們的程序在所有的Android版本上面都能夠正常工作:

NotificationCompat.Builder builder = new NotificationCompat.Builder(Context,id);

//Notification notification = new NotificationCompat.Builder(Context,id)...

這里的Context就是指環(huán)境上下文贴见,id就是指唯一的通知通道的id烘苹,用于標(biāo)識躲株,例如: String notificationChannelId = "notification_channel_id_01";

這里的id和manager.notify()中的id不一樣,這里的id是用于指定通知通道镣衡,至于通知通道霜定,下面會記錄。

1.3 利用Builder構(gòu)造器來設(shè)置Notification的UI樣式

創(chuàng)建好Builder構(gòu)造器廊鸥,就可以通過它來設(shè)置通知的樣式了望浩,首先需要先了解一下通知的結(jié)構(gòu):

圖片1.png

1)小圖標(biāo):此為必要圖標(biāo),通過setSmallIcon()設(shè)置惰说。

2)應(yīng)用名稱:此由系統(tǒng)提供磨德。

3)時間戳:此由系統(tǒng)提供,不過可以通過 setWhen() 進(jìn)行替換吆视,或使用 setShowWhen(false) 將其隱藏典挑。setWhen()中傳入System.currentTimeMillis()來顯示系統(tǒng)當(dāng)前時間。

4)大圖標(biāo):此為可選圖標(biāo)(通常僅用于聯(lián)系人照片啦吧;請勿將其用于應(yīng)用圖標(biāo))您觉,通過setLargeIcon() 設(shè)置。

5)標(biāo)題:此為可選內(nèi)容授滓,通過 setContentTitle()設(shè)置琳水。

6)文本:此為可選內(nèi)容,通過 setContentText()設(shè)置般堆。

1.4 通知的點擊效果

要想實現(xiàn)通知的點擊效果在孝,我們需要在代碼中進(jìn)行相應(yīng)的設(shè)置,這就涉及到了PendingIntent淮摔。PengdingIntent提供了幾個靜態(tài)方法用于獲取PengdingIntent的實例私沮,可以根據(jù)需求選擇是使用getActivity()、getBroadcast()噩咪、還是getService()方法顾彰。這幾個方法的參數(shù)是相同的极阅,都有四個參數(shù):

  1. 參數(shù)一:Context

  2. 參數(shù)二:返回代碼,一般使用0或1

  3. 參數(shù)三:一個Intent對象涨享,可以通過這個對象構(gòu)建中PendingIntent的意圖

  4. 參數(shù)四:用于確定PendingIntent的行為筋搏,有四個參數(shù)可選:FLAG_ONE_SHOT、FLAG_NO_CREATE厕隧、FLAG_CANCEL_CURRENT奔脐、FLAG_UPDATE_CURRENT。

創(chuàng)建好PendingIntent之后吁讨,可以通過setContentIntent()方法髓迎,接收的參數(shù)是一個PendingIntent對象,這時一個延遲執(zhí)行的“意圖”就構(gòu)建成功了建丧,當(dāng)用戶點擊這條通知的時候就會執(zhí)行相應(yīng)的意圖排龄。

1.5 給通知添加按鈕點擊事件

我們會希望通知上有一些按鈕,點擊該按鈕可以實現(xiàn)一些點擊事件翎朱,一個通知最對可以提供三個操作按鈕橄维,讓用戶可以快速響應(yīng),例如暫停提醒拴曲,甚或回復(fù)短信争舞。要添加操作按鈕,請將 PendingIntent 傳遞給 addAction() 方法澈灼。這就像是設(shè)置通知的默認(rèn)點按操作竞川,不同的是可以不單單是啟動 Activity,還可以完成各種其他任務(wù)叁熔,例如啟動在后臺執(zhí)行作業(yè)的 BroadcastReceiver委乌,這樣該操作就不會干擾已經(jīng)打開的應(yīng)用。

1.6 創(chuàng)建通知并顯示

上面的一切設(shè)計都是針對Builder對象的操作者疤,當(dāng)通知已經(jīng)設(shè)計完成了以后福澡,我們需要創(chuàng)建我們設(shè)計好的通知,這個過程十分簡單驹马,我們通過 Builder.build()就可以實現(xiàn)革砸。創(chuàng)建好通知后需要實現(xiàn)它,這時候就需要用到上面創(chuàng)建的通知管理器NotificationManager了糯累,通過NotificationManager.notify()可以實現(xiàn)算利,這個方法里面有兩個參數(shù),第一個參數(shù)是我們設(shè)置的用于標(biāo)識通知的id泳姐,可以任意設(shè)置效拭,但是需要唯一。第二個參數(shù)是我們創(chuàng)建的通知,代碼示例如下:

notificationManager.notify(123, notification);

2缎患、Notification(通知)兼容性設(shè)置

2.1創(chuàng)建通知渠道

上面1.2說到慕的,在創(chuàng)建通知構(gòu)建器的時候:

NotificationCompat.Builder builder = new NotificationCompat.Builder(Context,id);

需要傳入唯一的通知渠道ID,用于標(biāo)識通知渠道的唯一性挤渔,這里的通知渠道肮街,是在Android8.0以后需要創(chuàng)建的,8.0以前的系統(tǒng)是不需要的判导,為了提高應(yīng)用的兼容性嫉父,我們需要進(jìn)行判斷,如果系統(tǒng)版本低于8.0.那么直接采用上面的方式設(shè)計眼刃、創(chuàng)建绕辖、并顯示通知,如果系統(tǒng)版本高于8.0擂红,那么則先為通知創(chuàng)建渠道仪际。判斷的代碼如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){}

從 Android 8.0(API 級別 26)開始,所有的通知都必須分配到相應(yīng)的渠道篮条。對于每個渠道弟头,您可以設(shè)置應(yīng)用于其中的所有通知的視覺和聽覺行為(也就是通知的級別)。然后涉茧,用戶可以更改這些設(shè)置,并確定您應(yīng)用中的哪些通知渠道應(yīng)具有干擾性或應(yīng)該可見疹娶。我認(rèn)為添加這個功能主要是為了讓用戶能夠更透明的管理通知伴栓。

創(chuàng)建渠道的步驟如下:

  1. 建立渠道:

NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId, channelName, importance);

  1. 配置渠道:

    //配置通知渠道的描述

    notificationChannel.setDescription("Channel description");

    //LED燈

    notificationChannel.enableLights(true);

    notificationChannel.setLightColor(Color.RED);

    //震動

    notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});

    notificationChannel.enableVibration(true);

    //設(shè)置提示音

    channel.setSound();

    //設(shè)置鎖屏展示

    channel.setLockscreenVisibility();

  2. 創(chuàng)建渠道:

上面創(chuàng)建了通知管理器NotificationManager,渠道設(shè)置好了之后雨饺,就需要通過通知管理器將渠道創(chuàng)建出來钳垮,代碼如下:

manager.createNotificationChannel(notificationChannel);

2.2 設(shè)置通知級別

  1. Android7.0(API級別25)及之前,通過setPriority(NotificationCompat.PRIORITY_LOW)方法可以直接設(shè)置额港。

  2. Android8.0(API級別26)及更高版本饺窿,在Android8.0以上版本這一功能需要在通知渠道中設(shè)置:

NotificationChannel channel = new NotificationChannel(channelID, channelNAME, NotificationManager.IMPORTANCE_LOW);

其中第三個參數(shù)Importance就是對通知級別進(jìn)行設(shè)置,通知的級別如下所示:

捕獲.PNG

除了在創(chuàng)建渠道的時候設(shè)置移斩,在渠道創(chuàng)建完成之后也可以設(shè)置肚医,通過代碼:

channel.setImportance(Notification.IMPORTANCE_HIGH);

可以在渠道創(chuàng)建完成之后進(jìn)行設(shè)置。

3向瓷、自定義Notification通知

自定義通知有兩種肠套,一種是為內(nèi)容區(qū)域創(chuàng)建自定義布局,另一種是創(chuàng)建完全自定義的通知布局猖任。
3.1 為內(nèi)容區(qū)域創(chuàng)建自定義布局:
如果需要自定義內(nèi)容區(qū)域的布局你稚,可以將 NotificationCompat.DecoratedCustomViewStyle應(yīng)用到通知。借助此 API,可以為通常由標(biāo)題和文本內(nèi)容占據(jù)的內(nèi)容區(qū)域提供自定義布局刁赖,同時仍對通知圖標(biāo)搁痛、時間戳、子文本和操作按鈕使用系統(tǒng)裝飾宇弛。
自定義布局的使用方式如下:
1)構(gòu)建基本通知(使用 NotificationCompat.Builder)
2)調(diào)用 setStyle()落追,向其傳遞一個 NotificationCompat.DecoratedMediaCustomViewStyle實例。
3)將自定義布局?jǐn)U充為 RemoteViews 的實例涯肩。
4)調(diào)用 setCustomContentView() 以設(shè)置收起后通知的布局轿钠。您還可以選擇調(diào)用 setCustomBigContentView() 來為展開后通知設(shè)置不同的布局。
代碼如下:
RemoteViews notificationLayout = new RemoteViews(getPackageName(), R.layout.custom_notification_item);
RemoteViews notificationLayoutExpanded = new RemoteViews(getPackageName(), R.layout.custom_notification_large);
NotificationCompat.Builder notification = new NotificationCompat.Builder(this, channelId)
.setStyle(new NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout)
.setCustomBigContentView(notificationLayoutExpanded)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setAutoCancel(true);//設(shè)置點擊后能否自動取消通知
3.2 創(chuàng)建完全自定義通知布局
如果您不希望使用標(biāo)準(zhǔn)通知圖標(biāo)和標(biāo)題裝飾通知病苗,按照上述步驟使用 setCustomBigContentView()疗垛,但不要調(diào)用 setStyle()。要支持低于 Android 4.1(API 級別 16)的 Android 版本硫朦,還應(yīng)調(diào)用 setContent()贷腕,向其傳遞同一 RemoteViews 對象。

4咬展、自定義Dialog
4.1 自定義Dialog布局
要使用自定義Dialog泽裳,首先需要為這個Dialog定義布局,新建一個XML布局文件破婆,對其進(jìn)行設(shè)計涮总,這個就是我們將會應(yīng)用于Dialog的布局樣式,當(dāng)我們觸發(fā)Dialog的時候祷舀,就會顯示這個布局樣式瀑梗。
4.2 自定義Dialog類
因為使用的不是原生Dialog,而是自定義的Dialog裳扯,我們就需要為其定義一個類抛丽,繼承于Dialog類,并在它的構(gòu)造方法中綁定我們自定義的布局饰豺,代碼如下:
public class MyDiaLog extends Dialog{
public MyDiaLog(@NonNull Context context) {
super(context);
setContentView(R.layout.dialog_layout);
}
}
4.3 顯示自定義DIalog
要顯示我們之前自定義的Dialog亿鲜,步驟十分簡單,首先實例化一個Dialog對象冤吨,然后調(diào)用它的.show()方法蒿柳,便可以顯示我們自定義的Dialog對象了。
4.4 原生的各種DiaLog的使用
除了自定義的Dialog之外锅很,還有很多各式原生Dialog可以使用其馏,比如帶有輸入框的Dialog,帶有進(jìn)度條的Dialog爆安,列表Dialog等等叛复,具體的原生Dialog使用在附件Demo中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褐奥,隨后出現(xiàn)的幾起案子咖耘,更是在濱河造成了極大的恐慌,老刑警劉巖撬码,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿倒,死亡現(xiàn)場離奇詭異,居然都是意外死亡呜笑,警方通過查閱死者的電腦和手機(jī)夫否,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叫胁,“玉大人凰慈,你說我怎么就攤上這事⊥斩欤” “怎么了微谓?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長输钩。 經(jīng)常有香客問我豺型,道長,這世上最難降的妖魔是什么买乃? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任姻氨,我火速辦了婚禮,結(jié)果婚禮上为牍,老公的妹妹穿的比我還像新娘哼绑。我一直安慰自己,他們只是感情好碉咆,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛀恩,像睡著了一般疫铜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上双谆,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天壳咕,我揣著相機(jī)與錄音,去河邊找鬼顽馋。 笑死谓厘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寸谜。 我是一名探鬼主播竟稳,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了他爸?” 一聲冷哼從身側(cè)響起聂宾,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诊笤,沒想到半個月后系谐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡讨跟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年纪他,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晾匠。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡茶袒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出混聊,到底是詐尸還是另有隱情弹谁,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布句喜,位于F島的核電站预愤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咳胃。R本人自食惡果不足惜植康,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望展懈。 院中可真熱鬧销睁,春花似錦、人聲如沸存崖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽来惧。三九已至冗栗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間供搀,已是汗流浹背隅居。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留葛虐,地道東北人胎源。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像屿脐,于是被迫代替她去往敵國和親涕蚤。 傳聞我的和親對象是個殘疾皇子宪卿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 最近公司有一個通知的功能,于是想起之前看過的Notification赞季,當(dāng)時看的時候看到網(wǎng)上有很多的講解和代碼愧捕,就覺...
    饅頭燉土豆閱讀 1,616評論 3 1
  • 目錄介紹 1.Notification簡單概述 2.Notification通知用途 3.Notification...
    楊充211閱讀 5,773評論 2 18
  • 轉(zhuǎn)載自:http://blog.csdn.net/vipzjyno1/article/details/252480...
    HEXG_閱讀 5,850評論 0 2
  • 最近時不時地有人問我這樣或那樣的通知如何實現(xiàn),所以本文將根據(jù)個人經(jīng)驗對Notification做個總結(jié)申钩,以供參考次绘!...
    ConnorLin閱讀 35,983評論 27 99
  • 一、什么是Notification? Notification是一種有全局效果的通知撒遣,可以顯示在系統(tǒng)通知欄娩贷。以下內(nèi)...
    douhao1333閱讀 728評論 0 1