Android開發(fā) -- 狀態(tài)欄通知Notification、NotificationManager詳解
本想自己寫一個(gè)的,但是看到這篇之后,我想還是轉(zhuǎn)過來吧,實(shí)在是非常的詳細(xì):
在Android系統(tǒng)中,發(fā)一個(gè)狀態(tài)欄通知還是很方便的。下面我們就來看一下,怎么發(fā)送狀態(tài)欄通知,狀態(tài)欄通知又有哪些參數(shù)可以設(shè)置?
首先,發(fā)送一個(gè)狀態(tài)欄通知必須用到兩個(gè)類: NotificationManager 、 Notification。
NotificationManager : 是狀態(tài)欄通知的管理類,負(fù)責(zé)發(fā)通知、清楚通知等。
NotificationManager 是一個(gè)系統(tǒng)Service,必須通過 getSystemService()方法來獲取。
Notification:是具體的狀態(tài)欄通知對(duì)象,可以設(shè)置icon、文字、提示聲音、振動(dòng)等等參數(shù)。
下面是設(shè)置一個(gè)通知需要的基本參數(shù):
An icon (通知的圖標(biāo))
A title and expanded message (通知的標(biāo)題和內(nèi)容)
A PendingIntent (點(diǎn)擊通知執(zhí)行頁面跳轉(zhuǎn))
可選的設(shè)置:
A ticker-text message (狀態(tài)欄頂部提示消息)
An alert sound (提示音)
A vibrate setting (振動(dòng))
A flashing LED setting (燈光)
等等
一、創(chuàng)建Notification
通過NotificationManager 的 notify(int, Notification) 方法來啟動(dòng)Notification。
第一個(gè)參數(shù)唯一的標(biāo)識(shí)該Notification,第二個(gè)參數(shù)就是Notification對(duì)象。
二、更新Notification
調(diào)用Notification的 setLatestEventInfo方法來更新內(nèi)容,然后再調(diào)用NotificationManager的notify()方法即可。(具體可以看下面的實(shí)例)
三、刪除Notification
通過NotificationManager 的cancel(int)方法,來清除某個(gè)通知。其中參數(shù)就是Notification的唯一標(biāo)識(shí)ID。
當(dāng)然也可以通過 cancelAll() 來清除狀態(tài)欄所有的通知。
四、Notification設(shè)置(振動(dòng)、鈴聲等)
1. 基本設(shè)置:
//新建狀態(tài)欄通知
//設(shè)置通知在狀態(tài)欄顯示的圖標(biāo)
//通知時(shí)在狀態(tài)欄顯示的內(nèi)容
//通知的默認(rèn)參數(shù) DEFAULT_SOUND, DEFAULT_VIBRATE, DEFAULT_LIGHTS.
//如果要全部采用默認(rèn)值, 用 DEFAULT_ALL.
//此處采用默認(rèn)聲音
//第二個(gè)參數(shù) :下拉狀態(tài)欄時(shí)顯示的消息標(biāo)題 expanded message title
//第三個(gè)參數(shù):下拉狀態(tài)欄時(shí)顯示的消息內(nèi)容 expanded message text
//第四個(gè)參數(shù):點(diǎn)擊該通知時(shí)執(zhí)行頁面跳轉(zhuǎn)
//發(fā)出狀態(tài)欄通知
//The first parameter is the unique ID for the Notification
// and the second is the Notification object.
配一張圖作說明:
2. 添加聲音
如果要采用默認(rèn)聲音,只要使用default就可以了。
如果要使用自定義聲音,那么就要用到sound了。如下:
上面這種方法,使用的是自己的鈴聲,如果想用系統(tǒng)自帶的鈴聲,可以這樣:
[code]notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
需要注意一點(diǎn),如果default、sound同時(shí)出現(xiàn),那么sound無效,會(huì)使用默認(rèn)鈴聲。
默認(rèn)情況下,通知的聲音播放一遍就會(huì)結(jié)束。 如果你想讓聲音循環(huán)播放,需要為flags參數(shù)加上FLAG_INSISTENT。 這樣聲音會(huì)到用戶響應(yīng)才結(jié)束,比如下拉狀態(tài)欄。
3. 添加振動(dòng)
如果是使用默認(rèn)的振動(dòng)方式,那么同樣也是使用default。
當(dāng)然也可以自己定義振動(dòng)形式,這邊需要用到Long型數(shù)組。
notification.vibrate = vibrate;
這邊的Long型數(shù)組中,第一個(gè)參數(shù)是開始振動(dòng)前等待的時(shí)間,第二個(gè)參數(shù)是第一次振動(dòng)的時(shí)間,第三個(gè)參數(shù)是第二次振動(dòng)的時(shí)間,以此類推,隨便定義多長(zhǎng)的數(shù)組。但是采用這種方法,沒有辦法做到重復(fù)振動(dòng)。
同樣,如果default、vibrate同時(shí)出現(xiàn)時(shí),會(huì)采用默認(rèn)形式。
另外還需要注意一點(diǎn):使用振動(dòng)器時(shí)需要權(quán)限,如下:
4. 閃光
使用默認(rèn)的燈光,如下:
自定義:
notification.ledOnMS = 300;
notification.ledOffMS = 1000;
notification.flags |= Notification.FLAG_SHOW_LIGHTS;
其中l(wèi)edARGB 表示燈光顏色、 ledOnMS 亮持續(xù)時(shí)間、ledOffMS 暗的時(shí)間。
注意:這邊的顏色跟設(shè)備有關(guān),不是所有的顏色都可以,要看具體設(shè)備。
5. 其他有用的設(shè)置:
flags:
//讓聲音、振動(dòng)無限循環(huán),直到用戶響應(yīng)
//通知被點(diǎn)擊后,自動(dòng)消失
//點(diǎn)擊'Clear'時(shí),不清楚該通知(QQ的通知無法清除,就是用的這個(gè))
下面附上我做的例子,供大家參考。 里面包括創(chuàng)建通知、更新通知、清除通知、設(shè)置自定義鈴聲、自定義振動(dòng)、自定義通知視圖等。
附上代碼:
主類:
package com.yfz; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore.Audio; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RemoteViews; import android.widget.SeekBar; import android.widget.TextView; /** * Notification * @author Administrator * */ public class Lesson_10 extends Activity { //BaseNotification private Button bt01; //UpdateBaseNotification private Button bt02; //ClearBaseNotification private Button bt03; //MediaNotification private Button bt04; //ClearMediaNotification private Button bt05; //ClearALL private Button bt06; //CustomNotification private Button bt07; //通知管理器 private NotificationManager nm; //通知顯示內(nèi)容 private PendingIntent pd; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*加載頁面*/ setContentView(R.layout.lesson10); init(); } private void init() { bt01 = (Button)findViewById(R.id.le10bt01); bt02 = (Button)findViewById(R.id.le10bt02); bt03 = (Button)findViewById(R.id.le10bt03); bt04 = (Button)findViewById(R.id.le10bt04); bt05 = (Button)findViewById(R.id.le10bt05); bt06 = (Button)findViewById(R.id.le10bt06); bt07 = (Button)findViewById(R.id.le10bt07); bt01.setOnClickListener(onclick); bt02.setOnClickListener(onclick); bt03.setOnClickListener(onclick); bt04.setOnClickListener(onclick); bt05.setOnClickListener(onclick); bt06.setOnClickListener(onclick); bt07.setOnClickListener(onclick); nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Intent intent = new Intent(this,Lesson_10.class); pd = PendingIntent.getActivity(Lesson_10.this, 0, intent, 0); } OnClickListener onclick = new OnClickListener() { //BASE Notification ID private int Notification_ID_BASE = 110; private Notification baseNF; //Notification ID private int Notification_ID_MEDIA = 119; private Notification mediaNF; @Override public void onClick(View v) { switch(v.getId()) { case R.id.le10bt01: //新建狀態(tài)欄通知 baseNF = new Notification(); //設(shè)置通知在狀態(tài)欄顯示的圖標(biāo) baseNF.icon = R.drawable.icon; //通知時(shí)在狀態(tài)欄顯示的內(nèi)容 baseNF.tickerText = "You clicked BaseNF!"; //通知的默認(rèn)參數(shù) DEFAULT_SOUND, DEFAULT_VIBRATE, DEFAULT_LIGHTS. //如果要全部采用默認(rèn)值, 用 DEFAULT_ALL. //此處采用默認(rèn)聲音 baseNF.defaults |= Notification.DEFAULT_SOUND; baseNF.defaults |= Notification.DEFAULT_VIBRATE; baseNF.defaults |= Notification.DEFAULT_LIGHTS; //讓聲音、振動(dòng)無限循環(huán),直到用戶響應(yīng) baseNF.flags |= Notification.FLAG_INSISTENT; //通知被點(diǎn)擊后,自動(dòng)消失 baseNF.flags |= Notification.FLAG_AUTO_CANCEL; //點(diǎn)擊'Clear'時(shí),不清楚該通知(QQ的通知無法清除,就是用的這個(gè)) baseNF.flags |= Notification.FLAG_NO_CLEAR; //第二個(gè)參數(shù) :下拉狀態(tài)欄時(shí)顯示的消息標(biāo)題 expanded message title //第三個(gè)參數(shù):下拉狀態(tài)欄時(shí)顯示的消息內(nèi)容 expanded message text //第四個(gè)參數(shù):點(diǎn)擊該通知時(shí)執(zhí)行頁面跳轉(zhuǎn) baseNF.setLatestEventInfo(Lesson_10.this, "Title01", "Content01", pd); //發(fā)出狀態(tài)欄通知 //The first parameter is the unique ID for the Notification // and the second is the Notification object. nm.notify(Notification_ID_BASE, baseNF); break; case R.id.le10bt02: //更新通知 //比如狀態(tài)欄提示有一條新短信,還沒來得及查看,又來一條新短信的提示。 //此時(shí)采用更新原來通知的方式比較。 //(再重新發(fā)一個(gè)通知也可以,但是這樣會(huì)造成通知的混亂,而且顯示多個(gè)通知給用戶,對(duì)用戶也不友好) baseNF.setLatestEventInfo(Lesson_10.this, "Title02", "Content02", pd); nm.notify(Notification_ID_BASE, baseNF); break; case R.id.le10bt03: //清除 baseNF nm.cancel(Notification_ID_BASE); break; case R.id.le10bt04: mediaNF = new Notification(); mediaNF.icon = R.drawable.icon; mediaNF.tickerText = "You clicked MediaNF!"; //自定義聲音 mediaNF.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); //通知時(shí)發(fā)出的振動(dòng) //第一個(gè)參數(shù): 振動(dòng)前等待的時(shí)間 //第二個(gè)參數(shù): 第一次振動(dòng)的時(shí)長(zhǎng)、以此類推 long[] vir = {0,100,200,300}; mediaNF.vibrate = vir; mediaNF.setLatestEventInfo(Lesson_10.this, "Title03", "Content03", pd); nm.notify(Notification_ID_MEDIA, mediaNF); break; case R.id.le10bt05: //清除 mediaNF nm.cancel(Notification_ID_MEDIA); break; case R.id.le10bt06: nm.cancelAll(); break; case R.id.le10bt07: //自定義下拉視圖,比如下載軟件時(shí),顯示的進(jìn)度條。 Notification notification = new Notification(); notification.icon = R.drawable.icon; notification.tickerText = "Custom!"; RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom); contentView.setImageViewResource(R.id.image, R.drawable.icon); contentView.setTextViewText(R.id.text, "Hello, this message is in a custom expanded view"); notification.contentView = contentView; //使用自定義下拉視圖時(shí),不需要再調(diào)用setLatestEventInfo()方法 //但是必須定義 contentIntent notification.contentIntent = pd; nm.notify(3, notification); break; } } }; }
主頁面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android:id="@+id/le10bt01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="BaseNotification" /> <Button android:id="@+id/le10bt02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="UpdateBaseNotification" /> <Button android:id="@+id/le10bt03" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ClearBaseNotification" /> <Button android:id="@+id/le10bt04" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="MediaNotification" /> <Button android:id="@+id/le10bt05" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ClearMediaNotification" /> <Button android:id="@+id/le10bt06" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ClearALL" /> <Button android:id="@+id/le10bt07" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="CustomNotification" /> </LinearLayout>
自定義視圖頁面:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="3dp" > <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_marginRight="10dp" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:textColor="#000" /> </LinearLayout>
- Android中通知Notification使用實(shí)例(振動(dòng)、燈光、聲音)
- Android中通過Notification&NotificationManager實(shí)現(xiàn)消息通知
- android使用NotificationListenerService監(jiān)聽通知欄消息
- Android 中Notification彈出通知實(shí)現(xiàn)代碼
- Android 通知使用權(quán)(NotificationListenerService)的使用
- Android使用Notification在狀態(tài)欄上顯示通知
- android中創(chuàng)建通知欄Notification代碼實(shí)例
- Android中AlarmManager+Notification實(shí)現(xiàn)定時(shí)通知提醒功能
- Android種使用Notification實(shí)現(xiàn)通知管理以及自定義通知欄實(shí)例(示例四)
- Android使用Notification實(shí)現(xiàn)通知功能
相關(guān)文章
Flutter實(shí)現(xiàn)編寫富文本Text的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何通過Flutter實(shí)現(xiàn)編寫富文本Text,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11android實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能 帶多音字識(shí)別
這篇文章主要介紹了android實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能,帶多音字識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02android根據(jù)分辨率自動(dòng)調(diào)整字體大小的實(shí)例代碼
android根據(jù)分辨率自動(dòng)調(diào)整字體大小的實(shí)例代碼,需要的朋友可以參考一下2013-06-06