日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android--通知之Notification

發(fā)布時(shí)間:2023/12/10 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android--通知之Notification 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

  之前一篇博客講了Android下使用Toast的方式提示消息。這篇博客講解一下在Android中使用Notification提示消息給用戶(hù),Notification是一種具有全局效果的通知,程序一般通過(guò)NotificationManager服務(wù)來(lái)發(fā)送Notification。在本篇博客中,將介紹Notification的常規(guī)使用,以及自定義方式的使用,對(duì)于每種不同的方式,都提供示例展示效果。

?

Notification

  Notification,俗稱(chēng)通知,是一種具有全局效果的通知,它展示在屏幕的頂端,首先會(huì)表現(xiàn)為一個(gè)圖標(biāo)的形式,當(dāng)用戶(hù)向下滑動(dòng)的時(shí)候,展示出通知具體的內(nèi)容。

  因?yàn)锳ndroid的快速發(fā)展,而Android的版本也快速的升級(jí)導(dǎo)致了一些兼容性的問(wèn)題。對(duì)于Notification而言,Android3.0是一個(gè)分水嶺,在其之前構(gòu)建Notification推薦使用NotificationCompate.Builder,它位于android.support.v4.app.NotificationCompat.Builder,是一個(gè)Android向下版本的兼容包,而在Android3.0之后,一般推薦使用Notification.Builder構(gòu)建。本博客主要介紹的是Android4.x的開(kāi)發(fā),所以在這里使用Notification.Builder進(jìn)行講解演示。

  通知一般通過(guò)NotificationManager服務(wù)發(fā)送一個(gè)Notification對(duì)象來(lái)完成通知,NotificationManager是一個(gè)重要的系統(tǒng)級(jí)服務(wù),該對(duì)象位于應(yīng)用程序的框架層中,應(yīng)用程序可以通過(guò)它向系統(tǒng)發(fā)送全局的通知。使用通知的時(shí)候,需要?jiǎng)?chuàng)建一個(gè)Notification對(duì)象用來(lái)承載通知的內(nèi)容,但是一般不會(huì)直接通過(guò)Notification的構(gòu)造方法來(lái)得到對(duì)象,而是使用它的內(nèi)部類(lèi)Notification.Builder來(lái)實(shí)例化一個(gè)Builder對(duì)象,并設(shè)置通知的各項(xiàng)屬性,最后通過(guò)Notification.Builder.builder()方法得到一個(gè)Notification對(duì)象,當(dāng)獲得這個(gè)Notification對(duì)象之后,就可以使用NotificationManager.notify()方法發(fā)送通知。

  NotificationManager類(lèi)是一個(gè)通知管理器類(lèi),這個(gè)對(duì)象是由系統(tǒng)維護(hù)的服務(wù),是以單例模式的方式獲得,所以一般并不直接實(shí)例化這個(gè)對(duì)象。在Activity中,可以使用Activity.getSystemService(String)方法獲取NotificationManager對(duì)象,Activity.getSystemService(String)方法可以通過(guò)Android系統(tǒng)級(jí)服務(wù)的句柄,返回對(duì)應(yīng)的對(duì)象。在這里需要返回NotificationManager,所以直接傳遞Context.NOTIFICATION_SERVICE即可。

  雖然通知中提供了各種屬性的設(shè)置,但是一個(gè)通知對(duì)象,有幾個(gè)屬性是必須要設(shè)置的,其他的屬性均是可選的,必須設(shè)置的屬性如下:

  • 小圖標(biāo),使用setSamllIcon()方法設(shè)置。
  • 標(biāo)題,使用setContentTitle()方法設(shè)置。
  • 文本內(nèi)容,使用setContentText()方法設(shè)置。?

  

更新與移除通知

  在使用NotificationManager.notify()發(fā)送通知的時(shí)候,需要傳遞一個(gè)標(biāo)識(shí)符,用于唯一標(biāo)識(shí)這個(gè)通知。對(duì)于有些場(chǎng)景,并不是無(wú)限的添加新的通知,有時(shí)候需要更新原有通知的信息,這個(gè)時(shí)候可以重寫(xiě)構(gòu)建Notification,而使用與之前通知相同標(biāo)識(shí)符來(lái)發(fā)送通知,這個(gè)時(shí)候舊的通知就被被新的通知所取代,起到更新通知的效果。

  對(duì)于一個(gè)通知,當(dāng)展示在狀態(tài)欄之后,但是使用過(guò)后,如何取消呢?Android為我們提供兩種方式移除通知,一種是Notification自己維護(hù),使用setAutoCancel()方法設(shè)置是否維護(hù),傳遞一個(gè)boolean類(lèi)型的數(shù)據(jù)。另外一種方式使用NotificationManager通知管理器對(duì)象來(lái)維護(hù),它通過(guò)notify()發(fā)送通知的時(shí)候,指定的通知標(biāo)識(shí)Id來(lái)操作通知,可以使用cancel(int)來(lái)移除一個(gè)指定的通知,也可以使用cancelAll()移除所有的通知。

  使用NotificationManager移除指定通知示例:

