通知Notification
Android 8.0 引入了通知渠道,可以為要顯示的每種通知類型創建用戶可自定義的渠道,所有的通知都必須分配到相應的渠道。用戶界面將通知渠道稱之為通知類別。所以在使用通知時需要先判斷Android系統,8.0以上的需要創建渠道,將通知放入特定渠道中,否則通知將不會出現,8.0一下的系統則不用創建渠道。
可以將創建渠道封裝到一個方法中,再該方法中進行判斷是否創建:
private String createNotificationChannel(String channelID, String channelNAME, int level) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationChannel channel = new NotificationChannel(channelID, channelNAME, level); manager.createNotificationChannel(channel); return channelID; } else { return null; } }
- NotificationChannel為通知渠道,創建實例時接收三個參數NotificationChannel(String id, CharSequence name, int importance),第一個為渠道ID,第二個為渠道名稱,第三個為通知的重要度,總共有六個:NotificationManager.IMPORTANCE_UNSPECIFIED、 NotificationManager.IMPORTANCE_NONE、NotificationManager.IMPORTANCE_MIN(低,不發出提示音,且不會在狀態欄中顯示)、NotificationManager.IMPORTANCE_LOW(中,不發出提示音)、NotificationManager.IMPORTANCE_DEFAULT(高,發出提示音)、NotificationManager.IMPORTANCE_HIGH(緊急,發出提示音,並以浮動通知的形式顯示),一般只用后面四種,應用程序的通知管理內,重要程度也只有后面四種。
- NotificationManager用來對通知進行管理,通過調用getSystemService()方法獲取,該方法有一個字符串參數用於確定獲取系統哪個服務。然后調用createNotificationChannel()方法創建通知渠道,接收一個NotificationChannel參數。
然后要做的就是創建通知了,通過NotificationCompat.Builder構造通知需要的信息,因為需要為通知設置相應的消息類別(渠道),所以構造方法采用接收兩個參數的(只接收一個Context參數的官方不建議用了),第一個參數為Context,第二個參數為渠道ID。該構造方法在最終的build()方法之前可以連綴多個設置方法來設置該通知的各種信息。最后再調用NotificationManager的notify()方法就可以讓通知顯示出來了。
Intent intent = new Intent(this, NotificationActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); String channelId = createNotificationChannel("my_channel_ID", "my_channel_NAME", NotificationManager.IMPORTANCE_HIGH); Notification notification =new NotificationCompat.Builder(this, channelId) .setContentTitle("This is content title") .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big))) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentIntent(pi) .setAutoCancel(true) .setVibrate(new long[]{0,1000,1000,1000}) .setPriority(NotificationCompat.PRIORITY_MAX) .setSound(Uri.fromFile(new File("/system/medio/audio/ringtones/Luna.ogg"))) .build(); manager.notify(1, notification);
NotificationCompat. Builder (Context context, String channelId)方法后面可以連綴的設置方法:
- setContentTitle (CharSequence title):設置通知標題
- setContentText (CharSequence text):設置通知文本
- setWhen (long when):設置事件發生的時間
- setSmallIcon (IconCompat icon):設置要在通知的小圖標,只能使用純alpha圖層的圖片進行設置,小圖標會顯示在系統狀態欄上。
- setLargeIcon (Bitmap icon):設置通知的大圖標,當下拉系統狀態欄時,就可以看到設置的大圖標了。
- setContentIntent (PendingIntent intent):在單擊通知時提供要發送的PendingIntent。
- setAutoCancel (boolean autoCancel):設置此標志將使通知在用戶單擊面板時自動取消
- setSound (Uri sound):設置在通知發出時的提示音
- setVibrate (long[] pattern):設置通知發出時進行手機震動
- setLights (int argb, int onMs, int offMs):設置希望設備上的LED閃爍的argb值以及速率
- setDefaults (int defaults):當你不想進行那么多繁雜的設置時,使用這個方法可以設置默認通知選項
notify (int id, Notification notification)方法接收兩個參數,第一個參數為id,要保證為每個通知指定的id都是不同的,第二個參數為Notification對象。
這里還為通知設置了點擊后跳轉的動作,這里使用PendingIntent來實現,PendingIntent和Intent有點相似,都可以用於啟動活動、啟動服務以及發送廣播等,但Intent更傾向於去立即執行某個動作,而PendingIntent更傾向於在某個合適的時機去執行某個動作,所以也可以把PendingIntent簡單的理解為延遲執行的Intent。
PendingIntent主要提供了幾種靜態方法用於獲取PendingIntent的實例,可以根據需求來選擇是使用getActivity()方法、getBroadcast()方法、還是getService()方法。這三個方法所接收的參數都是相同的,第一個參數是Conext,第二個參數是發送方的私有請求代碼,一般用不到,通常都是傳入0即可,第三個參數是一個Intent對象,我們可以通過這個對象構建出PendingIntent的“意圖”,第四個參數用於確定PendingIntent的行為,有FLAG_ONE_SHOT(指示此PendingIntent只能使用一次的標志)、FLAG_NO_CREATE(指示如果所描述的PendingIntent不存在,則只返回NULL而不是創建它。)、FLAG_CANCEL_CURRENT(指示如果所描述的PendingIntent已經存在,則應在生成新PendingIntent之前取消當前的PendingIntent。)、FLAG_UPDATE_CURRENT(指示如果所描述的PendingIntent已經存在,則保留它,但將其額外的數據替換為這個新意圖中的內容。)這4種值可選,通常情況下這個參數傳入0就可以了。
通知的高級功能:
setStyle (NotificationCompat.Style style):這個方法可以構造出富文本的通知內容,也就是說通知中不光可以有文字和圖標,還可以包含更多的東西。該方法接收一個NotificationCompat.Style參數,這個參數就是用來構建具體的富文本信息的,如長文字、圖片等。
如果我們使用setContentText()方法設置顯示長文本,則只會顯示一行,后面的會用省略號代替,如果想要顯示長文本的所有內容,就可以使用setStyle()方法,先在setStyle()方法中創建一個NotificationCompat.BigTextStyle()對象,這個對象就是用於封裝長文字信息的,然后調用它的bigText()方法將文字內容傳入就可以了。
setStyle(new NotificationCompat.BigTextStyle().bigText("如果我們使用setContentText()方法設置顯示長文本,則只會顯示一行,后面的會用省略號代替,如果想要顯示長文本的所有內容,就可以使用setStyle()方法,先在setStyle()方法中創建一個NotificationCompat.BigTextStyle()對象,這個對象就是用於封裝長文字信息的,然后調用它的bigText()方法將文字內容傳入就可以了。"))
效果:
如果想在通知里顯示大圖片,則在setStyle()方法中創建一個NotificationCompat.BigPictureStyle()對象,這個對象就是用於設置大圖片的,然后調用它的bigPicture()方法將圖片傳入,因為bigPicture()方法接收的參數為Bitmap對象,所以我們還需要通過BitmapFactory的decodeResource()方法將圖片解析成Bitmap對象再傳入到bigPicture()方法中。
setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big)))
效果: