Notifications- 简单应用
生活随笔
收集整理的這篇文章主要介紹了
Notifications- 简单应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Notifications 就是我們所說的通知,通知的顯示區域分為2個部分:notification area 和notification drawer,這2個為什么沒有翻譯,一是我沒有想到合適的中文,二是我覺得還是多記一些英文吧,不然文檔都看不懂??磮D就明白這2個區域代表哪里了。
不同版本樣式略有不同, 這是最簡單的通知,當然也基本沒有什么實用意義。這是官網提供的
1、? Content title
2、? Large icon
3、? Content text
4、? Content info
5、? Small icon
6、? Time :一般是通知創建的時間,不設置顯示系統接收到通知的時間,可以用setWhen()設置
普通模版的高是64dp。
疑問:1、創建最簡單的通知時我設置了 Small icon 但是為什么最后的效果是顯示在 Large icon 的位置(如果我2個都設置了顯示的效果和上圖一樣)?
2、在官方文檔有這樣一段描述: 說明一個通知至少需要設置1、3、5 (對應上面圖),為什么我只設置了5就OK了呢?是因為系統默認為空字符串了?
//獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());
效果圖: 基本的通知已經創建好了,但你會發現點擊通知沒有任何相應,一般不是都跳轉到我們的App嗎,好,下面就給我們的通知添加點擊事件:點擊跳轉到App 我們先認識一下 PendingIntent 這個對象就是處理我們的一些行為,比如點擊等,直接上代碼: //獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);Intent intent = new Intent(this,NotificationDemo.class);PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);mBuilder.setContentIntent(pendingIntent);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());
實際中我們還會有這樣的需求:點擊進入app后,用戶點擊 ”back“后我們希望進入app的特定頁面而不是“Home Screen(桌面)”,比如來郵件了,查看完畢后點擊“back”我們希望返回到郵件列表頁,上面的會直接返回 Home Screen, 下面可以達到這種效果 //獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);Intent intent = new Intent(this,NotificationDemo.class);//點擊后返回指定頁面TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);taskStackBuilder.addParentStack(NotificationDemo.class);taskStackBuilder.addNextIntent(intent);PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);mBuilder.setContentIntent(pendingIntent);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());
同時我們還要在 manifest 中進行配置
<activity android:name=".app.NotificationDemo"android:parentActivityName=".app.AppDemo"><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".app.AppDemo"/></activity>
這樣我們在點擊 back ,進入 AppDemo 頁面。接下來我們看下通知的另一種樣式:Big View
對于Big View我們需要理解一下幾點:1、Big View 分為2種展示樣式:收縮和展開,展開時如上圖,收縮時和 Normal View一樣 。
2、展開時
創建通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.drawable.icon_10);RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification_remote_view);builder.setContent(remoteView);mNotificationManager.notify(notificationId, builder.build());
你會發現我們的自定義布局被截取了,上面已經說過 Normal View 模式下通知的高度是 64dp,當然我們也可以把我們的自定義布局設置為 Big View 模式
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.drawable.icon_10);Notification notification = builder.build();RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification_remote_view);notification.bigContentView = remoteView;mNotificationManager.notify(notificationId, notification);
其實通知還有很多用法沒有介紹,大家有時間看看官方文檔自己學習吧,其實我也剛學習android不久,我覺得學習android的步驟是這樣的:1、用到某個知識點的時候(比如通知)先百度查查,大概了解下2、詳細的看官方文檔,基本每個知識點都有詳細的介紹。3、敲代碼、敲代碼、敲代碼(重要的事情說3遍),最好把api中介紹的屬性每個都試一遍,你會發現有很多屬性和預期的不一樣。4、當你覺得能夠熟悉使用的時候你就可以想想如果是你來開發這個功能會如何實現?其實我覺的這個非常重要,我一直覺得學習別人的思路才是自己學到的。5、你想明白了自己如何實現的時候,你在看看源代碼是如何實現的,當你發現不一樣的時候,我們可以好好思考為什么他會這么實現,有什么好處?有時你會發行 哦,還可以這么實現啊,真巧妙。另外我覺得我們這樣 的菜鳥千萬不要鉆進源代碼出不來,不要一直往深了鉆,我們只要知道他幫我們干了什么就可以了。希望對你有所幫助,如果有什么不對的地方希望大家說出來,一起討論才是學的最快的手段。
當我們向系統發送通知時,我們就可以在Notification Area 看見我們設置通知的圖標,打開Notification Drawer 就可以看到列表中有我們發送的通知。
創建Notification 的最簡單的步驟:
1、獲取系統服務 NotificationManager
2、創建Notification
3、推送給系統NotificationManager.notify()
//獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);//創建Notification mBuilder.build() 獲取NotificationNotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置小圖表mBuilder.setSmallIcon(R.drawable.ic_launcher);int notificationId = 0;//發送通知,notificationId 通知的唯一標識mNotificationManager.notify(notificationId,mBuilder.build());不同版本樣式略有不同, 這是最簡單的通知,當然也基本沒有什么實用意義。
Notification Style
我們只是簡單的設置了幾個屬性,系統就繪制出了一個通知界面,是因為系統為我們提供了模版,系統共為我們能提供了2個模版 :Normal View(普通的)、Big View(大布局的,4.1及以上可用)Normal View ? ?
這是官網提供的
1、? Content title
2、? Large icon
3、? Content text
4、? Content info
5、? Small icon
6、? Time :一般是通知創建的時間,不設置顯示系統接收到通知的時間,可以用setWhen()設置
普通模版的高是64dp。
疑問:1、創建最簡單的通知時我設置了 Small icon 但是為什么最后的效果是顯示在 Large icon 的位置(如果我2個都設置了顯示的效果和上圖一樣)?
2、在官方文檔有這樣一段描述: 說明一個通知至少需要設置1、3、5 (對應上面圖),為什么我只設置了5就OK了呢?是因為系統默認為空字符串了?
//獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());效果圖: 基本的通知已經創建好了,但你會發現點擊通知沒有任何相應,一般不是都跳轉到我們的App嗎,好,下面就給我們的通知添加點擊事件:點擊跳轉到App 我們先認識一下 PendingIntent 這個對象就是處理我們的一些行為,比如點擊等,直接上代碼: //獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);Intent intent = new Intent(this,NotificationDemo.class);PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);mBuilder.setContentIntent(pendingIntent);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());
實際中我們還會有這樣的需求:點擊進入app后,用戶點擊 ”back“后我們希望進入app的特定頁面而不是“Home Screen(桌面)”,比如來郵件了,查看完畢后點擊“back”我們希望返回到郵件列表頁,上面的會直接返回 Home Screen, 下面可以達到這種效果 //獲取通知管理服務NotificationManager mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//設置各種屬性mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentText("Content Text");mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);Intent intent = new Intent(this,NotificationDemo.class);//點擊后返回指定頁面TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);taskStackBuilder.addParentStack(NotificationDemo.class);taskStackBuilder.addNextIntent(intent);PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);mBuilder.setContentIntent(pendingIntent);//發送通知mNotificationManager.notify(notificationId,mBuilder.build());
同時我們還要在 manifest 中進行配置
<activity android:name=".app.NotificationDemo"android:parentActivityName=".app.AppDemo"><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".app.AppDemo"/></activity>
這樣我們在點擊 back ,進入 AppDemo 頁面。
接下來我們看下通知的另一種樣式:Big View
(這是官網為我們提供)
對于Big View我們需要理解一下幾點:1、Big View 分為2種展示樣式:收縮和展開,展開時如上圖,收縮時和 Normal View一樣 。
2、展開時1、 Big Content Title
3、Summary Text
7、Detail Area
其他和 Normal View一樣。
3、當通知處于 Notification Drawer 頂端時且是 Big View樣式,通知默認展開,否則默認是收縮的,可手動收縮或展開,手勢就像放大圖片一樣。
4、在展開模式下,Normal View下的Content Title 被 Big Content Title代替,Content Text 被 Summary Text代替。
5、 Detail Area 可以顯示3種樣式 1)Big picture style:顯示bitmap 高 256dp2)Big text style:顯示大號文字
3)Inbox style:顯示多行文字,顯示的行數比較多時,出現…(省略)
private void createNotificationBig(){for(int i=0;i<3;i++){if(i==1){// Inbox styleNotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();inboxStyle.setBigContentTitle("Big Content Title");inboxStyle.setSummaryText("Summary Text");for(int j=0;j<20;j++){inboxStyle.addLine("這是第"+j+"行");}createNotificationBigStyle(inboxStyle,i);}else if(i ==2){// Big picture styleNotificationCompat.BigPictureStyle pictureStyle = new NotificationCompat.BigPictureStyle();pictureStyle.setBigContentTitle("Big Content Title");pictureStyle.setSummaryText("Summary Text");Bitmap largeBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_3);pictureStyle.bigLargeIcon(largeBitmap);Bitmap bigBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_4);pictureStyle.bigPicture(bigBitmap);createNotificationBigStyle(pictureStyle, i);}else if(i==0){// Big text styleNotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();bigTextStyle.setBigContentTitle("Big Content Title");bigTextStyle.setSummaryText("Summary Text");bigTextStyle.bigText("Big Text");createNotificationBigStyle(bigTextStyle,i);}}}private void createNotificationBigStyle(NotificationCompat.Style style,int id){NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);mBuilder.setContentTitle("Content Title");Bitmap largetBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon_1);mBuilder.setLargeIcon(largetBitmap);mBuilder.setContentInfo("Content Info");mBuilder.setSmallIcon(R.drawable.icon_2);mBuilder.setContentText("Content Text");mBuilder.setStyle(style);mNotificationManager.notify(id, mBuilder.build());}
有些手機上有一些通知用戶無法清除,而且一直在頂部,這樣的話,我們的Big View通知不是無法直接打開了嗎?其實通知是可以設置優先級的,當前不可取消通知也是可以設置的。
通知的優先級分為5個級別:PRIORITY_MAX,PRIORITY_HIGH,PRIORITY_DEFAULT,PRIORITY_LOW,PRIORITY_MIN 一次降低,我們想將通知放在第一位只需設置級別為PRIORITY_MAX,通過 NotificationCompat.Builder.setPriority() 設置。 下面在介紹一種通知:帶進度條的通知,這個也很常用,比如顯示下載的進度、播放歌曲的進度等 final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setContentTitle("Content Title");builder.setContentText("Content Text");builder.setSmallIcon(R.drawable.icon_10);new Thread(new Runnable() {@Overridepublic void run() {for(int i=0;i<=100;i+=5){//設置進度條的進度builder.setProgress(100,i,false);mNotificationManager.notify(notificationId, builder.build());try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}//移除進度條builder.setProgress(0,0,false);mNotificationManager.notify(notificationId, builder.build());}}).start(); 我們看到下載完畢后進度條自動消失了,這個 就是下面這句話起的作用builder.setProgress(0,0,false); 其實系統會根據我們傳入的參數 notificationId 來判斷,如果通知欄上存在則更新,否則創建。 如果你覺得上面的還不能滿足你的要求,那么通知還允許你自定義界面,自定義界面是通過 RemoteViews 完成的。首先在 layout 中完成我們自己的布局文件:<?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="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="Remote View"/> </LinearLayout>創建通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.drawable.icon_10);RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification_remote_view);builder.setContent(remoteView);mNotificationManager.notify(notificationId, builder.build());
你會發現我們的自定義布局被截取了,上面已經說過 Normal View 模式下通知的高度是 64dp,當然我們也可以把我們的自定義布局設置為 Big View 模式
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.drawable.icon_10);Notification notification = builder.build();RemoteViews remoteView = new RemoteViews(this.getPackageName(),R.layout.notification_remote_view);notification.bigContentView = remoteView;mNotificationManager.notify(notificationId, notification);
其實通知還有很多用法沒有介紹,大家有時間看看官方文檔自己學習吧,其實我也剛學習android不久,我覺得學習android的步驟是這樣的:1、用到某個知識點的時候(比如通知)先百度查查,大概了解下2、詳細的看官方文檔,基本每個知識點都有詳細的介紹。3、敲代碼、敲代碼、敲代碼(重要的事情說3遍),最好把api中介紹的屬性每個都試一遍,你會發現有很多屬性和預期的不一樣。4、當你覺得能夠熟悉使用的時候你就可以想想如果是你來開發這個功能會如何實現?其實我覺的這個非常重要,我一直覺得學習別人的思路才是自己學到的。5、你想明白了自己如何實現的時候,你在看看源代碼是如何實現的,當你發現不一樣的時候,我們可以好好思考為什么他會這么實現,有什么好處?有時你會發行 哦,還可以這么實現啊,真巧妙。另外我覺得我們這樣 的菜鳥千萬不要鉆進源代碼出不來,不要一直往深了鉆,我們只要知道他幫我們干了什么就可以了。希望對你有所幫助,如果有什么不對的地方希望大家說出來,一起討論才是學的最快的手段。
總結
以上是生活随笔為你收集整理的Notifications- 简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 揭秘跨越普通权限的神秘地带
- 下一篇: raptor