android: 使用通知

8.1   使用通知android

 

通知(Notification)是 Android 系統中比較有特點的一個功能,當某個應用程序但願向 用戶發出一些提示信息,而該應用程序又不在前臺運行時,就能夠藉助通知來實現。發出一 條通知後,手機最上方的狀態欄中會顯示一個通知的圖標,下拉狀態欄後能夠看到通知的詳 細內容。Android 的通知功能得到了大量用戶的承認和喜好,就連 iOS 系統也在 5.0 版本之 後加入了相似的功能。數組

 

8.1.1    通知的基本用法app

 

瞭解了通知的基本概念,下面咱們就來看一下通知的使用方法吧。通知的用法仍是比較 靈活的,既能夠在活動裏建立,也能夠在廣播接收器裏建立,固然還能夠在下一章中咱們即 將學習的服務裏建立。相比於廣播接收器和服務,在活動裏建立通知的場景仍是比較少的, 由於通常只有當程序進入到後臺的時候咱們才須要使用通知。ide

不過,不管是在哪裏建立通知,總體的步驟都是相同的,下面咱們就來學習一下建立通 知的詳細步驟。首先須要一個 NotificationManager 來對通知進行管理,能夠調用 Context 的 getSystemService()方法獲取到。getSystemService()方法接收一個字符串參數用於肯定獲取系 統 的 哪 個 服 務 , 這 裏 我 們 傳 入 Context.NOTIFICATION_SERVICE 即 可 。 因 此 , 獲 取NotificationManager 的實例就能夠寫成:函數

 NotificationManager manager = (NotificationManager)佈局

 getSystemService(Context.NOTIFICATION_SERVICE);學習

接下來須要建立一個 Notification 對象,這個對象用於存儲通知所需的各類信息,咱們 可使用它的有參構造函數來進行建立。Notification 的有參構造函數接收三個參數,第一個 參數用於指定通知的圖標,好比項目的 res/drawable 目錄下有一張 icon.png 圖片,那麼這裏 就能夠傳入 R.drawable.icon。第二個參數用於指定通知的 ticker 內容,當通知剛被建立的時 候,它會在系統的狀態欄一閃而過,屬於一種瞬時的提示信息。第三個參數用於指定通知被 建立的時間,以毫秒爲單位,當下拉系統狀態欄時,這裏指定的時間會顯示在相應的通知上。 所以,建立一個 Notification 對象就能夠寫成:優化

 Notification notification = new Notification(R.drawable.icon, "This is ticker text", System.currentTimeMillis());this

建立好了 Notification 對象後,咱們還須要對通知的佈局進行設定,這裏只須要調用 Notification 的 setLatestEventInfo()方法就能夠給通知設置一個標準的佈局。這個方法接收四 個參數,第一個參數是 Context,這個沒什麼好解釋的。第二個參數用於指定通知的標題內 容,下拉系統狀態欄就能夠看到這部份內容。第三個參數用於指定通知的正文內容,一樣下 拉系統狀態欄就能夠看到這部份內容。第四個參數咱們暫時還用不到,能夠先傳入 null。因 此,對通知的佈局進行設定就能夠寫成:3d

 notification.setLatestEventInfo(context, "This is content title", "This is content text", null);

以上工做都完成以後,只須要調用 NotificationManager 的 notify()方法就可讓通知顯示 出來了。notify()方法接收兩個參數,第一個參數是 id,要保證爲每一個通知所指定的 id 都是 不一樣的。第二個參數則是 Notification 對象,這裏直接將咱們剛剛建立好的 Notification 對象 傳入便可。所以,顯示一個通知就能夠寫成:

 manager.notify(1, notification);

到這裏就已經把建立通知的每個步驟都分析完了,下面就讓咱們經過一個具體的例子 來看一看通知究竟是長什麼樣的。

新建一個 NotificationTest 項目,並修改 activity_main.xml 中的代碼,以下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

 

 

 

android:orientation="vertical" >

 

 

<Button android:id="@+id/send_notice" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send notice"

/>

 

 

</LinearLayout>

佈局文件很是簡單,裏面只有一個 Send notice 按鈕,用於發出一條通知。接下來修改

MainActivity 中的代碼,以下所示:

 

public class MainActivity extends Activity implements OnClickListener {

 

 

private Button sendNotice;

 

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

sendNotice = (Button) findViewById(R.id.send_notice);

sendNotice.setOnClickListener(this);

}

 

 

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.send_notice:

NotificationManager manager = (NotificationManager)

getSystemService(NOTIFICATION_SERVICE);

Notification notification = new Notification(R.drawable. ic_launcher, "This is ticker text", System.currentTimeMillis());

