參考文獻:
ASleepyCoder的Android Notification常見樣式總結(jié)文章
vipra的Android 通知欄Notification的整合 全面學(xué)習(xí) (一個DEMO讓你完全了解它)
本文主要知識點概要:
- 通知(Notification)的簡單使用
- 通知(Notification)的一些常用的設(shè)置方法
- 通知(Notification)的進階使用
- 通知(Notification)的常見問題
1. 簡單使用
- 創(chuàng)建一個NotificationManager對通知進行管理
- 通過一個構(gòu)建器來創(chuàng)建一個Notification對象
1.1創(chuàng)建一個NotificationManager對象
NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
通過NotificationManager來管理通知內(nèi)容;
1.2創(chuàng)建一個Notification對象
這個對象是通過構(gòu)建者模式創(chuàng)建的,這里先貼代碼,之后我在詳細講解常用的方法:
NotificationCompat.Builder nb = new NotificationCompat.Builder(this, "1");
nb.setContentTitle("通知的標題欄");
nb.setContentText("通知欄內(nèi)容");
nb.setWhen(System.currentTimeMillis());
nb.setSmallIcon(R.drawable.ic_stat_name);
nb.setTicker("狀態(tài)欄中提示的內(nèi)容");
nb.setDefaults(Notification.DEFAULT_VIBRATE);
Notification notification = nb.build();
mManager.notify(1,notification);
通過以上方法就可以成功的創(chuàng)建一個通知了,這里面具體的設(shè)置方法我在后面會詳細講解。
2.一些常用的設(shè)置方法
2.1當你創(chuàng)建通知的時候會使用到NotificationCompat來構(gòu)建一個通知.常用到的方法如下:
- setContentTitle("") 設(shè)置通知的標題
- setContentText("") 設(shè)置通知的內(nèi)容
- setSmallIcon(R.mipmap.XXX) 設(shè)置通知顯示的小圖片(這里要注意,如果你設(shè)置的圖片過大的話會拋出一個異常)這里注意小圖標必須有,否則不顯示通知
- setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.XXX)) 設(shè)置通知右下角顯示的圖片,這里面說的是是大圖標,但是我在我的手機上卻顯示在右邊,但是如果你設(shè)置一個較大的圖片的時候,雖然不會報錯,但是不會顯示,當我不去設(shè)置smallIcon的時候,設(shè)置這個的時候整個通知欄都不顯示了.其實當只設(shè)置smallIcon沒有設(shè)置LargeIcon的時候,SmallIcon的圖標將會出現(xiàn)在LargeIcon的位置,而小圖標的位置將不會有圖標,但兩者同時設(shè)置的時候LargeIcon將會出現(xiàn)在LargeIcon位置,SmallIcon也會出現(xiàn)在SmallIcon的位置.
- setTicker("") 設(shè)置狀態(tài)欄的提示內(nèi)容
- setContentIntent(pendingIntent) 設(shè)置通知欄點擊既執(zhí)行的意圖,和Intent的作用類似,但是寫法不同.
這里說明下里面的參數(shù):PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,XXX.class), 0);- 參數(shù)1 上下文
- 參數(shù)2 請求碼
- 參數(shù)3 intent對象
- 參數(shù)4 這個是一個flag表示位,會有一下幾種
- FLAG_ONE_SHOT 表示這個意圖只可以使用一次,后續(xù)的通知單擊后無法打開
- FLAG_NO_CREATE 發(fā)現(xiàn)已經(jīng)存在時,忽略新的請求,繼續(xù)使用老的,日常開發(fā)中很少使用
- FLAG_CANCEL_CURRENT 如果新請求的PendingIntent發(fā)現(xiàn)已經(jīng)存在時,取消已經(jīng)存在的,用心的替換老的
- FLAG_UPDATE_CURRENT 如果新情求的PendingIntent發(fā)現(xiàn)已經(jīng)存在時,如果Intent有字段改變了,就更新已存在的PendingIntent
- setNumber(int) 設(shè)置通知及和的數(shù)量(沒見到別人用過)
- setWhen(System.currentTImeMillis()) 設(shè)置通知產(chǎn)生的時間,會在通知信息里顯示,一般時系統(tǒng)獲取到的時間,如果不去設(shè)置取系統(tǒng)的時間
- setPriority(Notification.PRIORITY_DEFAULT) 設(shè)置通知的優(yōu)先級,這個優(yōu)先級是從-2~2 這里設(shè)置的是默認的是0(一般是在廣播中設(shè)置這個屬性),這里寫一下你可以設(shè)置的參數(shù)吧:
- Notification.PRIORITY_DEFAULT 默認
- Notification.PRIORITY_HIGH 高
- Notification.PRIORITY_LOW 低
- Notification.PRIORITY_MAX 最高
- Notification.PRIORITY_MIN 最低
- setAutoCancel(boolean) 用戶點擊該通知,是否關(guān)閉此條通知
- setOngoning(boolean) 點擊或者側(cè)滑通知,通知是否會消失,一般利用它都是設(shè)置一個正在運行的通知,如音樂播放或者下載進度等一些特殊的場景,要設(shè)置成true
- setDefaults(Notification.DEFAULT_VIBRATE) 給通知添加聲音,閃燈和震動效果,可以組合使用,具體參數(shù)為
- Notification.DEFAULT_VIBRATE 添加默認震動提醒
- Notification.DEFAULT_SOUND 添加默認聲音提醒
- Notification.DEFAULT_LIGHTS 添加默認三色燈提醒
- Notification.DEFAULT_ALL 添加默認以上3種全部提醒
- setVibrate(long[] pattern) 設(shè)置自定義震動模式 如:setVibrate(new long[] {0,200,200,300});//延遲0秒,然后震動200ms,在延遲200ms,接著震動300ms
- setLights(int RGB,int onTime,int lowLight) 設(shè)置自定義燈光,這里說明一下參數(shù)和注意事項
- 參數(shù)1: RGB燈光顏色
- 參數(shù)2: 亮持續(xù)的時間
- 參數(shù)3: 暗持續(xù)的時間
- 注意: 只有在設(shè)置了標識符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒
- setSound(Uri music) 設(shè)置自定義音樂 如:setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
- setProgress(int max,int progress,boolean indeterminare) 設(shè)置帶進度條的通知,這里說一下參數(shù)3,代表進度是否確定,當確定的時候是具體的progress,但是不確定的時候是連續(xù)的短線.
- addAction(int icon, CharSequence title, PendingIntent intent) 添加一個點擊后出現(xiàn)的按鈕,添加多了會出現(xiàn)一排圖標,最多可以添加5個.并且每個都能設(shè)置相應(yīng)的點擊事件.這個最好看后面的3.2講的內(nèi)容,說下參數(shù),參數(shù)1:圖標的資源id,參數(shù)2:圖標顯示的名稱,參數(shù)3:圖標對應(yīng)要啟動的PendingIntent
2.2當你創(chuàng)建通知的時候會使用到Notification.常用到的方法如下:
當你使用builder構(gòu)建出一個Notification的時候,也可以更改一些參數(shù):
notification.flags = Notification.FLAG_AUTO_CANCEL; 設(shè)置提醒標識符,具體參數(shù):
- Notification.FLAG_SHOW_LIGHTS 三色燈提醒,在使用三色燈的時候必須添加的標識符
- Notification.FLAG_ONGOING_EVENT 發(fā)起正在運行事件(活動中)
- Notification.FLAG_INSISTENT 讓聲音震動無線循環(huán),直到用戶相應(yīng)(取消或者打開)
- Notification.FLAG_ONLY_ALERT_ONCE 發(fā)起Notification后,鈴聲和震動只執(zhí)行一次
- Notification.FLAG_AUTO_CANCEL 用戶單機通知后自動消失
- Notification.FLAG_NO_CLEAR 只有全部清除時,Notification才會清除(QQ通知無法刪除,用的就是這個)
- Notification.FLAG_FOREGROUND_SERVICE 表示正在運行的服務(wù)
3.進階使用
3.1 自定義的通知欄效果(RemoteViews)
Notification的自定義布局是RemoteViews,和其他RemoteViews一樣,在自定義視圖布局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件,不支持這些類的子類或Android提供的其他控件。否則會引起ClassNotFoundException異常
一般的步驟如下:
- 創(chuàng)建自定義視圖
- 獲取遠程視圖對象
- 設(shè)置PendingIntent來相應(yīng)事件
- 發(fā)起Notification
3.1.1自定義帶按鈕的通知欄
-
創(chuàng)建自定義視圖,這里的布局就是一個隨便的布局,但是其實你寫太大也沒有用,這個后面講.
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button); -
獲取遠程視圖對象
這里說明一下,前面那個ID是視圖中定義的ID,其實這里設(shè)置所有內(nèi)容,都需要根據(jù)ID匹配,然后進行設(shè)置的,也算是提供的方法了,這里就不要去糾結(jié)了.-
設(shè)置圖片
remoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_launcher_background); -
設(shè)置監(jiān)聽事件
remoteViews.setOnClickPendingIntent(R.id.btn_1, pendingIntent);
-
設(shè)置相應(yīng)的pendingIntent,其實和上面設(shè)置PendingIntent的方法一樣,這里就不去寫了.
-
發(fā)起Notification
Notification notification = builder.setContent(remoteViews) .setWhen(System.currentTimeMillis()) .setTicker("正在播放") .setSmallIcon(R.drawable.ic_stat_name) .build(); notification.flags = Notification.FLAG_AUTO_CANCEL; mManager.notify(2, notification);
其實別的方法都差不多,就是這里注意一下涉及資源的時候,其他的都是一樣的.
3.1.2不帶按鈕的通知欄
其實和上面的都差不多,只是沒有的相應(yīng)的PendingIntent,多了一個設(shè)置文字的方法,這里就直接貼代碼了!
//先設(shè)定RemoteViews
RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.custom);
//設(shè)置對應(yīng)IMAGEVIEW的ID的資源圖片
view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);
view_custom.setTextViewText(R.id.custom_title, "標題");
view_custom.setTextViewText(R.id.custom_content, "顯示的內(nèi)容");
3.2大圖風(fēng)格通知(4.1之前的版本不支持此功能)
只有在通知欄被展開時顯示,何時展開呢?通知欄處在頂端,或者用戶通過手勢展開的時候顯示.分為幾種效果,但是寫法其實都差不多,下面說說這幾種風(fēng)格,其實這些風(fēng)格,比普通視圖多出一個詳情區(qū)域!
- NotificationCompat.BigPictureStyle 大圖片風(fēng)格:詳情區(qū)域包含一個256dp高度的位圖
- NotificationCompat.BigTextStyle 大文字風(fēng)格:顯示一個大的文字塊
- NotificationCompat.InboxStyle 收件箱風(fēng)格:顯示多行文字
- NotificationCompat.MediaStyle 音樂風(fēng)格:顯示音樂風(fēng)格(這個風(fēng)格特殊說明一下, 出現(xiàn)的是一些列的圖標,可以給相應(yīng)的圖標設(shè)置相應(yīng)的事件,這些事件是添加到相應(yīng)的NotificationCompat.Builder.setStyle()去添加的,最多可以添加5個),這個類是v7包下的
但是這個詳情區(qū)域出現(xiàn)的方式各不相同,我的手機是按住下拉,有的手機是點擊之后出現(xiàn),有的是直接出現(xiàn),這里自己多嘗試一下就知道了!
3.2.1各個版本中的公共方法和各自的方法
先說一下公共方法!
- setBigContentTitle("") 大通知欄的標題
- setSummaryText("") 末尾只一行的文字內(nèi)容
其他都是單獨存在的方法!
- NotificationCompat.BigPictureStyle
- bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small)) 添加一張相應(yīng)的圖片
- NotificationCompat.BigTextStyle
- bigText() 添加相應(yīng)文字的方法
- NotificationCompat.InboxStyle
- addLine("") 直接添加每行的顯示內(nèi)容
-NotificationCompat.MediaStyle - setMediaSession(new MediaSessionCompat(this,"MediaSession",new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
- setCancelButtonIntent(pendingIntent) 在5.0以下有效,設(shè)置取消后的意圖
- setShowCancelButton(boolean) 會在通知欄的右上部分顯示一個刪除圖標5.0一下有效
- setShowActionInCompactView(2,3) 添加action所在的action組的數(shù)組的下標,從0開始,低版本上也可以顯示
- addLine("") 直接添加每行的顯示內(nèi)容
這個我覺得應(yīng)該貼一下代碼了!
private void mediaStyle(){
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle("MediaStyle");
builder.setContentText("Song Title");
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
builder.setDefaults(NotificationCompat.DEFAULT_ALL);
Intent intent = new Intent(this,ImageActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
builder.setContentIntent(pIntent);
//第一個參數(shù)是圖標資源id 第二個是圖標顯示的名稱,第三個圖標點擊要啟動的PendingIntent
builder.addAction(R.drawable.ic_previous_white,"",null);
builder.addAction(R.drawable.ic_stop_white,"",null);
builder.addAction(R.drawable.ic_play_arrow_white_18dp,"",pIntent);
builder.addAction(R.drawable.ic_next_white,"",null);
NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
style.setMediaSession(new MediaSessionCompat(this,"MediaSession",
new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
//CancelButton在5.0以下的機器有效
style.setCancelButtonIntent(pIntent);
style.setShowCancelButton(true);
//設(shè)置要現(xiàn)實在通知右方的圖標 最多三個
style.setShowActionsInCompactView(2,3);
builder.setStyle(style);
builder.setShowWhen(false);
Notification notification = builder.build();
manger.notify(TYPE_Media,notification);
}
最后通過NotificationCompat.Builder.setStyle()設(shè)置進去就可以了
4.類似與QQ的在手機屏幕頂端出現(xiàn)的通知(只有在5.0以上系統(tǒng)中有效哦)
NotificationCompat.Builder.setFullScreenIntent(pIntent,true);
4.常見的問題
4.1如何取消掉通知欄上的通知
- 設(shè)置相應(yīng)的flags = FLAG_AUTO_CANCEL
- 通過手動調(diào)用NotificationManager.cancle()方法關(guān)閉指定的通知或者通過NotificationManager.cancleAll()關(guān)閉所有通知.
關(guān)于常見的問題,等到以后用到的時候在去好好總結(jié)以下,現(xiàn)在總結(jié)的話或許會不那么完全,當你讀到這篇文章后,要是有什么問題請和我聯(lián)系,我會及時幫助你解決的,也能促進自己的提高...