您好,登錄后才能下訂單哦!
這篇文章主要為大家分析了如何全面解析Notification的相關知識點,內容詳細易懂,操作細節合理,具有一定參考價值。如果感興趣的話,不妨跟著跟隨小編一起來看看,下面跟著小編一起深入學習“如何全面解析Notification”的知識吧。
Notification在Android中使用的頻率可以說是非常高的,本文我將圍繞著Notification的各方面進行解析,使大家對Notification有更好的認識。
Notification的使用步驟
1.獲取NotificationManager
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
2.創建NotificationCompat.Builder
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
3.對Builder設置一些Notification相關屬性:
mBuilder.setContentTitle("標題")//設置通知欄標題 .setContentText("內容") //設置通知欄顯示內容 .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //設置通知欄點擊意圖 // .setNumber(number) //設置通知集合的數量 .setTicker("通知到來") //通知***出現在通知欄,帶上升動畫效果的 .setWhen(System.currentTimeMillis())//通知產生的時間,會在通知信息里顯示,一般是系統獲取到的時間 .setPriority(Notification.PRIORITY_DEFAULT) //設置該通知優先級 // .setAutoCancel(true)//設置這個標志當用戶單擊面板就可以讓通知將自動取消 .setOngoing(false)//ture,設置他為一個正在進行的通知。他們通常是用來表示一個后臺任務,用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設備(如一個文件下載,同步操作,主動網絡連接) .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加聲音、閃燈和振動效果的最簡單、最一致的方式是使用當前的用戶默認設置,使用defaults屬性,可以組合 //Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加聲音 // requires VIBRATE permission .setSmallIcon(R.drawable.ic_launcher);//設置通知小ICON
4.使用Builder創建通知
Notification notification = mBuilder.build();
5.使用NotificationManager將通知推送出去
int id = 199; LogUtils.d(TAG, "創建通知"); mNotificationManager.notify(id, notification);
Notification重要方法解析
Notification 的基本操作主要有創建、更新、取消這三種。一個 Notification 的必要屬性有三項,如果不設置則在運行時會拋出異常:
小圖標,通過 setSmallIcon() 方法設置
標題,通過 setContentTitle() 方法設置
內容,通過 setContentText() 方法設置
除了以上三項,其它均為可選項。雖然如此,但還是應該給 Notification 設置一個 Action ,這樣就可以直接跳轉到 App 的某個 Activity 、啟動一個 Service 或者發送一個 Broadcast。否則,Notification 僅僅只能起到通知的效果,而不能與用戶交互。
當系統接收到通知時,可以通過震動、響鈴、呼吸燈等多種方式進行提醒。
1) setSmallIcon() 與 setLargeIcon()
在 NotificationCompat.Builder 中有設置通知的大小圖標的兩個方法。這兩個方法有什么區別呢?當 setSmallIcon() 與 setLargeIcon() 同時存在時, smallIcon 顯示在largeIcon的右下角;當只設置 setSmallIcon() 時, smallIcon 顯示在左側。看下圖你就明白了。對于部分 ROM ,可能修改過源碼,如 MIUI 上通知的大圖標和小圖標是沒有區別的。
Google 官方是這么解釋 setSmallIcon() 這個方法的:
Set the small icon resource, which will be used to represent the notification in the status bar. The platform template for the expanded view will draw this icon in the left, unless a large icon has also been specified, in which case the small icon will be moved to the right-hand side.
2) 設置提醒標志符Flags
方法解釋:提醒標志符,向通知添加聲音、閃燈和振動效果等設置達到通知提醒效果,可以組合多個屬性
a) 創建通知欄之后通過給他添加.flags屬性賦值。
Notification notification = mBuilder.build(); notification.flags = Notification.FLAG_AUTO_CANCEL;
b) 通過setContentIntent(PendingIntent intent)方法中的意圖設置對應的flags
public PendingIntent getDefalutIntent(int flags){ PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, new Intent(), flags); return pendingIntent; }
各標志符介紹
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) .setDefaults(int defaults) (NotificationCompat.Builder中的方法,用于設置通知到來時,通過什么方式進行提示)
方法解釋:向通知添加聲音、閃燈和振動效果的最簡單、使用默認(defaults)屬性,可以組合多個屬性(和方法1中提示效果一樣的)
對應屬性:
Notification.DEFAULT_VIBRATE //添加默認震動提醒 需要 VIBRATE permission
Notification.DEFAULT_SOUND // 添加默認聲音提醒
Notification.DEFAULT_LIGHTS// 添加默認三色燈提醒
Notification.DEFAULT_ALL// 添加默認以上3種全部提醒
/** * 顯示帶有默認鈴聲、震動、呼吸燈效果的通知 * 如需實現自定義效果,請參考后面三個例子 */ private void showNotifyWithMixed() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("我是有鈴聲+震動+呼吸燈效果的通知") .setContentText("庫里就是叼~") //等價于setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE); .setDefaults(Notification.DEFAULT_ALL); mManager.notify(5, builder.build()); }
4) setVibrate(long[] pattern)
方法解釋:設置震動的時間
.setVibrate(new long[] {0,300,500,700});
實現效果:延遲0ms,然后振動300ms,在延遲500ms,接著在振動700ms。
還有另外一種寫法:
mBuilder.build().vibrate = new long[] {0,300,500,700};
如果希望設置默認振動方式,設置了方法(2)中默認為DEFAULT_VIBRATE 即可。
例子:
/** * 展示有震動效果的通知,需要在AndroidManifest.xml中申請震動權限 * <uses-permission android:name="android.permission.VIBRATE" /> * 補充:測試震動的時候,手機的模式一定要調成鈴聲+震動模式,否則你是感受不到震動的 */ private void showNotifyWithVibrate() { //震動也有兩種設置方法,與設置鈴聲一樣,在此不再贅述 long[] vibrate = new long[]{0, 500, 1000, 1500}; NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("我是伴有震動效果的通知") .setContentText("顫抖吧,凡人~") //使用系統默認的震動參數,會與自定義的沖突 //.setDefaults(Notification.DEFAULT_VIBRATE) //自定義震動效果 .setVibrate(vibrate); //另一種設置震動的方法 //Notification notify = builder.build(); //調用系統默認震動 //notify.defaults = Notification.DEFAULT_VIBRATE; //調用自己設置的震動 //notify.vibrate = vibrate; //mManager.notify(3,notify); mManager.notify(3, builder.build()); }
4)方法:.setLights(intledARGB ,intledOnMS ,intledOffMS )
方法解釋:android支持三色燈提醒,這個方法就是設置不同場景下的不同顏色的燈。
描述:其中ledARGB 表示燈光顏色、 ledOnMS 亮持續時間、ledOffMS 暗的時間。
注意:
1)只有在設置了標志符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒。
2)這邊的顏色跟設備有關,不是所有的顏色都可以,要看具體設備。
Notification notify = mBuilder.build(); notify .setLights(0xff00eeff, 500, 200)
同理,以下方法也可以設置同樣效果:
Notification notify = mBuilder.build(); notify.flags = Notification.FLAG_SHOW_LIGHTS; notify.ledARGB = 0xff00eeff; notify.ledOnMS = 500; notify.ledOffMS = 400;
如果希望使用默認的三色燈提醒,設置了方法(2)中默認為DEFAULT_LIGHTS即可。
例子:
/** * 顯示帶有呼吸燈效果的通知,但是不知道為什么,自己這里測試沒成功 */ private void showNotifyWithLights() { final NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("我是帶有呼吸燈效果的通知") .setContentText("一閃一閃亮晶晶~") //ledARGB 表示燈光顏色、 ledOnMS 亮持續時間、ledOffMS 暗的時間 .setLights(0xFF0000, 3000, 3000); Notification notify = builder.build(); //只有在設置了標志符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持呼吸燈提醒。 notify.flags = Notification.FLAG_SHOW_LIGHTS; //設置lights參數的另一種方式 //notify.ledARGB = 0xFF0000; //notify.ledOnMS = 500; //notify.ledOffMS = 5000; //使用handler延遲發送通知,因為連接usb時,呼吸燈一直會亮著 Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { mManager.notify(4, builder.build()); } }, 10000); }
5)方法:.setSound(Uri sound)
方法解釋:設置默認或則自定義的鈴聲,來提醒。
//獲取默認鈴聲 .setDefaults(Notification.DEFAULT_SOUND) //獲取自定義鈴聲 .setSound(Uri.parse("file:///sdcard/dance.mp3")) //獲取Android多媒體庫內的鈴聲 .setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))
同理相同效果的另一種設置方法這邊就不講, 和上面的都是一樣的。
例子:
/** * 展示有自定義鈴聲效果的通知 * 補充:使用系統自帶的鈴聲效果:Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); */ private void showNotifyWithRing() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("我是伴有鈴聲效果的通知") .setContentText("美妙么?安靜聽~") //調用系統默認響鈴,設置此屬性后setSound()會無效 //.setDefaults(Notification.DEFAULT_SOUND) //調用系統多媒體褲內的鈴聲 //.setSound(Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"2")); //調用自己提供的鈴聲,位于 /res/values/raw 目錄下 .setSound(Uri.parse("android.resource://com.littlejie.notification/" + R.raw.sound)); //另一種設置鈴聲的方法 //Notification notify = builder.build(); //調用系統默認鈴聲 //notify.defaults = Notification.DEFAULT_SOUND; //調用自己提供的鈴聲 //notify.sound = Uri.parse("android.resource://com.littlejie.notification/"+R.raw.sound); //調用系統自帶的鈴聲 //notify.sound = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"2"); //mManager.notify(2,notify); mManager.notify(2, builder.build()); }
6)方法:.setPriority(int pri)
方法解釋:設置優先級(實際項目中并無大用,設置***級也不會使得你的通知欄出現在***位)
對應屬性:
Notification.PRIORITY_DEFAULT(優先級為0)
Notification.PRIORITY_HIGH
Notification.PRIORITY_LOW
Notification.PRIORITY_MAX(優先級為2)
Notification.PRIORITY_MIN(優先級為-2)
Notification.PRIORITY_MAX是優先級***,Notification.PRIORITY_MIN優先級***
7)方法:setOngoing(boolean ongoing)
方法解釋:設置為ture,表示它為一個正在進行的通知。他們通常是用來表示一個后臺任務,用戶積極參與(如播放音樂)或以某種方式正在等待,因此占用設備(如一個文件下載,同步操作,主動網絡連接)
PS:我們看到360手機衛士的通知欄一直固定在手機中,就是通過設置這個標記,使用該標記后你的通知欄無法被用戶手動進行刪除,只能通過代碼進行刪除,慎用
8)setProgress(int max, int progress,boolean indeterminate)
屬性:max:進度條***數值 、progress:當前進度、indeterminate:表示進度是否不確定,true為不確定,false為確定
功能:設置帶進度條的通知,可以在下載中使用
注意:此方法在4.0及以后版本才有用,如果為早期版本:需要自定義通知布局,其中包含ProgressBar視圖
使用:如果為確定的進度條:調用setProgress(max, progress, false)來設置通知,在更新進度的時候在此發起通知更新progress,并且在下載完成后要移除進度條,通過調用setProgress(0, 0, false)既可。
如果為不確定(持續活動)的進度條,這是在處理進度無法準確獲知時顯示活動正在持續,所以調用setProgress(0, 0, true) ,操作結束時,調用setProgress(0, 0, false)并更新通知以移除指示條
9)如何更新 Notification
更新通知很簡單,只需要再次發送相同 ID 的通知即可,如果之前的通知還未被取消,則會直接更新該通知相關的屬性;如果之前的通知已經被取消,則會重新創建一個新通知。
更新通知跟發送通知使用相同的方式。
private void refreshNotification() { //獲取NotificationManager實例 NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //實例化NotificationCompat.Builde并設置相關屬性 NotificationCompat.Builder builder = new NotificationCompat.Builder(this) //設置小圖標 .setSmallIcon(R.mipmap.icon_fab_repair) //設置通知標題 .setContentTitle("最簡單的Notification") //設置通知內容 .setContentText("只有小圖標、標題、內容") //設置通知時間,默認為系統發出通知的時間,通常不用設置 //.setWhen(System.currentTimeMillis()); //通過builder.build()方法生成Notification對象,并發送通知,id=1 notifyManager.notify(1, builder.build()); }
10)如何取消 Notification?
取消通知有如下 5 種方式:
1. 點擊通知欄的清除按鈕,會清除所有可清除的通知
2. 設置了 setAutoCancel() 或 FLAG_AUTO_CANCEL 的通知,點擊該通知時會清除它
3. 通過 NotificationManager 調用 cancel(int id) 方法清除指定 ID 的通知
4. 通過 NotificationManager 調用 cancel(String tag, int id) 方法清除指定 TAG 和 ID 的通知
5. 通過 NotificationManager 調用 cancelAll() 方法清除所有該應用之前發送的通知
如果你是通過 NotificationManager.notify(String tag, int id, Notification notify) 方法創建的通知,那么只能通過 NotificationManager.cancel(String tag, int id) 方法才能清除對應的通知,調用NotificationManager.cancel(int id) 無效。
例子:
public class DemoActivity extends Activity implements View.OnClickListener { //Notification.FLAG_FOREGROUND_SERVICE //表示正在運行的服務 public static final String NOTIFICATION_TAG = "test"; public static final int DEFAULT_NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_notification); findViewById(R.id.btn_remove_all_notification).setOnClickListener(this); findViewById(R.id.btn_send_notification).setOnClickListener(this); findViewById(R.id.btn_remove_notification).setOnClickListener(this); findViewById(R.id.btn_send_notification_with_tag).setOnClickListener(this); findViewById(R.id.btn_remove_notification_with_tag).setOnClickListener(this); findViewById(R.id.btn_send_ten_notification).setOnClickListener(this); findViewById(R.id.btn_send_flag_no_clear_notification).setOnClickListener(this); findViewById(R.id.btn_send_flag_ongoing_event_notification).setOnClickListener(this); findViewById(R.id.btn_send_flag_auto_cancecl_notification).setOnClickListener(this); mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_remove_all_notification: //移除當前 Context 下所有 Notification,包括 FLAG_NO_CLEAR 和 FLAG_ONGOING_EVENT mNotificationManager.cancelAll(); break; case R.id.btn_send_notification: //發送一個 Notification,此處 ID = 1 sendNotification(); break; case R.id.btn_remove_notification: //移除 ID = 1 的 Notification,注意:該方法只針對當前 Context。 mNotificationManager.cancel(DEFAULT_NOTIFICATION_ID); break; case R.id.btn_send_notification_with_tag: //發送一個 ID = 1 并且 TAG = littlejie 的 Notification //注意:此處發送的通知與 sendNotification() 發送的通知并不沖突 //因為此處的 Notification 帶有 TAG sendNotificationWithTag(); break; case R.id.btn_remove_notification_with_tag: //移除一個 ID = 1 并且 TAG = littlejie 的 Notification //注意:此處移除的通知與 NotificationManager.cancel(int id) 移除通知并不沖突 //因為此處的 Notification 帶有 TAG mNotificationManager.cancel(NOTIFICATION_TAG, DEFAULT_NOTIFICATION_ID); break; case R.id.btn_send_ten_notification: //連續發十條 Notification sendTenNotifications(); break; case R.id.btn_send_flag_no_clear_notification: //發送 ID = 1, flag = FLAG_NO_CLEAR 的 Notification //下面兩個 Notification 的 ID 都為 1,會發現 ID 相等的 Notification 會被***的替換掉 sendFlagNoClearNotification(); break; case R.id.btn_send_flag_auto_cancecl_notification: sendFlagOngoingEventNotification(); break; case R.id.btn_send_flag_ongoing_event_notification: sendFlagAutoCancelNotification(); break; } } /** * 發送最簡單的通知,該通知的ID = 1 */ private void sendNotification() { //這里使用 NotificationCompat 而不是 Notification ,因為 Notification 需要 API 16 才能使用 //NotificationCompat 存在于 V4 Support Library NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification") .setContentText("Hi,My id is 1"); mNotificationManager.notify(DEFAULT_NOTIFICATION_ID, builder.build()); } /** * 使用notify(String tag, int id, Notification notification)方法發送通知 * 移除對應通知需使用 cancel(String tag, int id) */ private void sendNotificationWithTag() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification With Tag") .setContentText("Hi,My id is 1,tag is " + NOTIFICATION_TAG); mNotificationManager.notify(NOTIFICATION_TAG, DEFAULT_NOTIFICATION_ID, builder.build()); } /** * 循環發送十個通知 */ private void sendTenNotifications() { for (int i = 0; i < 10; i++) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification Batch") .setContentText("Hi,My id is " + i); mNotificationManager.notify(i, builder.build()); } } /** * 設置FLAG_NO_CLEAR * 該 flag 表示該通知不能被狀態欄的清除按鈕給清除掉,也不能被手動清除,但能通過 cancel() 方法清除 * Notification.flags屬性可以通過 |= 運算疊加效果 */ private void sendFlagNoClearNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification Use FLAG_NO_CLEAR") .setContentText("Hi,My id is 1,i can't be clear."); Notification notification = builder.build(); //設置 Notification 的 flags = FLAG_NO_CLEAR //FLAG_NO_CLEAR 表示該通知不能被狀態欄的清除按鈕給清除掉,也不能被手動清除,但能通過 cancel() 方法清除 //flags 可以通過 |= 運算疊加效果 notification.flags |= Notification.FLAG_NO_CLEAR; mNotificationManager.notify(DEFAULT_NOTIFICATION_ID, notification); } /** * 設置FLAG_AUTO_CANCEL * 該 flag 表示用戶單擊通知后自動消失 */ private void sendFlagAutoCancelNotification() { //設置一個Intent,不然點擊通知不會自動消失 Intent resultIntent = new Intent(this, MainActivity.class); PendingIntent resultPendingIntent = PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification Use FLAG_AUTO_CLEAR") .setContentText("Hi,My id is 1,i can be clear.") .setContentIntent(resultPendingIntent); Notification notification = builder.build(); //設置 Notification 的 flags = FLAG_NO_CLEAR //FLAG_AUTO_CANCEL 表示該通知能被狀態欄的清除按鈕給清除掉 //等價于 builder.setAutoCancel(true); notification.flags |= Notification.FLAG_AUTO_CANCEL; mNotificationManager.notify(DEFAULT_NOTIFICATION_ID, notification); } /** * 設置FLAG_ONGOING_EVENT * 該 flag 表示發起正在運行事件(活動中) */ private void sendFlagOngoingEventNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Send Notification Use FLAG_ONGOING_EVENT") .setContentText("Hi,My id is 1,i can't be clear."); Notification notification = builder.build(); //設置 Notification 的 flags = FLAG_NO_CLEAR //FLAG_ONGOING_EVENT 表示該通知通知放置在正在運行,不能被手動清除,但能通過 cancel() 方法清除 //等價于 builder.setOngoing(true); notification.flags |= Notification.FLAG_ONGOING_EVENT; mNotificationManager.notify(DEFAULT_NOTIFICATION_ID, notification); } }
給Notification設置PendingIntent
PendingIntent可以通過setContentIntent(PendingIntent intent)這個方法進行設置
當我們點擊通知欄時想跳轉一個Activity或者開啟一個service時,就可以通過設置PendingIntent達成
PendingIntent 是 Android 系統管理并持有的用于描述和獲取原始數據的對象的標志(引用)。也就是說,即便創建該PendingIntent對象的進程被殺死了,這個PendingItent對象在其他進程中還是可用的。
日常使用中的短信、鬧鐘等都用到了 PendingIntent。
PendingIntent 主要可以通過以下三種方式獲取:
//獲取一個用于啟動 Activity 的 PendingIntent 對象 public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags); //獲取一個用于啟動 Service 的 PendingIntent 對象 public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags); //獲取一個用于向 BroadcastReceiver 廣播的 PendingIntent 對象 public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
PendingIntent 具有以下幾種 flag:
FLAG_CANCEL_CURRENT:如果當前系統中已經存在一個相同的 PendingIntent 對象,那么就將先將已有的 PendingIntent 取消,然后重新生成一個 PendingIntent 對象。
FLAG_NO_CREATE:如果當前系統中不存在相同的 PendingIntent 對象,系統將不會創建該 PendingIntent 對象而是直接返回 null 。
FLAG_ONE_SHOT:該 PendingIntent 只作用一次。
FLAG_UPDATE_CURRENT:如果系統中已存在該 PendingIntent 對象,那么系統將保留該 PendingIntent 對象,但是會使用新的 Intent 來更新之前 PendingIntent 中的 Intent 對象數據,例如更新 Intent 中的 Extras 。
自定義Notification
Android系統允許使用RemoteViews來自定義通知。自定義普通視圖通知高度限制為64dp,大視圖通知高度限制為256dp。同時,建議自定義通知盡量簡單,以提高兼容性。
自定義通知需要做如下操作:1、創建自定義通知布局2、使用RemoteViews定義通知組件,如圖標、文字等3、調用setContent()將RemoteViews對象綁定到NotificationCompat.Builder4、同正常發送通知流程
注意: 避免為通知設置背景,因為兼容性原因,有些文字可能看不清。
關于自定義Notification兼容問題,請閱讀我的另一篇博客 Android通知欄版本兼容解決方案
例子:
RemoteViews notifactionView = new RemoteViews(mContext.getPackageName(), R.layout.cl_screen_notification); mBuilder.setContent(notifactionView); notifactionView.setOnClickPendingIntent(R.id.cl_screen_notification, pendingIntent); Bitmap pluginIcon = drawableToBitmap(pluginDrawable); LogUtils.d("myl", "獲得icon" + pluginIcon); notifactionView.setImageViewBitmap(R.id.cl_plugin_icon, pluginIcon); notifactionView.setTextViewText(R.id.dl_plugin_msg, pluginContent); Notification notification = mBuilder.build(); int id = 199; LogUtils.d(TAG, "創建通知"); mNotificationManager.notify(id, notification);
Notification的各種樣式
1) BigText樣式(Android 4.1以上)
a) ***高度一般為256dp
b) 不是***的通知時默認為折疊狀態
c) 不設置SummaryText的話,展開后最下面一行的內容會消失
例子:
private void showBigViewText() { NotificationCompat.BigTextStyle textStyle = new BigTextStyle(); textStyle .setBigContentTitle("BigContentTitle") .setSummaryText("SummaryText") .bigText( "I am Big Text"); Notification notification = new NotificationCompat.Builder(context) .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher) .setTicker("showBigView_Text").setContentInfo("contentInfo") .setContentTitle("ContentTitle").setContentText("ContentText") .setStyle(textStyle) .setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL) .build(); manager.notify(NOTIFICATION_ID_2, notification); }
2) Inbox樣式
a) 高度一般為256dp
b) 不是***的通知時默認為折疊狀態
c) 不設置SummaryText的話,展開后最下面一行的內容會消失
例子:
private void showBigViewInbox() { NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle("BigContentTitle").setSummaryText( "SummaryText"); for (int i = 0; i < 5; i++) inboxStyle.addLine("news:" + i); Notification notification = new NotificationCompat.Builder(context) .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher) .setTicker("showBigView_Inbox").setContentInfo("contentInfo") .setContentTitle("ContentTitle").setContentText("ContentText") .setStyle(inboxStyle) .setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL) .build(); manager.notify(NOTIFICATION_ID_4, notification); }
3) BigPicture樣式
a) 高度一般為256dp
b) 不是***的通知時為默認折疊狀態
c) 不設置SummaryText的話,展開后第二行字的內容會消失
例子:
private void showBigViewPic() { NotificationCompat.BigPictureStyle pictureStyle = new BigPictureStyle(); pictureStyle.setBigContentTitle("BigContentTitle") .setSummaryText("SummaryText").bigPicture(icon); Notification notification = new NotificationCompat.Builder(context) .setLargeIcon(icon).setSmallIcon(R.drawable.ic_launcher) .setTicker("showBigView_Pic").setContentInfo("contentInfo") .setContentTitle("ContentTitle").setContentText("ContentText") .setStyle(pictureStyle) .setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL) .build(); manager.notify(NOTIFICATION_ID_3, notification); }
4) 折疊式Notification
折疊式Notification是一種自定義視圖的Notification,用來顯示長文本和一些自定義的布局的場景。它有兩種狀態,一種是普通狀態下的視圖,一種是展開狀態下的視圖。和普通Notification不同的是,我們需要自定義的視圖,而這個視圖顯示的進程和我們創建視圖的進程不再一個進程,所以我們需要使用RemoteViews,首先要使用RemoteViews來創建我們的自定義視圖:
//用RemoteViews來創建自定義Notification視圖 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view);
視圖的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="100dp" android:background="@drawable/fold" android:orientation="horizontal"> <ImageView android:id="@+id/iv_image" android:layout_width="100dp" android:layout_height="100dp" android:src="@drawable/fold" /> <TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:layout_marginLeft="150dp" android:text="展開后的視圖" android:textColor="@color/colorPrimaryDark"/> </LinearLayout>
把自定義視圖賦值給Notification展開時的視圖
//指定展開時的視圖 notification.bigContentView = remoteViews;
也可以把自定義視圖賦值給Notification普通狀態時的視圖
//指定普通狀態時的視圖 notification.contentView = remoteViews;
折疊式Notification完整代碼:
Notification.Builder builder = new Notification.Builder(this); Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mIntent, 0); builder.setContentIntent(pendingIntent); builder.setSmallIcon(R.drawable.foldleft); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher)); builder.setAutoCancel(true); builder.setContentTitle("折疊式通知"); //用RemoteViews來創建自定義Notification視圖 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_fold); Notification notification = builder.build(); //指定展開時的視圖 notification.bigContentView = remoteViews; notificationManager.notify(1, notification);
5) 懸掛式Notification (5.0新增)
懸掛式Notification是android5.0新增加的方式,懸掛式Notification不需要下拉通知欄就直接顯示出來懸掛在屏幕上方并且焦點不變仍在用戶操作的界面因此不會打斷用戶的操作,過幾秒就會自動消失。他需要調用setFullScreenIntent來將Notification變為懸掛式Notification
//如果描述的PendingIntent已經存在,則在產生新的Intent之前會先取消掉當前的 PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.setFullScreenIntent(hangPendingIntent, true);
懸掛式Notification完整代碼:
Notification.Builder builder = new Notification.Builder(this); Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mIntent, 0); builder.setContentIntent(pendingIntent); builder.setSmallIcon(R.drawable.foldleft); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher)); builder.setAutoCancel(true); builder.setContentTitle("懸掛式通知"); //設置點擊跳轉 Intent hangIntent = new Intent(); hangIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); hangIntent.setClass(this, MyNotificationActivity.class); //如果描述的PendingIntent已經存在,則在產生新的Intent之前會先取消掉當前的 PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.setFullScreenIntent(hangPendingIntent, true); notificationManager.notify(2, builder.build());
6) 鎖屏通知
Android 5.0(API level 21)開始,通知可以顯示在鎖屏上。用戶可以通過設置選擇是否允許敏感的通知內容顯示在安全的鎖屏上。你的應用可以通過setVisibility()控制通知的顯示等級:
VISIBILITY_PRIVATE : 顯示基本信息,如通知的圖標,但隱藏通知的全部內容
VISIBILITY_PUBLIC : 顯示通知的全部內容
VISIBILITY_SECRET : 不顯示任何內容,包括圖標
builder.setVisibility(Notification.VISIBILITY_PUBLIC);
關于“如何全面解析Notification”就介紹到這了,更多相關內容可以搜索億速云以前的文章,希望能夠幫助大家答疑解惑,請多多支持億速云網站!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。