notification.setLatestEventInfo(this, "This is content title",

"This is content text", null); manager.notify(1, notification); break;

default:

break;

}

}

 

 

 

 

}

能夠看到,咱們在 Send notice 按鈕的點擊事件裏面完成了通知的建立工做,建立的過程 正如前面所描述的同樣。如今就能夠來運行一下程序了,點擊 Send notice 按鈕,就會看到有 一條通知在系統狀態欄顯示出來,如圖 8.1 所示。

 

圖   8.1

下拉系統狀態欄能夠看到該通知的詳細信息,如圖 8.2 所示。

 

圖   8.2

 

若是你使用過 Android 手機,此時應該會下意識地認爲這條通知是能夠點擊的。可是當 你去點擊它的時候,你會發現沒有任何效果。不對啊,好像每條通知點擊以後都應該會有反 應的呀?其實要想實現通知的點擊效果,咱們還須要在代碼中進行相應的設置,這就涉及到 了一個新的概念,PendingIntent。

PendingIntent 從名字上看起來就和 Intent 有些相似,它們之間也確實存在着很多共同點。 好比它們均可以去指明某一個「意圖」,均可以用於啓動活動、啓動服務以及發送廣播等。 不一樣的是,Intent 更加傾向於去當即執行某個動做,而 PendingIntent 更加傾向於在某個合適 的時機去執行某個動做。因此,也能夠把 PendingIntent 簡單地理解爲延遲執行的 Intent。

PendingIntent 的用法一樣很簡單,它主要提供了幾個靜態方法用於獲取 PendingIntent 的 實例,能夠根據需求來選擇是使用 getActivity()方法、getBroadcast()方法、仍是 getService() 方法。這幾個方法所接收的參數都是相同的,第一個參數依舊是 Context,不用多作解釋。 第二個參數通常用不到,一般都是傳入 0 便可。第三個參數是一個 Intent 對象,咱們能夠通 過這個對象構建出 PendingIntent 的「意圖」。第四個參數用於肯定 PendingIntent 的行爲,有 FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_ CURRENT 這四種值可選,每種值的含義你能夠查看文檔,我就不一一進行解釋了。

對 PendingIntent 有 了 一 定 的 了 解 後 , 我 們 再 回 過 頭 來 看 一 下 Notification 的 setLatestEventInfo()方法。剛纔咱們將 setLatestEventInfo()方法的第四個參數忽略掉了,直接 傳入了 null,如今仔細觀察一下,發現第四個參數正是一個 PendingIntent 對象。所以,這裏 就能夠經過 PendingIntent 構建出一個延遲執行的「意圖」,當用戶點擊這條通知時就會執行 相應的邏輯。

如今咱們來優化一下 NotificationTest 項目,給剛纔的通知加上點擊功能,讓用戶點擊它 的時候能夠啓動另外一個活動。

首先須要準備好另外一個活動,這裏新建佈局文件 notification_layout.xml,代碼以下所示:

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="24sp"

android:text="This is notification layout"

/>

 

 

 

 

</RelativeLayout>

佈局文件的內容很是簡單,只有一個居中顯示的 TextView,用於展現一段文本信息。然 後新建 NotificationActivity 繼承自 Activity,在這裏加載剛纔定義的佈局文件,代碼以下所示:

 

public class NotificationActivity extends Activity {

 

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.notification_layout);

}

 

 

}

接着修改 AndroidManifest.xml 中的代碼,在裏面加入 NotificationActivity 的註冊聲明, 以下所示:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationtest"

android:versionCode="1"

android:versionName="1.0" >

……

<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >

……

<activity android:name=".NotificationActivity" >

</activity>

</application>

 

 </manifest>

這樣就把 NotificationActivity 這個活動準備好了,下面咱們修改 MainActivity 中的代碼, 給通知加入點擊功能,以下所示:

 

public class MainActivity extends Activity implements OnClickListener {

……

@Override

public void onClick(View v) {

 

 

 

switch (v.getId()) {

case R.id.send_notice:

NotificationManager manager = (NotificationManager)

getSystemService(NOTIFICATION_SERVICE);

Notification notification = new Notification(R.drawable. ic_launcher, "This is ticker text", System.currentTimeMillis());

Intent intent = new Intent(this, NotificationActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent,

PendingIntent.FLAG_CANCEL_CURRENT);

notification.setLatestEventInfo(this, "This is content title", "This is content text", pi);

manager.notify(1, notification);

break;

default:

break;

}

}

 

}

能夠看到,這裏先是使用 Intent 表達出咱們想要啓動 NotificationActivity 的「意圖」,然 後將構建好的 Intent 對象傳入到 PendingIntent 的 getActivity()方法裏,以獲得 PendingIntent 的實例,接着把它做爲第四個參數傳入到 Notification 的 setLatestEventInfo()方法中。

