編輯:關於Android編程
通知(Notification)是android系統中比較有特色的一個功能,當某個應用程序希望向用戶發出一些提示信息,而該應用程序又不在前台運行時,就可以借助通知來實現。發出一條通知後,手機最上方的狀態欄會顯示一個通知的圖標,下拉狀態後可以看到通知的詳細內容。
通知的基本用法
通知可以在活動,廣播接收器,和服務裡面創建。無論在哪裡創建通知,整體的步驟都是相同的,下面我們來學習詳細的步驟。
/* * 首先需要一個NotificationManager來對通知進行管理,可以調用Context的getSystemService()方法 * 獲取到。getSystemService方法接收一個字符串參數用於確定獲取系統的哪個服務,這裡我們傳入的 * Context.NOTIFICATION_SERVICE即可。因此獲取NotificationManager的實例就可以寫成: * NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); * 接下來要創建一個Notification對象,這個對象用於存儲通知所需的各種信息,我們使用它的構造函數來進行創建。 * Notification的有參構造函數接收三個參數,第一個參數用於指定通知的圖標,比如項目的res/drawable目錄 * 下有一張ic_launcher圖片,那麼這裡就可以傳入R.drawable.ic_launcher,第二個參數用於指定通知 * 的ticker內容,當通知剛被創建的時候,它會在系統的狀態欄一閃而過,屬於瞬時的提示信息。第三個參數用於 * 指定通知被創建的時間,以毫秒為單位,當下拉系統狀態欄時,這裡指定的時間會顯示在相應的通知上。因此創建 * 一個Notification對象就可以寫成: * Notification notification=new Notification(R.drawable.ic_launcher, "this is ticker text",System.currentTimeMillis()); * 創建好了Notification對象後,我們還需要對通知的布局進行設定,這裡只需要調用Notification的 * setLatestEventInfo()方法就可以給通知設置一個標准布局。這個方法接收四個參數,第一個參數 * 是Context。第二個參數用於指定通知的標題內容,下拉系統狀態欄就可以看到這部分內容。第三個參數用於指定 * 通知的正文內容,同樣下拉系統狀態欄就可以看到這部分內容。第四個參數我們暫時用不到,可以傳入null。因此 * 對通知的布局進行設定就可以寫成: * notification.setLatestEventInfo(this, "this is content title", "this is content text", null); 以上工作都做完了後,只需要調用NotificationManager的notify()方法就可以讓通知顯示出來了。 notify()方法接收2個參數,第一個參數是id,要保證為每個通知所指定的id都是不同的。第二個參數則是 Notification對象,這裡直接將我們剛剛創建好的Notification對象傳入即可。因此,顯示一個通知就可以 寫成: manager.notify(1,notification); * */
package com.jack.notificationtest;
import android.os.Bundle;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.IntentSender.SendIntentException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
/*
* 首先需要一個NotificationManager來對通知進行管理,可以調用Context的getSystemService()方法
* 獲取到。getSystemService方法接收一個字符串參數用於確定獲取系統的哪個服務,這裡我們傳入的
* Context.NOTIFICATION_SERVICE即可。因此獲取NotificationManager的實例就可以寫成:
* NotificationManager manager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
* 接下來要創建一個Notification對象,這個對象用於存儲通知所需的各種信息,我們使用它的構造函數來進行創建。
* Notification的有參構造函數接收三個參數,第一個參數用於指定通知的圖標,比如項目的res/drawable目錄
* 下有一張ic_launcher圖片,那麼這裡就可以傳入R.drawable.ic_launcher,第二個參數用於指定通知
* 的ticker內容,當通知剛被創建的時候,它會在系統的狀態欄一閃而過,屬於瞬時的提示信息。第三個參數用於
* 指定通知被創建的時間,以毫秒為單位,當下拉系統狀態欄時,這裡指定的時間會顯示在相應的通知上。因此創建
* 一個Notification對象就可以寫成:
* Notification notification=new Notification(R.drawable.ic_launcher,
"this is ticker text",System.currentTimeMillis());
* 創建好了Notification對象後,我們還需要對通知的布局進行設定,這裡只需要調用Notification的
* setLatestEventInfo()方法就可以給通知設置一個標准布局。這個方法接收四個參數,第一個參數
* 是Context。第二個參數用於指定通知的標題內容,下拉系統狀態欄就可以看到這部分內容。第三個參數用於指定
* 通知的正文內容,同樣下拉系統狀態欄就可以看到這部分內容。第四個參數我們暫時用不到,可以傳入null。因此
* 對通知的布局進行設定就可以寫成:
* notification.setLatestEventInfo(this, "this is content title",
"this is content text", null);
以上工作都做完了後,只需要調用NotificationManager的notify()方法就可以讓通知顯示出來了。
notify()方法接收2個參數,第一個參數是id,要保證為每個通知所指定的id都是不同的。第二個參數則是
Notification對象,這裡直接將我們剛剛創建好的Notification對象傳入即可。因此,顯示一個通知就可以
寫成:
manager.notify(1,notification);
* */
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 boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.send_notice:
NotificationManager manager=(NotificationManager) getSystemService(Context.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;
}
}
}

