編輯:關於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下拉刷新和上拉加載實現的各種方法大合集。可能在具體的細節邏輯上處理不太到位,但基本上完成邏輯的實現。細節方面,個人可以根據自己的需求進行完善。該博客
工廠模式是一種創建者模式,在任何生成復雜對象的地方都可以使用工廠模式。理論來說在任何使用A a = new A()的方式都可以使用工廠模式,雖然使用工廠模式可能需要多做一
配置AndroidMainfest.xml以友盟渠道為例,渠道信息一般都是寫在 AndroidManifest.xml文件中,代碼大約如下:如果不使用多渠道打包方法,那就
1 背景去年有很多人私信告訴我讓說說自定義控件,其實通觀網絡上的很多博客都在講各種自定義控件,但是大多數都是授之以魚,卻很少有較為系統性授之於漁的文章,同時由