一、什麼是Notification?
Android的通知用來提示用戶的某個非緊急事件的發生,會在statusBar上面做出一些圖片、文字的提示,打開通知欄之後能看到更多的信息,甚至是通過點擊進入一個應用,比如我們常見的短信、Email、Wifi通知等都是Notification案例。
二、Notification分類
1、普通Notification
如下圖所示,就是一個普通的Notification,是我們最常用的,主要由內容標題、大圖標、內容、內容附加信息、小圖標、時間等組成。
2、大布局Notification
這是android4.1以後才增加的,與普通Notification的區別主要就是其顯示內容可以擴展,並且只有在所有的Notification的最上面時纔會顯示大布局,其他情況下顯示小布局,也可以用手指將其擴展爲大布局。
大布局也可分爲三種類型:
InboxStyle收件箱風格:顯示多行文字
BigTextStyle大文字風格:顯示一個大的文字塊
BigPictureStyle大圖片風格:詳情區域包含一個256dp高度的位圖
3、自定義佈局Notification
像我們常見的音樂播放器控制的Notification就是自定義佈局Notification,這個後續單獨介紹。
三、Notification的創建步驟
1、獲得系統級的服務NotificationManager。調用Context.getSystemService(NOTIFICATION_SERVICE)方法即可返回NotificationManager實例,例如
nm =(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
2、 實例化Notification,並設置其屬性,例如
Notification notification = new Notification();
notification.icon = R.drawable.ic_launcher;
notification.tickerText= "Hello,I am coming";
notification.when =System.currentTimeMillis();
notification.defaults= Notification.DEFAULT_SOUND;
notification.flags |=Notification.FLAG_AUTO_CANCEL;
Intent i = newIntent(this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pi =PendingIntent.getActivity(MainActivity.this, 0, i, 0);
notification.setLatestEventInfo(MainActivity.this,"Title", "Content:Hello,World", pi);
3、通過NotificationManager發送通知,例如
nm.notify(NO_ID, notification);
4、通過NotificationManager取消通知,例如
nm.cancel(NO_ID);
以上介紹的是普通的Notification的一個流程,對於大布局Notification有一些區別,下面進行介紹,以BigTextStyle爲例。
先創建一個Notification.Builder對象,該對象可以設置Notification的一些屬性,如icon、tickerText等。
然後,通過以上Builder對象來設置BigTextStyle類型的Notification對象。
最後發送與普通一樣。
Intent i = newIntent(this,MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pi =PendingIntent.getActivity(MainActivity.this, 0, i, 0);
final Notificationnotification;
finalNotification.Builder noti = new Notification.Builder(this)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher))
.setContentTitle("BigText Notification")
.setContentText("BigText")
.setSmallIcon(R.drawable.ic_launcher)
.setWhen(System.currentTimeMillis());
notification = newNotification.BigTextStyle(noti)
.setBigContentTitle("Big TextStyle")
.setSummaryText(("this is sumery"))
.bigText("Hello,World!My name isdingfeng,I am from China")
.build();
notification.tickerText= "Hello,I am coming";
notification.defaults= Notification.DEFAULT_SOUND;
notification.flags |=Notification.FLAG_AUTO_CANCEL;
notification.contentIntent= pi;
nm.notify(BIG_TEXT,notification);
四、常用屬性
1、常用字段:
contentIntent 設置PendingIntent對象,點擊時發送該Intent
defaults 添加默認效果
flags 設置flag位,例如FLAG_NO_CLEAR等
icon 設置圖標
sound 設置聲音
tickerText 顯示在狀態欄中的文字
when設置來通知時的時間
例如
notification.icon =R.drawable.ic_launcher;
2、常用flag位:
FLAG_AUTO_CANCEL 點擊清除按鈕或點擊通知後會自動消失
FLAG_NO_CLEAR 該通知能被狀態欄的清除按鈕給清除掉
FLAG_ONGOING_EVENT 通知放置在正在運行
FLAG_INSISTENT 是否一直進行,比如音樂一直播放,知道用戶響應
FLAG_SHOW_LIGHTS 閃燈
FLAG_ONLY_ALERT_ONCE 振一下或發個聲音
FLAG_FOREGROUND_SERVICE 到前臺來運行的服務
FLAG_HIGH_PRIORITY高優先級,即使屏蔽了statusBar也出現。一般對於電話提醒使用
例如:
notification.flags =Notification.FLAG_NO_CLEAR;
3、常用常量:
DEFAULT_SOUND使用默認提示聲音
DEFAULT_VIBRATE 使用默認手機震動
DEFAULT_ALL使用所有默認值,比如聲音,震動,閃光等等
DEFAULT_LIGHTS 使用默認閃光提示
例如:
notification.defaults = Notification.DEFAULT_SOUND;
效果也可進行疊加
notification.defaults =DEFAULT_SOUND|DEFAULT_VIBRATE;
或
notification.defaults |= DEFAULT_SOUND
notification.defaults |= DEFAULT_VIBRATE
五、NotificationCompat.Builder
Notification.Builder是android 4.0 ICS之前引入的,在此之後使用v4 SupportLibrary中NotificationCompat.Builde較多,所以在此介紹一下。
如果要在NotificationCompat.Builder對象中爲通知指定UI信息和動作,就必須先使用NotificationCompat.Builder.build()方法來創建一個通知。該方法返回一個Notification對象,調用NotificationManager.notify()方法來傳遞它到系統中。
其使用注意以下幾點:
1、必選的通知內容
如下的三個通知視覺元素是必選的:
setSmallIcon():設置一個小型icon
setContentTitle():設置一個內容標題
setContentText():設置內容細節文本
2、可選的通知內容
除1所述的三個以外都是可選的,詳情可參考API NotificationCompat.Builder類。
3、通知的動作
雖然動作是可選的,應該至少添加一個動作到通知中。一個動作允許用戶從通知打開某個應用程序的一個Activity中,在Activity中做進一步的工作。一個通知能夠提供多個動作。在4.1Jerry Bean之後,還可以在通知中添加按鈕來執行額外的動作(如:一個警告或即時響應的文本消息等),前提是這些按鈕的功能在Activity中可用。
在一個通知裏,其動作是通過一個含有能打開一個應用程序的Activity的意圖的PendingIntent對象來定義的。例如:當用戶在drawer中點擊通知文本的時候,如果你想要打開一個Activity,可以通過調用setContentIntent()方法來添加一個PendingIntent對象。
4、幾種Notification的代碼案例
普通Notification
Notification normalNoti = new NotificationCompat.Builder(this)
.setAutoCancel(true) // 設置自動清除
.setContentInfo(String.valueOf(++normalNum))// 設置附加內容
.setContentTitle("5 newmessages") // 設置內容標題
.setContentText("11111111111111111")// 設置內容文本
.setDefaults(Notification.DEFAULT_ALL) // 設置使用所有默認值(聲音、震動、閃屏等)
.setLargeIcon(icon) // 設置大型圖標
.setSmallIcon(R.drawable.stat_notify_gmail) // 設置小型圖標
.setTicker("NormalNotification") // 設置狀態欄提示信息
.build();
InboxStyle收件箱風格
NotificationCompat.InboxStyle inboxStyle = new InboxStyle();
Notification notification = new NotificationCompat.Builder(context)
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setContentInfo("This is a inbox")
.setContentTitle("Inbox Notifitcation")
.setContentText("Inbox content")
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher))
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("A Inbox")
.setStyle(inboxStyle
.addLine("牀前明月光")
.addLine("疑是地上霜")
.addLine("舉頭望明月")
.addLine("低頭思故鄉")
.setSummaryText("李白 靜夜思"))
.build();
nm.notify(IN_BOX, notification);
BigTextStyle大文字風格
NotificationCompat.BigTextStyle bigTextStyle = new BigTextStyle();
Notification notification = new NotificationCompat.Builder(context)
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setContentInfo("This is a big text")
.setContentTitle("Big Text Notifitcation")
.setContentText("Big Text")
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher))
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("A big text")
.setStyle(bigTextStyle.bigText("牀前明月光,\n疑是地上霜。\n舉頭望明月,\n低頭思故鄉。\n\t--李白").setBigContentTitle("靜夜思"))
.build();
nm.notify(BIG_TEXT, notification);
BigPictureStyle大圖片風格
NotificationCompat.BigPictureStyle bigPictureStyle = new BigPictureStyle();
Notification notification = new NotificationCompat.Builder(context)
.setDefaults(Notification.DEFAULT_ALL)
.setAutoCancel(true)
.setContentInfo("This is a big picture")
.setContentTitle("Big Picture Notification")
.setContentText("Big Picture")
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher))
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("A big picture")
.setStyle(bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.big)))
.build();
nm.notify(BIG_PICTURE, notification);