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)小圖標(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ù):
參數(shù)一:Context
參數(shù)二:返回代碼,一般使用0或1
參數(shù)三:一個Intent對象涨享,可以通過這個對象構(gòu)建中PendingIntent的意圖
參數(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)建渠道的步驟如下:
- 建立渠道:
NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId, channelName, importance);
-
配置渠道:
//配置通知渠道的描述
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();
創(chuàng)建渠道:
上面創(chuàng)建了通知管理器NotificationManager,渠道設(shè)置好了之后雨饺,就需要通過通知管理器將渠道創(chuàng)建出來钳垮,代碼如下:
manager.createNotificationChannel(notificationChannel);
2.2 設(shè)置通知級別
Android7.0(API級別25)及之前,通過setPriority(NotificationCompat.PRIORITY_LOW)方法可以直接設(shè)置额港。
Android8.0(API級別26)及更高版本饺窿,在Android8.0以上版本這一功能需要在通知渠道中設(shè)置:
NotificationChannel channel = new NotificationChannel(channelID, channelNAME, NotificationManager.IMPORTANCE_LOW);
其中第三個參數(shù)Importance就是對通知級別進(jìn)行設(shè)置,通知的級別如下所示:
除了在創(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中。