Android中通知的使用

不怕跌倒,所以飛翔

參考文獻:
ASleepyCoder的Android Notification常見樣式總結(jié)文章
vipra的Android 通知欄Notification的整合 全面學(xué)習(xí) (一個DEMO讓你完全了解它)

本文主要知識點概要:

  • 通知(Notification)的簡單使用
  • 通知(Notification)的一些常用的設(shè)置方法
  • 通知(Notification)的進階使用
  • 通知(Notification)的常見問題

1. 簡單使用

  • 創(chuàng)建一個NotificationManager對通知進行管理
  • 通過一個構(gòu)建器來創(chuàng)建一個Notification對象

1.1創(chuàng)建一個NotificationManager對象

NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

通過NotificationManager來管理通知內(nèi)容;

1.2創(chuàng)建一個Notification對象

這個對象是通過構(gòu)建者模式創(chuàng)建的,這里先貼代碼,之后我在詳細講解常用的方法:

        NotificationCompat.Builder nb = new NotificationCompat.Builder(this, "1");
        nb.setContentTitle("通知的標題欄");
        nb.setContentText("通知欄內(nèi)容");
        nb.setWhen(System.currentTimeMillis());
        nb.setSmallIcon(R.drawable.ic_stat_name);
        nb.setTicker("狀態(tài)欄中提示的內(nèi)容");
        nb.setDefaults(Notification.DEFAULT_VIBRATE);
        Notification notification = nb.build();

        mManager.notify(1,notification);

通過以上方法就可以成功的創(chuàng)建一個通知了,這里面具體的設(shè)置方法我在后面會詳細講解。

2.一些常用的設(shè)置方法

2.1當你創(chuàng)建通知的時候會使用到NotificationCompat來構(gòu)建一個通知.常用到的方法如下:

  • setContentTitle("") 設(shè)置通知的標題
  • setContentText("") 設(shè)置通知的內(nèi)容
  • setSmallIcon(R.mipmap.XXX) 設(shè)置通知顯示的小圖片(這里要注意,如果你設(shè)置的圖片過大的話會拋出一個異常)這里注意小圖標必須有,否則不顯示通知
  • setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.XXX)) 設(shè)置通知右下角顯示的圖片,這里面說的是是大圖標,但是我在我的手機上卻顯示在右邊,但是如果你設(shè)置一個較大的圖片的時候,雖然不會報錯,但是不會顯示,當我不去設(shè)置smallIcon的時候,設(shè)置這個的時候整個通知欄都不顯示了.其實當只設(shè)置smallIcon沒有設(shè)置LargeIcon的時候,SmallIcon的圖標將會出現(xiàn)在LargeIcon的位置,而小圖標的位置將不會有圖標,但兩者同時設(shè)置的時候LargeIcon將會出現(xiàn)在LargeIcon位置,SmallIcon也會出現(xiàn)在SmallIcon的位置.
  • setTicker("") 設(shè)置狀態(tài)欄的提示內(nèi)容
  • setContentIntent(pendingIntent) 設(shè)置通知欄點擊既執(zhí)行的意圖,和Intent的作用類似,但是寫法不同.
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,XXX.class), 0);
    
    
    這里說明下里面的參數(shù):
    • 參數(shù)1 上下文
    • 參數(shù)2 請求碼
    • 參數(shù)3 intent對象
    • 參數(shù)4 這個是一個flag表示位,會有一下幾種
      • FLAG_ONE_SHOT 表示這個意圖只可以使用一次,后續(xù)的通知單擊后無法打開
      • FLAG_NO_CREATE 發(fā)現(xiàn)已經(jīng)存在時,忽略新的請求,繼續(xù)使用老的,日常開發(fā)中很少使用
      • FLAG_CANCEL_CURRENT 如果新請求的PendingIntent發(fā)現(xiàn)已經(jīng)存在時,取消已經(jīng)存在的,用心的替換老的
      • FLAG_UPDATE_CURRENT 如果新情求的PendingIntent發(fā)現(xiàn)已經(jīng)存在時,如果Intent有字段改變了,就更新已存在的PendingIntent
  • setNumber(int) 設(shè)置通知及和的數(shù)量(沒見到別人用過)
  • setWhen(System.currentTImeMillis()) 設(shè)置通知產(chǎn)生的時間,會在通知信息里顯示,一般時系統(tǒng)獲取到的時間,如果不去設(shè)置取系統(tǒng)的時間
  • setPriority(Notification.PRIORITY_DEFAULT) 設(shè)置通知的優(yōu)先級,這個優(yōu)先級是從-2~2 這里設(shè)置的是默認的是0(一般是在廣播中設(shè)置這個屬性),這里寫一下你可以設(shè)置的參數(shù)吧:
    • Notification.PRIORITY_DEFAULT 默認
    • Notification.PRIORITY_HIGH 高
    • Notification.PRIORITY_LOW 低
    • Notification.PRIORITY_MAX 最高
    • Notification.PRIORITY_MIN 最低
  • setAutoCancel(boolean) 用戶點擊該通知,是否關(guān)閉此條通知
  • setOngoning(boolean) 點擊或者側(cè)滑通知,通知是否會消失,一般利用它都是設(shè)置一個正在運行的通知,如音樂播放或者下載進度等一些特殊的場景,要設(shè)置成true
  • setDefaults(Notification.DEFAULT_VIBRATE) 給通知添加聲音,閃燈和震動效果,可以組合使用,具體參數(shù)為
    • Notification.DEFAULT_VIBRATE 添加默認震動提醒
    • Notification.DEFAULT_SOUND 添加默認聲音提醒
    • Notification.DEFAULT_LIGHTS 添加默認三色燈提醒
    • Notification.DEFAULT_ALL 添加默認以上3種全部提醒
  • setVibrate(long[] pattern) 設(shè)置自定義震動模式 如:setVibrate(new long[] {0,200,200,300});//延遲0秒,然后震動200ms,在延遲200ms,接著震動300ms
  • setLights(int RGB,int onTime,int lowLight) 設(shè)置自定義燈光,這里說明一下參數(shù)和注意事項
    • 參數(shù)1: RGB燈光顏色
    • 參數(shù)2: 亮持續(xù)的時間
    • 參數(shù)3: 暗持續(xù)的時間
    • 注意: 只有在設(shè)置了標識符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒
  • setSound(Uri music) 設(shè)置自定義音樂 如:setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
  • setProgress(int max,int progress,boolean indeterminare) 設(shè)置帶進度條的通知,這里說一下參數(shù)3,代表進度是否確定,當確定的時候是具體的progress,但是不確定的時候是連續(xù)的短線.
  • addAction(int icon, CharSequence title, PendingIntent intent) 添加一個點擊后出現(xiàn)的按鈕,添加多了會出現(xiàn)一排圖標,最多可以添加5個.并且每個都能設(shè)置相應(yīng)的點擊事件.這個最好看后面的3.2講的內(nèi)容,說下參數(shù),參數(shù)1:圖標的資源id,參數(shù)2:圖標顯示的名稱,參數(shù)3:圖標對應(yīng)要啟動的PendingIntent

