步驟
創(chuàng)建一個通知欄的Builder構(gòu)造類
定義通知欄的Action
設(shè)置通知欄點擊事件
通知
代碼
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
otificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("測試標題")//設(shè)置通知欄標題
.setContentText("測試內(nèi)容") //設(shè)置通知欄顯示內(nèi)容
.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //設(shè)置通知欄點擊意圖
// .setNumber(number) //設(shè)置通知集合的數(shù)量
.setTicker("測試通知來啦") //通知首次出現(xiàn)在通知欄,帶上升動畫效果的
.setWhen(System.currentTimeMillis())//通知產(chǎn)生的時間,會在通知信息里顯示,一般是系統(tǒng)獲取到的時間
.setPriority(Notification.PRIORITY_DEFAULT) //設(shè)置該通知優(yōu)先級
// .setAutoCancel(true)//設(shè)置這個標志當用戶單擊面板就可以讓通知將自動取消
.setOngoing(false)//ture,設(shè)置他為一個正在進行的通知,
Android 再來一發(fā)Notification
。他們通常是用來表示一個后臺任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(shè)備(如一個文件下載,同步操作,主動網(wǎng)絡(luò)連接).setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加聲音、閃燈和振動效果的最簡單、最一致的方式是使用當前的用戶默認設(shè)置,使用defaults屬性,可以組合
//Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加聲音 // requires VIBRATE permission
.setSmallIcon(R.drawable.ic_launcher);
對應(yīng)的各個方法的屬性
Flags
功能:提醒標志符,向通知添加聲音、閃燈和振動效果等設(shè)置達到通知提醒效果,可以組合多個屬性
有2種設(shè)置方法:
實例化通知欄之后通過給他添加.flags屬性賦值。
java Notification notification = mBuilder.build(); notification.flags = Notification.FLAG_AUTO_CANCEL;通過setContentIntent(PendingIntent intent)方法中的意圖設(shè)置對應(yīng)的flagspublic PendingIntent getDefalutIntent(int flags){ PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, new Intent(), flags); return pendingIntent; }
提醒標志符成員
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ù)
setDefaults(int defaults)
NotificationCompat.Builder中的方法,用于提示。
功能:向通知添加聲音、閃燈和振動效果的最簡單、使用默認(defaults)屬性,可以組合多個屬性(和方法1中提示效果一樣的)
Notification.DEFAULT_VIBRATE //添加默認震動提醒 需要 VIBRATE permission
Notification.DEFAULT_SOUND // 添加默認聲音提醒
Notification.DEFAULT_LIGHTS// 添加默認三色燈提醒
Notification.DEFAULT_ALL// 添加默認以上3種全部提醒
setVibrate(long[] pattern)
.setVibrate(new long[] {0,300,500,700}); //或者mBuilder.build().vibrate = new long[] {0,300,500,700}; setLights(intledARGB ,intledOnMS ,intledOffMS )
功能:android支持三色燈提醒,這個方法就是設(shè)置不同場景下的不同顏色的燈。
描述:其中l(wèi)edARGB 表示燈光顏色、 ledOnMS 亮持續(xù)時間、ledOffMS 暗的時間。
注意:1)只有在設(shè)置了標志符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒。2)這邊的顏色跟設(shè)備有關(guān),不是所有的顏色都可以,要看具體設(shè)備。
.setLights(0xff0000ff, 300, 0) Notification notify = mBuilder.build(); notify.flags = Notification.FLAG_SHOW_LIGHTS; notify.ledARGB = 0xff0000ff; notify.ledOnMS = 300; notify.ledOffMS = 300; setSound(Uri sound)//獲取默認鈴聲 .setDefaults(Notification.DEFAULT_SOUND) //獲取自定義鈴聲 .setSound(Uri.parse("file:///sdcard/xx/xx.mp3")) //獲取Android多媒體庫內(nèi)的鈴聲 .setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5")) setOngoing(boolean ongoing)
功能:設(shè)置為ture,表示它為一個正在進行的通知,
電腦資料
《Android 再來一發(fā)Notification》(http://www.szmdbiao.com)。他們通常是用來表示一個后臺任務(wù),用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設(shè)備(如一個文件下載,同步操作,主動網(wǎng)絡(luò)連接)setProgress(int max, int progress,boolean indeterminate)
屬性:max:進度條最大數(shù)值 、progress:當前進度、indeterminate:表示進度是否不確定,true為不確定,如下第3幅圖所示 ,false為確定下第1幅圖所示
注意:此方法在4.0及以后版本才有用,如果為早期版本:需要自定義通知布局,其中包含ProgressBar視圖
使用:如果為確定的進度條:調(diào)用setProgress(max, progress, false)來設(shè)置通知,在更新進度的時候在此發(fā)起通知更新progress,并且在下載完成后要移除進度條,通過調(diào)用setProgress(0, 0, false)既可。
如果為不確定(持續(xù)活動)的進度條,這是在處理進度無法準確獲知時顯示活動正在持續(xù),所以調(diào)用setProgress(0, 0, true) ,操作結(jié)束時,調(diào)用setProgress(0, 0, false)并更新通知以移除指示條
自定義View
這里要用到RemoteViews這個類。
Notification的自定義布局是RemoteViews,和其他RemoteViews一樣,在自定義視圖布局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件,不支持這些類的子類或Android提供的其他控件。否則會引起ClassNotFoundException異常。
public void showButtonNotify(){ NotificationCompat.Builder mBuilder = new Builder(this); RemoteViews mRemoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button); mRemoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.sing_icon); //API3.0 以上的時候顯示按鈕,否則消失 mRemoteViews.setTextViewText(R.id.tv_custom_song_singer, "周杰倫"); mRemoteViews.setTextViewText(R.id.tv_custom_song_name, "七里香"); //如果版本號低于(3。0),那么不顯示按鈕 if(BaseTools.getSystemVersion() <= 9){ mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.GONE); }else{ mRemoteViews.setViewVisibility(R.id.ll_custom_button, View.VISIBLE); } // if(isPlay){ mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_pause); }else{ mRemoteViews.setImageViewResource(R.id.btn_custom_play, R.drawable.btn_play); } //點擊的事件處理 Intent buttonIntent = new Intent(ACTION_BUTTON); /* 上一首按鈕 */ buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID); //這里加了廣播,所及INTENT的必須用getBroadcast方法 PendingIntent intent_prev = PendingIntent.getBroadcast(this, 1, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT); mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev, intent_prev); /* 播放/暫停 按鈕 */ buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID); PendingIntent intent_paly = PendingIntent.getBroadcast(this, 2, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT); mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play, intent_paly); /* 下一首 按鈕 */ buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_NEXT_ID); PendingIntent intent_next = PendingIntent.getBroadcast(this, 3, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT); mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_next, intent_next); mBuilder.setContent(mRemoteViews) .setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT)) .setWhen(System.currentTimeMillis())// 通知產(chǎn)生的時間,會在通知信息里顯示 .setTicker("正在播放") .setPriority(Notification.PRIORITY_DEFAULT)// 設(shè)置該通知優(yōu)先級 .setOngoing(true) .setSmallIcon(R.drawable.sing_icon); Notification notify = mBuilder.build(); notify.flags = Notification.FLAG_ONGOING_EVENT; mNotificationManager.notify(notifyId, notify); }