參考:
- 通知
- TaskStackBuilder的用法
- PendingIntent的用法
- http://www.rogerblog.cn/2016/04/15/Android-N-Introducing-upgraded-Notifications/
- http://www.reibang.com/p/d9fbcb0db013
一. 概念介紹
- NotificationId
?用來唯一標(biāo)識(shí)一條通知的id鸟妙,更新通知時(shí)候會(huì)用到 - NotificationManager
?用來管理通知的類忽匈,一般用來顯示(notify)郭厌,取消(cancel)通知液走,用getSystemService(Context.NOTIFICATION_SERVICE)
方法獲取 - NotificationCompat.Builder
?用來創(chuàng)建通知该抒,并進(jìn)行一系列設(shè)置的類 - PendingIntent
?一種用來延遲啟動(dòng)Activity涌攻、Service芝此、BroadCast的Intent膊升,通過PendingIntent的getXXX獲取啟動(dòng)Activity、Service等的PI對(duì)象 - TaskStackBuilder
?創(chuàng)建一個(gè)人工的返回棧,用于點(diǎn)擊通知之后啟動(dòng)的Activity按返回返回到其父Activity而不是返回到桌面
二. 通知必備的三要素
創(chuàng)建通知必須要有的三要素,說是三要素,但只有小圖標(biāo)是不可缺少的,缺少之后會(huì)crash,其他兩者缺少的話通知照樣能顯示
- 小圖標(biāo)
?小圖標(biāo),通過setSmallIcon設(shè)置 - 標(biāo)題
?通知標(biāo)題,通過setContentTitle設(shè)置 - 詳細(xì)文本
?通知內(nèi)容,通過setContentText設(shè)置
三. 通知操作
點(diǎn)擊通知后進(jìn)行的操作,常用操作如下:
- 打開Activity
- 利用PendingIntent構(gòu)建想打開的Activity
- 調(diào)用setContentIntent方法設(shè)置PI
- 暫停/繼續(xù)下載
- 播放/暫停歌曲
- 自定義操作等
四. 通知優(yōu)先級(jí)
通知優(yōu)先級(jí)相當(dāng)于是一個(gè)提示喷户,用來告訴系統(tǒng)用哪種形式顯示UI河哑,有五種模式:-2到2鲤妥;最高級(jí)別會(huì)以懸浮通知的形式顯示
五. 創(chuàng)建簡單通知的步驟
- 實(shí)例化NotificationCompat.Builder對(duì)象
- 創(chuàng)建點(diǎn)擊通知要進(jìn)行的操作(PendingIntent)
- 利用Builder對(duì)象對(duì)通知進(jìn)行一系列設(shè)置
- 實(shí)例化NotificationManager對(duì)象
- 調(diào)用NotificationManager對(duì)象的notify對(duì)象發(fā)送通知
mBuilder = new NotificationCompat.Builder(this);//參數(shù)為Context的構(gòu)造函數(shù)在android8.0以上版本中已棄用衷模,要用Context熙揍,channel的構(gòu)造函數(shù)
Intent resultIntent = new Intent(this, UpdateActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, REQ_CODE, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("Title")
.setContentText("Hello,World")
.setContentIntent(pi)
.setAutoCancel(true);
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mManager.notify(NOTIFICATION_ID, mBuilder.build());
六. 帶有擴(kuò)展布局的通知
帶有擴(kuò)展布局的通知可以有一個(gè)展開的大視圖,MIUI中可以通過雙指下滑打開,原生系統(tǒng)中可以直接查看大視圖
PS:Android4.1以上才可用迎瞧,且不同Rom顯示效果都不一樣捷绑,以下截圖均為原生效果
-
擴(kuò)展布局種類:
-
InboxStyle:包含一系列String的大視圖
- 方法列表:
- setBigContentTitle:展開之后的標(biāo)題
- setSummaryText :對(duì)添加的String數(shù)據(jù)的總結(jié),下圖中的+3more就是
- addLine:添加一行數(shù)據(jù)
-
效果:
InboxStyle
- 方法列表:
-
BigPictureStyle
- 方法列表:
- setBigContentTitle:下圖中的This is big content title
- setSummaryText:下圖中的This is summary text
- bigLargeIcon:下圖中的右上角圖標(biāo)
- bigPicture:下圖中的大圖片
-
效果:
BigPictureStyle
- 方法列表:
-
BigTextStyle
- 方法列表:
- bigText:要全部顯示出來的content內(nèi)容蚀浆,下圖中一長串文字就是
- setBigContentTitle:下圖中This is big content title
- setSummaryText:下圖中This is summary text
-
效果:通知顯示的時(shí)候,對(duì)contentText默認(rèn)是顯示在一行的,而內(nèi)容要是過多則省略,于是就出來了這個(gè)Style张咳,會(huì)將所有文字都顯示出來
BigTextStyle
- 方法列表:
-
MediaStyle
- 注意:在使用該style之前要添加依賴:
implementation 'com.android.support:support-media-compat:version'
- 方法列表:
- 效果:用來實(shí)現(xiàn)音樂播放器的Style
- 注意:在使用該style之前要添加依賴:
-
MessagingStyle
- 方法列表:
- 效果:可以在通知欄里面進(jìn)行發(fā)消息等操作
-
DecoratedCustomViewStyle
- 方法列表:
- 效果:由系統(tǒng)裝飾的自定義視圖的通知樣式。自定義通知常空,但不是完全的自定義蝗蛙,相當(dāng)于利用系統(tǒng)的裝飾進(jìn)行自定義
-
DecoratedMediaCustomViewStyle
- 方法列表:
- 效果:
-
-
創(chuàng)建擴(kuò)展布局通知的步驟:
- 和普通通知一樣,實(shí)例化Builder,設(shè)置三要素
- 新建一個(gè)NotificationCompatStyle(Style就是用來設(shè)置展開布局的)恶耽,給Style進(jìn)行一系列對(duì)應(yīng)的設(shè)置
- 調(diào)用Builder.setStyle方法設(shè)置style
- notify進(jìn)行顯示即可
七. 管理通知
八. 8.0通知渠道適配
前言:8.0對(duì)通知渠道進(jìn)行了較為強(qiáng)硬的要求驻债,不帶有通知渠道的通知是不會(huì)顯示的了笙以。因此要?jiǎng)?chuàng)建通知渠道對(duì)其進(jìn)行適配
- 創(chuàng)建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//創(chuàng)建了兩個(gè)通知渠道,聊天信息和推送信息蜡豹。兩個(gè)渠道的優(yōu)先級(jí)不同
createNotificationChannel(CHAT_NOTIFICATION_CHANNEL, "聊天消息", NotificationManager.IMPORTANCE_HIGH);
createNotificationChannel(SUBSCRIPTION_NOTIFICATION_CHANNEL, "推送信息", NotificationManager.IMPORTANCE_DEFAULT);
}
/**
* 創(chuàng)建通知渠道
* @param id 渠道id凤巨,可以為任意字符串。保證全局唯一性即可
* @param name 通知渠道名稱较雕,會(huì)顯示給用戶亮蒋,用戶可以對(duì)該渠道進(jìn)行操作
* @param importance 通知渠道優(yōu)先級(jí)
*/
@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String id, String name, int importance) {
NotificationChannel channel = new NotificationChannel(id, name, importance);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
}
- 創(chuàng)建通知的時(shí)候指定通知渠道
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Toast.makeText(this, "8.0以上", Toast.LENGTH_SHORT).show();
Notification notification = new Notification.Builder(this,CHAT_NOTIFICATION_CHANNEL)//就在這里指定渠道
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("聊天消息")
.setContentText("今天中午吃啥")
.setWhen(System.currentTimeMillis())
.build();
manager.notify(1, notification);
} else {
Toast.makeText(this, "8.0以下", Toast.LENGTH_SHORT).show();
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle("聊天消息")
.setContentText("今天中午吃啥")
.setWhen(System.currentTimeMillis())
.build();
manager.notify(1, notification);
}