如今從新運行一下程序,並點擊 Send notice 按鈕,依舊會發出一條通知。而後下拉系統 狀態欄,點擊一下該通知,就會看到 NotificationActivity 這個活動的界面了,如圖 8.3 所示。

 

圖   8.3

 

咦?怎麼系統狀態上的通知圖標尚未消失呢?是這樣的,若是咱們沒有在代碼中對該 通知進行取消,它就會一直顯示在系統的狀態欄上顯示。解決的方法也很簡單,調用 NotificationManager 的 cancel()方法就能夠取消通知了。修改 NotificationActivity 中的代碼, 以下所示:

 

public class NotificationActivity extends Activity {

 

 

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification_layout); NotificationManager manager = (NotificationManager)

getSystemService(NOTIFICATION_SERVICE);

manager.cancel(1);

}

 

 

}

能夠看到,這裏咱們在 cancel()方法中傳入了 1,這個 1 是什麼意思呢?還記得在建立通 知的時候給每條通知指定的 id 嗎?當時咱們給這條通知設置的 id 就是 1。所以,若是你想 要取消哪一條通知,就在 cancel()方法中傳入該通知的 id 就好了。

 

8.1.2    通知的高級技巧

 

如今你已經掌握了建立和取消通知的方法,而且知道了如何去響應通知的點擊事件。不 過通知的用法並不只僅是這些呢,那麼本節中咱們就來探究一下通知更多的高級技巧。

觀察 Notification 這個類,你會發現裏面還有不少咱們沒有使用過的屬性。先來看看 sound 這個屬性吧,它能夠在通知發出的時候播放一段音頻,這樣就可以更好地告知用戶有通知到 來。sound 這個屬性是一個 Uri 對象,因此在指定音頻文件的時候還須要先獲取到音頻文件 對應的 URI。好比說,咱們手機的/system/media/audio/ringtones 目錄下有一個 Basic_tone.ogg 音頻文件,那麼在代碼中這樣就能夠這樣指定:

 

Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/ Basic_tone.ogg"));

notification.sound = soundUri;

除了容許播放音頻外,咱們還能夠在通知到來的時候讓手機進行振動,使用的是 vibrate

這個屬性。它是一個長整型的數組,用於設置手機靜止和振動的時長,以毫秒爲單位。下標爲 0 的值表示手機靜止的時長,下標爲 1 的值表示手機振動的時長,下標爲 2 的值又表示手

機靜止的時長,以此類推。因此,若是想要讓手機在通知到來的時候馬上振動 1 秒,而後靜 止 1 秒,再振動 1 秒,代碼就能夠寫成:

 

long[] vibrates = {0, 1000, 1000, 1000}; notification.vibrate = vibrates; 不過,想要控制手機振動還須要聲明權限的。所以,咱們還得編輯 AndroidManifest.xml文件,加入以下聲明:

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationtest"

android:versionCode="1"

android:versionName="1.0" >

……

<uses-permission android:name="android.permission.VIBRATE" />

……

</manifest>

學會了控制通知的聲音和振動,下面咱們來看一下如何在通知到來時控制手機 LED 燈 的顯示。

如今的手機基本上都會前置一個 LED 燈,當有未接電話或未讀短信,而此時手機又處 於鎖屏狀態時,LED 燈就會不停地閃爍,提醒用戶去查看。咱們可使用 ledARGB、ledOnMS、 ledOffMS 以及 flags 這幾個屬性來實現這種效果。ledARGB 用於控制 LED 燈的顏色,通常 有紅綠藍三種顏色可選。ledOnMS 用於指定 LED 燈亮起的時長,以毫秒爲單位。ledOffMS 用於指定 LED 燈暗去的時長,也是以毫秒爲單位。flags 可用於指定通知的一些行爲,其中 就包括顯示 LED 燈這一選項。因此,當通知到來時,若是想要實現 LED 燈以綠色的燈光一 閃一閃的效果,就能夠寫成:

 

notification.ledARGB = Color.GREEN; notification.ledOnMS = 1000; notification.ledOffMS = 1000;

notification.flags = Notification.FLAG_SHOW_LIGHTS;

固然,若是你不想進行那麼多繁雜的設置,也能夠直接使用通知的默認效果,它會根據 當前手機的環境來決定播放什麼鈴聲,以及如何振動,寫法以下:

 

notification.defaults = Notification.DEFAULT_ALL;

注意,以上所涉及的這些高級技巧都要在手機上運行才能看獲得效果,模擬器是沒法表 現出振動、以及 LED 燈閃爍等功能的。

相關文章
相關標籤/搜索