下拉系統狀態欄可以看到該通知的詳細信息,如下所示:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20141118/2014111808212566.jpg" alt="\">
上面的通知,我們不能點擊,如果要想實現通知的點擊效果,我們就要在代碼中進行相應的設置,這涉及到了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這四種值可選,每種值的含義,可以自己查詢下。
還記得Notification的setLatestEventInfo()方法。剛才我們將setLatestEventInfo()的第四個參數忽略掉了,直接傳入了null,現在你會發現,第四個參數正是一個PendingIntent對象。因此,這裡就可以通過PendingIntent構建出一個延遲執行的“意圖”,當用戶點擊這條通知時就會執行相應的邏輯。
現在我們來優化下NotificationTest項目,給剛才的通知加上點擊功能,讓用戶點擊它的時候可以啟動另一個活動。
首先需要准備好一個活動,這裡新建布局文件notification_layout.xml,代碼如下所示:
新建NotificationActivity類繼承Activity,加載上面定義的布局,代碼如下所示:
package com.jack.notificationtest;
import android.app.Activity;
import android.os.Bundle;
public class NotificationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
}
}
修改AndroidManifest.xml中的代碼,在裡面加入NotificationActivity的注冊聲明:
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.send_notice:
NotificationManager manager=(NotificationManager) getSystemService(Context.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;
}
}
重新運行下程序,並點擊send notice按鈕,依舊會發出一條通知,讓回下拉系統狀態欄,點擊下該通知,就會看到NotificationActivity這個活動界面了。如下所示:

注意看,你會發現系統狀態上面的圖標還沒有消失,這是為什麼了?這是因為,如果我們沒有在代碼中對該通知進行取消,它會一直在系統的狀態欄上顯示。解決的方法也比較簡單的,調用NotificationManager的cancel()方法就可以取消通知了。修改NotificationActivity中的代碼,如下所示:
package com.jack.notificationtest;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Bundle;
public class NotificationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
NotificationManager manager=(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(1);
/*
* 我們在cancel()方法中傳入了1,這個1是什麼意思了?這是我們給這條通知設置的id就是1。
* 因此如果,你想要取消哪一條通知,就在cancel()方法中傳入該通知的id就行了。
* */
}
}
通知的高級技巧
觀察Notification這個類,你會發現我們還有很多的屬性,沒有使用。先來看看sound這個屬性吧,它可以在通知發出的時候播出一段音頻,這樣就能夠更好地告知用戶有通知到來。sound這個屬性是一個Uri對象,所以在指定音頻文件的時候還需要先獲取音頻文件對應的URI。比如說手機的/system/media/audio/ringtongs目錄下有一個basic_tone.ogg音頻文件,那麼在代碼中這樣就可以這樣指定:
Uri soundUri=Uri.parse(new File("/system/media/audio/ringtongs/basic_tone.ogg"));
notification.sound=soundUri;
除允許播放音頻以外,我們還可以在通知到來的時候讓手機進行震動,使用的是vibrate這個屬性。它是一個長整形的數組,由於設置手機靜止和震動的時長,以毫秒為單位。下標0的值表示手機靜止的時長,下標為1的值表示手機震動的時長,下標為2的值又表示手機靜止的時長,以此類推。所以,如果想要手機在通知到來的時候立刻震動1秒,然後靜止1秒,在震動,代碼就可以寫成:
long[] vibrates={0,1000,1000,1000};
notification.vibrate=vibrates;
不過想要控制手機震動還需要聲明權限,因此,我們還得編輯AndroidManifest.xml文件,加入如下說明:
學會控制通知的聲音和震動,下面我們來看看如何在通知到來的時候控制手機LED燈的顯示。
現在的手機基本上都會前置一個LED燈,當有未接電話或未讀短信,而此時手機又處於鎖屏狀態時LED燈就會不停地閃爍,提醒用戶去查看。我們可以使用ledARGB,ledOnMS,ledOffMS以及flags這幾個屬性來實現這種效果。ledARGB用於控制LED燈的顏色,一般有紅綠藍三種顏色可選。ledOnMS用於指定LED燈亮起的時長,以毫秒為單位。edOffMS由於指定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燈閃爍等功能。
通知就總結到這了額,下面一篇將進行短信的接收與發送總結。
轉載請注明:http://blog.csdn.net/j903829182/article/details/41181277
ListView上拉加載和下拉刷新多種實現方式
該篇為ListView下拉刷新和上拉加載實現的各種方法大合集。可能在具體的細節邏輯上處理不太到位,但基本上完成邏輯的實現。細節方面,個人可以根據自己的需求進行完善。該博客
Android 工廠模式,三種工廠模式的理解
工廠模式是一種創建者模式,在任何生成復雜對象的地方都可以使用工廠模式。理論來說在任何使用A a = new A()的方式都可以使用工廠模式,雖然使用工廠模式可能需要多做一
Android 多渠道打包
配置AndroidMainfest.xml以友盟渠道為例,渠道信息一般都是寫在 AndroidManifest.xml文件中,代碼大約如下:如果不使用多渠道打包方法,那就
深入淺析Android坐標系統
1 背景去年有很多人私信告訴我讓說說自定義控件,其實通觀網絡上的很多博客都在講各種自定義控件,但是大多數都是授之以魚,卻很少有較為系統性授之於漁的文章,同時由