1 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 2 mNotificationManager.cancel(0);

?

?PendingIntent

  對(duì)于一個(gè)通知而言,它顯示的消息是有限的,一般僅用于提示一些概要信息。但是一般簡(jiǎn)短的消息,并不能表達(dá)需要告訴用戶(hù)的全部?jī)?nèi)容,所以需要綁定一個(gè)意圖,當(dāng)用戶(hù)點(diǎn)擊通知的時(shí)候,調(diào)用一個(gè)意圖展示出一個(gè)Activity用來(lái)顯示詳細(xì)的內(nèi)容。而Notification中,并不使用常規(guī)的Intent去傳遞一個(gè)意圖,而是使用PendingIntent。

  先來(lái)說(shuō)說(shuō)Intent和PendingIntent的區(qū)別,PendingIntent可以看做是對(duì)Intent的包裝,通過(guò)名稱(chēng)可以看出PendingIntent用于處理即將發(fā)生的意圖,而Intent用來(lái)用來(lái)處理馬上發(fā)生的意圖。而對(duì)于通知來(lái)說(shuō),它是一系統(tǒng)級(jí)的全局通知,并不確定這個(gè)意圖被執(zhí)行的時(shí)間。當(dāng)在應(yīng)用外部執(zhí)行PendingIntent時(shí),因?yàn)樗4媪擞|發(fā)應(yīng)用的Context,使得外部應(yīng)用可以如在當(dāng)前應(yīng)用中一樣,執(zhí)行PendingIntent里的Intent,就算執(zhí)行的時(shí)候響應(yīng)通知的應(yīng)用已經(jīng)被銷(xiāo)毀了,也可以通過(guò)存在PendingIntent里的Context照常執(zhí)行它,并且還可以處理Intent說(shuō)帶來(lái)的額外信息。

  PendingIntent提供了多個(gè)靜態(tài)的getXxx()方法,用于獲得適用于不同場(chǎng)景的PendingIntent對(duì)象。一般需要傳遞的幾個(gè)參數(shù)都很常規(guī),只介紹一個(gè)flag參數(shù),用于標(biāo)識(shí)PendingIntent的構(gòu)造選擇:

  • FLAG_CANCEL_CURRENT:如果構(gòu)建的PendingIntent已經(jīng)存在,則取消前一個(gè),重新構(gòu)建一個(gè)。
  • FLAG_NO_CREATE:如果前一個(gè)PendingIntent已經(jīng)不存在了,將不再構(gòu)建它。
  • FLAG_ONE_SHOT:表明這里構(gòu)建的PendingIntent只能使用一次。
  • FLAG_UPDATE_CURRENT:如果構(gòu)建的PendingIntent已經(jīng)存在,則替換它,常用。

?

