Android中通知的使用

不怕跌倒,所以飛翔

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

本文主要知識點概要:

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

1. 簡單使用

  • 創建一個NotificationManager對通知進行管理
  • 通過一個構建器來創建一個Notification對象

1.1創建一個NotificationManager對象

NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

通過NotificationManager來管理通知內容;

1.2創建一個Notification對象

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

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

        mManager.notify(1,notification);

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

2.一些常用的設置方法

2.1當你創建通知的時候會使用到NotificationCompat來構建一個通知.常用到的方法如下:

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

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

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

  • 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.進階使用

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

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

一般的步驟如下:

  1. 創建自定義視圖
  2. 獲取遠程視圖對象
  3. 設置PendingIntent來相應事件
  4. 發起Notification

3.1.1自定義帶按鈕的通知欄

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

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

    • 設置圖片

      remoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_launcher_background);
      
    • 設置監聽事件

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

  • 發起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不帶按鈕的通知欄

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

        //先設定RemoteViews  
        RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.custom);  
        //設置對應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, "顯示的內容"); 

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

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

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

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

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

先說一下公共方法!

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

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

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

這個我覺得應該貼一下代碼了!

    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);
        //第一個參數是圖標資源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);
        //設置要現實在通知右方的圖標 最多三個
        style.setShowActionsInCompactView(2,3);
        builder.setStyle(style);
        builder.setShowWhen(false);
        Notification notification = builder.build();
        manger.notify(TYPE_Media,notification);
    }

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

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

NotificationCompat.Builder.setFullScreenIntent(pIntent,true);

4.常見的問題

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

  1. 設置相應的flags = FLAG_AUTO_CANCEL
  2. 通過手動調用NotificationManager.cancle()方法關閉指定的通知或者通過NotificationManager.cancleAll()關閉所有通知.

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容