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