Notification視覺(jué)風(fēng)格

  Notification有兩種視覺(jué)風(fēng)格,一種是標(biāo)準(zhǔn)視圖(Normal view)、一種是大視圖(Big view)。標(biāo)準(zhǔn)視圖在Android中各版本是通用的,但是對(duì)于大視圖而言,僅支持Android4.1+的版本。

  從官方文檔了解到,一個(gè)標(biāo)準(zhǔn)視圖顯示的大小要保持在64dp高,寬度為屏幕標(biāo)準(zhǔn)。標(biāo)準(zhǔn)視圖的通知主體內(nèi)容有一下幾個(gè):

  • 通知標(biāo)題。
  • 大圖標(biāo)。
  • 通知內(nèi)容。
  • 通知消息。
  • 小圖標(biāo)。
  • 通知的時(shí)間,一般為系統(tǒng)時(shí)間,也可以使用setWhen()設(shè)置。
  •   下面通過(guò)一個(gè)示例,模仿上面效果的通知。

    1 btnNotification.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 Bitmap btm = BitmapFactory.decodeResource(getResources(), 6 R.drawable.msg); 7 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( 8 MainActivity.this).setSmallIcon(R.drawable.msg) 9 .setContentTitle("5 new message") 10 .setContentText("twain@android.com"); 11 mBuilder.setTicker("New message");//第一次提示消息的時(shí)候顯示在通知欄上 12 mBuilder.setNumber(12); 13 mBuilder.setLargeIcon(btm); 14 mBuilder.setAutoCancel(true);//自己維護(hù)通知的消失 15 16 //構(gòu)建一個(gè)Intent 17 Intent resultIntent = new Intent(MainActivity.this, 18 ResultActivity.class); 19 //封裝一個(gè)Intent 20 PendingIntent resultPendingIntent = PendingIntent.getActivity( 21 MainActivity.this, 0, resultIntent, 22 PendingIntent.FLAG_UPDATE_CURRENT); 23 // 設(shè)置通知主題的意圖 24 mBuilder.setContentIntent(resultPendingIntent); 25 //獲取通知管理器對(duì)象 26 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 27 mNotificationManager.notify(0, mBuilder.build()); 28 } 29 });

      顯示效果:

    ?

    ?

      而對(duì)于大視圖(Big View)而言,它的細(xì)節(jié)區(qū)域只能顯示256dp高度的內(nèi)容,并且只對(duì)Android4.1+之后的設(shè)備才支持,它比標(biāo)準(zhǔn)視圖不一樣的地方,均需要使用setStyle()方法設(shè)定,它大致的效果如下:

      setStyle()傳遞一個(gè)NotificationCompat.Style對(duì)象,它是一個(gè)抽象類(lèi),Android為我們提供了三個(gè)實(shí)現(xiàn)類(lèi),用于顯示不同的場(chǎng)景。分別是:

    • NotificationCompat.BigPictureStyle, 在細(xì)節(jié)部分顯示一個(gè)256dp高度的位圖。
    • NotificationCompat.BigTextStyle,在細(xì)節(jié)部分顯示一個(gè)大的文本塊。
    • NotificationCompat.InboxStyle,在細(xì)節(jié)部分顯示一段行文本。

      如果僅僅顯示一個(gè)圖片,使用BigPictureStyle是最方便的;如果需要顯示一個(gè)富文本信息,則可以使用BigTextStyle;如果僅僅用于顯示一個(gè)文本的信息,那么使用InboxStyle即可。后面會(huì)以一個(gè)示例來(lái)展示InboxStyle的使用,模仿上面圖片的顯示。

    ?  實(shí)現(xiàn)代碼:

    1 btnBigViewNotification.setOnClickListener(new View.OnClickListener() { 2 3 @Override 4 public void onClick(View v) { 5 6 Bitmap btm = BitmapFactory.decodeResource(getResources(), 7 R.drawable.msg); 8 Intent intent = new Intent(MainActivity.this, 9 ResultActivity.class); 10 11 PendingIntent pendingIntent = PendingIntent.getActivity( 12 MainActivity.this, 0, intent, 13 PendingIntent.FLAG_CANCEL_CURRENT); 14 15 Notification noti = new NotificationCompat.Builder( 16 MainActivity.this) 17 .setSmallIcon(R.drawable.msg) 18 .setLargeIcon(btm) 19 .setNumber(13) 20 .setContentIntent(pendingIntent) 21 .setStyle( 22 new NotificationCompat.InboxStyle() 23 .addLine( 24 "M.Twain (Google+) Haiku is more than a cert...") 25 .addLine("M.Twain Reminder") 26 .addLine("M.Twain Lunch?") 27 .addLine("M.Twain Revised Specs") 28 .addLine("M.Twain ") 29 .addLine( 30 "Google Play Celebrate 25 billion apps with Goo..") 31 .addLine( 32 "Stack Exchange StackOverflow weekly Newsl...") 33 .setBigContentTitle("6 new message") 34 .setSummaryText("mtwain@android.com")) 35 .build(); 36 37 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 38 mNotificationManager.notify(0, noti); 39 } 40 });

      展示效果:

    ?

    進(jìn)度條樣式的通知

      對(duì)于一個(gè)標(biāo)準(zhǔn)通知,有時(shí)候顯示的消息并不一定是靜態(tài)的,還可以設(shè)定一個(gè)進(jìn)度條用于顯示事務(wù)完成的進(jìn)度。

      Notification.Builder類(lèi)中提供一個(gè)setProgress(int max,int progress,boolean indeterminate)方法用于設(shè)置進(jìn)度條,max用于設(shè)定進(jìn)度的最大數(shù),progress用于設(shè)定當(dāng)前的進(jìn)度,indeterminate用于設(shè)定是否是一個(gè)確定進(jìn)度的進(jìn)度條。通過(guò)indeterminate的設(shè)置,可以實(shí)現(xiàn)兩種不同樣式的進(jìn)度條,一種是有進(jìn)度刻度的(true),一種是循環(huán)流動(dòng)的(false)。下面分別用兩個(gè)示例演示:

      有進(jìn)度的進(jìn)度條,實(shí)現(xiàn)代碼:?

    1 btnProgreNotification.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 5 builder = new NotificationCompat.Builder(MainActivity.this) 6 .setSmallIcon(R.drawable.ic_launcher) 7 .setContentTitle("Picture Download") 8 .setContentText("Download in progress"); 9 builder.setAutoCancel(true); 10 //通過(guò)一個(gè)子線程,動(dòng)態(tài)增加進(jìn)度條刻度 11 new Thread(new Runnable() { 12 @Override 13 public void run() { 14 int incr; 15 for (incr = 0; incr <= 100; incr += 5) { 16 builder.setProgress(100, incr, false); 17 manager.notify(0, builder.build()); 18 try { 19 Thread.sleep(300); 20 } catch (InterruptedException e) { 21 Log.i(TAG, "sleep failure"); 22 } 23 } 24 builder.setContentText("Download complete") 25 .setProgress(0, 0, false); 26 manager.notify(0, builder.build()); 27 } 28 }).start(); 29 } 30 });

      顯示效果:

    ?  對(duì)于循環(huán)流動(dòng)的進(jìn)度條,下面是實(shí)現(xiàn)代碼:

    1 btnProNotification.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 5 builder = new NotificationCompat.Builder(MainActivity.this) 6 .setSmallIcon(R.drawable.ic_launcher) 7 .setContentTitle("Picture Download") 8 .setContentText("Download in progress"); 9 builder.setProgress(0, 0, true);//設(shè)置為true,表示流動(dòng) 10 manager.notify(0, builder.build()); 11 12 //5秒之后還停止流動(dòng) 13 new Thread(new Runnable() { 14 @Override 15 public void run() { 16 try { 17 Thread.sleep(5000); 18 } catch (InterruptedException e) { 19 e.printStackTrace(); 20 } 21 builder.setProgress(100, 100, false);//設(shè)置為true,表示刻度 22 manager.notify(0, builder.build()); 23 } 24 }).start(); 25 } 26 });

      效果展示:

    ?

    自定義通知

      和Toast一樣,通知也可以使用自定義的XML來(lái)自定義樣式,但是對(duì)于通知而言,因?yàn)樗娜中?#xff0c;并不能簡(jiǎn)單的通過(guò)inflate膨脹出一個(gè)View,因?yàn)榭赡苡|發(fā)通知的時(shí)候,響應(yīng)的App已經(jīng)關(guān)閉,無(wú)法獲取當(dāng)指定的XML布局文件。所以需要使用單獨(dú)的一個(gè)RemoteViews類(lèi)來(lái)操作。

      RemoteViews,描述了一個(gè)視圖層次的結(jié)構(gòu),可以顯示在另一個(gè)進(jìn)程。層次結(jié)構(gòu)也是從布局文件中“膨脹”出一個(gè)視圖,這個(gè)類(lèi),提供了一些基本的操作求改其膨脹的內(nèi)容。

      RemoteViews提供了多個(gè)構(gòu)造函數(shù),一般使用RemoteViews(String packageName,int layoutId)。第一個(gè)參數(shù)為包的名稱(chēng),第二個(gè)為layout資源的Id。當(dāng)獲取到RemoteViews對(duì)象之后,可以使用它的一系列setXxx()方法通過(guò)控件的Id設(shè)置控件的屬性。最后使用NotificationCompat.Builder.setContent(RemoteViews)方法設(shè)置它到一個(gè)Notification中。

      下面通過(guò)一個(gè)示例展示它:

      自定義的布局XML代碼:

    1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:padding="10dp" > 6 7 <ImageView 8 android:id="@+id/imageNo" 9 android:layout_width="wrap_content" 10 android:layout_height="match_parent" 11 android:layout_alignParentLeft="true" 12 android:layout_marginRight="10dp" /> 13 14 <TextView 15 android:id="@+id/titleNo" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:layout_toRightOf="@id/imageNo" /> 19 20 <TextView 21 android:id="@+id/textNo" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:layout_below="@id/titleNo" 25 android:layout_toRightOf="@id/imageNo" /> 26 27 </RelativeLayout>

      實(shí)現(xiàn)代碼:

    1 btnCustomNotification.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 RemoteViews contentViews = new RemoteViews(getPackageName(), 5 R.layout.custom_notification); 6 //通過(guò)控件的Id設(shè)置屬性 7 contentViews 8 .setImageViewResource(R.id.imageNo, R.drawable.btm1); 9 contentViews.setTextViewText(R.id.titleNo, "自定義通知標(biāo)題"); 10 contentViews.setTextViewText(R.id.textNo, "自定義通知內(nèi)容"); 11 12 Intent intent = new Intent(MainActivity.this, 13 ResultActivity.class); 14 15 PendingIntent pendingIntent = PendingIntent.getActivity( 16 MainActivity.this, 0, intent, 17 PendingIntent.FLAG_CANCEL_CURRENT); 18 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( 19 MainActivity.this).setSmallIcon(R.drawable.ic_launcher) 20 .setContentTitle("My notification") 21 .setTicker("new message"); 22 mBuilder.setAutoCancel(true); 23 24 mBuilder.setContentIntent(pendingIntent); 25 mBuilder.setContent(contentViews); 26 mBuilder.setAutoCancel(true); 27 NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 28 mNotificationManager.notify(10, mBuilder.build()); 29 } 30 });

      效果展示:

    ?

    設(shè)定提示響應(yīng)

      對(duì)于有些通知,需要調(diào)用一些設(shè)備的資源,使用戶(hù)能更快的發(fā)現(xiàn)有新通知,一般可設(shè)定的響應(yīng)有:鈴聲、閃光燈、震動(dòng)。對(duì)于這三個(gè)屬性,NotificationCompat.Builder提供了三個(gè)方法設(shè)定:

    • setSound(Uri sound):設(shè)定一個(gè)鈴聲,用于在通知的時(shí)候響應(yīng)。傳遞一個(gè)Uri的參數(shù),格式為“file:///mnt/sdcard/Xxx.mp3”。
    • setLights(int argb, int onMs, int offMs):設(shè)定前置LED燈的閃爍速率,持續(xù)毫秒數(shù),停頓毫秒數(shù)。
    • setVibrate(long[] pattern):設(shè)定震動(dòng)的模式,以一個(gè)long數(shù)組保存毫秒級(jí)間隔的震動(dòng)。

      大多數(shù)時(shí)候,我們并不需要設(shè)定一個(gè)特定的響應(yīng)效果,只需要遵照用戶(hù)設(shè)備上系統(tǒng)通知的效果即可,那么可以使用setDefaults(int)方法設(shè)定默認(rèn)響應(yīng)參數(shù),在Notification中,對(duì)它的參數(shù)使用常量定義了,我們只需使用即可:

    • DEFAULT_ALL:鈴聲、閃光、震動(dòng)均系統(tǒng)默認(rèn)。
    • DEFAULT_SOUND:系統(tǒng)默認(rèn)鈴聲。
    • DEFAULT_VIBRATE:系統(tǒng)默認(rèn)震動(dòng)。
    • DEFAULT_LIGHTS:系統(tǒng)默認(rèn)閃光。

      而在Android中,如果需要訪問(wèn)硬件設(shè)備的話,是需要對(duì)其進(jìn)行授權(quán)的,所以需要在清單文件AndroidManifest.xml中增加兩個(gè)授權(quán),分別授予訪問(wèn)振動(dòng)器與閃光燈的權(quán)限:

    1 <!-- 閃光燈權(quán)限 --> 2 <uses-permission android:name="android.permission.FLASHLIGHT"/> 3 <!-- 振動(dòng)器權(quán)限 --> 4 <uses-permission android:name="android.permission.VIBRATE"/>

    ?

      因?yàn)橹皇且粋€(gè)屬性的設(shè)定,并且大部分時(shí)候,使用系統(tǒng)設(shè)定即可,這里就不提供代碼示例了。?

      源碼下載

    總結(jié)

      通知算是Android中比較常用的一個(gè)功能,可以保持自己App的長(zhǎng)存,在用戶(hù)沒(méi)有進(jìn)入App的時(shí)候,也提供了與用戶(hù)交互的可能。

    轉(zhuǎn)載于:https://www.cnblogs.com/MMLoveMeMM/articles/3599658.html

    總結(jié)

    以上是生活随笔為你收集整理的Android--通知之Notification的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。