2.2當你創(chuàng)建通知的時候會使用到Notification.常用到的方法如下:

當你使用builder構(gòu)建出一個Notification的時候,也可以更改一些參數(shù):
notification.flags = Notification.FLAG_AUTO_CANCEL; 設(shè)置提醒標識符,具體參數(shù):

  • 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ù)

3.進階使用

3.1 自定義的通知欄效果(RemoteViews)

Notification的自定義布局是RemoteViews,和其他RemoteViews一樣,在自定義視圖布局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控件,不支持這些類的子類或Android提供的其他控件。否則會引起ClassNotFoundException異常

一般的步驟如下:

  1. 創(chuàng)建自定義視圖
  2. 獲取遠程視圖對象
  3. 設(shè)置PendingIntent來相應(yīng)事件
  4. 發(fā)起Notification

3.1.1自定義帶按鈕的通知欄

  • 創(chuàng)建自定義視圖,這里的布局就是一個隨便的布局,但是其實你寫太大也沒有用,這個后面講.

    RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button);
    
  • 獲取遠程視圖對象
    這里說明一下,前面那個ID是視圖中定義的ID,其實這里設(shè)置所有內(nèi)容,都需要根據(jù)ID匹配,然后進行設(shè)置的,也算是提供的方法了,這里就不要去糾結(jié)了.

    • 設(shè)置圖片

      remoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_launcher_background);
      
    • 設(shè)置監(jiān)聽事件

      remoteViews.setOnClickPendingIntent(R.id.btn_1, pendingIntent);
      
  • 設(shè)置相應(yīng)的pendingIntent,其實和上面設(shè)置PendingIntent的方法一樣,這里就不去寫了.

  • 發(fā)起Notification

            Notification notification = builder.setContent(remoteViews)
                    .setWhen(System.currentTimeMillis())
                    .setTicker("正在播放")
                    .setSmallIcon(R.drawable.ic_stat_name)
                    .build();
            notification.flags = Notification.FLAG_AUTO_CANCEL;
    
            mManager.notify(2, notification);
    

其實別的方法都差不多,就是這里注意一下涉及資源的時候,其他的都是一樣的.

3.1.2不帶按鈕的通知欄

其實和上面的都差不多,只是沒有的相應(yīng)的PendingIntent,多了一個設(shè)置文字的方法,這里就直接貼代碼了!

        //先設(shè)定RemoteViews  
        RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.custom);  
        //設(shè)置對應(yīng)IMAGEVIEW的ID的資源圖片  
        view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);  
        view_custom.setTextViewText(R.id.custom_title, "標題");  
        view_custom.setTextViewText(R.id.custom_content, "顯示的內(nèi)容"); 

3.2大圖風(fēng)格通知(4.1之前的版本不支持此功能)

只有在通知欄被展開時顯示,何時展開呢?通知欄處在頂端,或者用戶通過手勢展開的時候顯示.分為幾種效果,但是寫法其實都差不多,下面說說這幾種風(fēng)格,其實這些風(fēng)格,比普通視圖多出一個詳情區(qū)域!

  • NotificationCompat.BigPictureStyle 大圖片風(fēng)格:詳情區(qū)域包含一個256dp高度的位圖
  • NotificationCompat.BigTextStyle 大文字風(fēng)格:顯示一個大的文字塊
  • NotificationCompat.InboxStyle 收件箱風(fēng)格:顯示多行文字
  • NotificationCompat.MediaStyle 音樂風(fēng)格:顯示音樂風(fēng)格(這個風(fēng)格特殊說明一下, 出現(xiàn)的是一些列的圖標,可以給相應(yīng)的圖標設(shè)置相應(yīng)的事件,這些事件是添加到相應(yīng)的NotificationCompat.Builder.setStyle()去添加的,最多可以添加5個),這個類是v7包下的

但是這個詳情區(qū)域出現(xiàn)的方式各不相同,我的手機是按住下拉,有的手機是點擊之后出現(xiàn),有的是直接出現(xiàn),這里自己多嘗試一下就知道了!

3.2.1各個版本中的公共方法和各自的方法

先說一下公共方法!

  • setBigContentTitle("") 大通知欄的標題
  • setSummaryText("") 末尾只一行的文字內(nèi)容

其他都是單獨存在的方法!

  • NotificationCompat.BigPictureStyle
    • bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small)) 添加一張相應(yīng)的圖片
  • NotificationCompat.BigTextStyle
    • bigText() 添加相應(yīng)文字的方法
  • NotificationCompat.InboxStyle
    • addLine("") 直接添加每行的顯示內(nèi)容
      -NotificationCompat.MediaStyle
    • setMediaSession(new MediaSessionCompat(this,"MediaSession",new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
    • setCancelButtonIntent(pendingIntent) 在5.0以下有效,設(shè)置取消后的意圖
    • setShowCancelButton(boolean) 會在通知欄的右上部分顯示一個刪除圖標5.0一下有效
    • setShowActionInCompactView(2,3) 添加action所在的action組的數(shù)組的下標,從0開始,低版本上也可以顯示

這個我覺得應(yīng)該貼一下代碼了!

    private void mediaStyle(){
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle("MediaStyle");
        builder.setContentText("Song Title");
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
        builder.setDefaults(NotificationCompat.DEFAULT_ALL);
        Intent intent = new Intent(this,ImageActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
        builder.setContentIntent(pIntent);
        //第一個參數(shù)是圖標資源id 第二個是圖標顯示的名稱,第三個圖標點擊要啟動的PendingIntent
        builder.addAction(R.drawable.ic_previous_white,"",null);
        builder.addAction(R.drawable.ic_stop_white,"",null);
        builder.addAction(R.drawable.ic_play_arrow_white_18dp,"",pIntent);
        builder.addAction(R.drawable.ic_next_white,"",null);
        NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
        style.setMediaSession(new MediaSessionCompat(this,"MediaSession",
                new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
        //CancelButton在5.0以下的機器有效
        style.setCancelButtonIntent(pIntent);
        style.setShowCancelButton(true);
        //設(shè)置要現(xiàn)實在通知右方的圖標 最多三個
        style.setShowActionsInCompactView(2,3);
        builder.setStyle(style);
        builder.setShowWhen(false);
        Notification notification = builder.build();
        manger.notify(TYPE_Media,notification);
    }

最后通過NotificationCompat.Builder.setStyle()設(shè)置進去就可以了

4.類似與QQ的在手機屏幕頂端出現(xiàn)的通知(只有在5.0以上系統(tǒng)中有效哦)

NotificationCompat.Builder.setFullScreenIntent(pIntent,true);

4.常見的問題

4.1如何取消掉通知欄上的通知

  1. 設(shè)置相應(yīng)的flags = FLAG_AUTO_CANCEL
  2. 通過手動調(diào)用NotificationManager.cancle()方法關(guān)閉指定的通知或者通過NotificationManager.cancleAll()關(guān)閉所有通知.

關(guān)于常見的問題,等到以后用到的時候在去好好總結(jié)以下,現(xiàn)在總結(jié)的話或許會不那么完全,當你讀到這篇文章后,要是有什么問題請和我聯(lián)系,我會及時幫助你解決的,也能促進自己的提高...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容