Android呼叫訊息欄通知(Notification)

Main-zy發表於2014-08-14

用過安卓的應該對通知欄訊息都很熟悉了,下面是演示通知欄訊息的一個Demo,首先來看一下介面,後面是程式碼,解釋就都放在程式碼裡了.





java程式碼


package jason.notification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
        Button button;int id = 0;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                button = (Button) findViewById(R.id.notify);
                button.setOnClickListener(new OnClickListener() {
                        
                        @Override
                        public void onClick(View arg0) {
                                //獲得通知管理器
                                NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                                //構建一個通知物件(需要傳遞的引數有三個,分別是圖示,標題和 時間)
                                Notification notification = new Notification(R.drawable.ic_launcher,"通知",System.currentTimeMillis());
                                Intent intent = new Intent(MainActivity.this,MainActivity.class);
                                PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);                                                                          notification.setLatestEventInfo(getApplicationContext(), "通知標題", "通知顯示的內容", pendingIntent);
                                notification.flags = Notification.FLAG_AUTO_CANCEL;//點選後自動消失
                                notification.defaults = Notification.DEFAULT_SOUND;//聲音預設
                                manager.notify(id, notification);//發動通知,id由自己指定,每一個Notification對應的唯一標誌
                                //其實這裡的id沒有必要設定,只是為了下面要用到它才進行了設定

                        }
                });
        }
}

對於通知的結構下面有個圖很好的進行了標註



以下是每個部分的說明:
1. 內容標題
2. 大型icon
3. 內容text
4. 內容info
5. 小型icon
6. 釋出通知的時間。你能使用setWhen()設定一個明確的值。

下面再具體的記錄一下其他細節
我們可以為Notification指定它的圖示,標題,時間,提醒方式,點選之後的動作。還能做什麼呢

1、由於每個Notification的ID是唯一的,所以我們可以刪除某些通知:


manager.cancel(id, notification);

2、同理,通過重複傳送相同ID的Notification,我們還可以更新某些通知:

manager.notify(id, new_notification);
3、由於Notification的包裝內容為Intent,我們就可以方便地為通知被點選的觸發的事件傳值:現在回到下面的位置來

PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,new Intent(MainActivity.this,MainActivity.class),0);

注意最後一個“0”,0表示什麼?表示什麼都不做,下次你傳進來的Intent,如果被發現是同一個Intent,則所有通知都保持為同一個Intent,只是新來的Extra被保留了。我們應該期望每個Notification都能幹點不一樣的事情,按上面的方式這樣來,每個具備相同Intent的Notification相互之間,其實是毫無區別的。好,我們來看下除了0以外Android還有什麼設定: 1、PendingIntent.FLAG_UPDATE_CURRENT如果該PendingIntent已經存在,則用新傳入的Intent的Extra更新當前的資料。2、PendingIntent.FLAG_ONE_SHOTsend()只能被執行一次,即是說,假如該通知點選後不消失,那麼再次點選不會發生任何事。3、PendingIntent.FLAG_NO_CREATE如果該PendingIntent不存在,直接返回null而不是建立一個PendingIntent.4、PendingIntent.FLAG_CANCEL_CURRENT如果該PendingIntent已經存在,則在生成新的之前取消當前的。 嗯,明顯都不是我們想要的。 其實答案根本不在PendingIntent包裝上。PendingIntent所做的全部事情都只是對同樣的Intent進行處理,關鍵詞,在於“同樣的”既然每次你開啟的都是同一個Intent,那區分PendingIntent就沒有意義了所以,在Intent定義的時候,你還需要區分Intent推薦方式:intent.setData(Uri.parse("custom://"+System.currentTimeMillis()));
這樣就實現了Intent的區別化,以後每次傳入的Intent都會具備不同的Extra,當然,PendingIntent需要定義為PendingIntent.FLAG_UPDATE_CURRENT 到這個地方,其實還剩下一個問題,很快你就會發現每次點選通知,都正確的彈出你要的Activity,但是之前的開啟的Activity依舊存在方法有二:1、在Activity的onPause()方法體中增加:finish();這樣,在開啟新的Activity的時候,舊的就進入了暫停態,啟動onPause(),然後執行finish(),活動結束
好吧,這是個蠢辦法,請不要使用2、設定Intent:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);是的,這句就夠了,這裡我得說一下Activity的棧機制:我們先來看看Intent的結構new Intent(MainActivity.this,MainActivity.class);第一個引數為產生該意圖(Intent)的活動,這個邏輯再清晰不過了,要做的事情得有個發出的主體第二個引數為該意圖的物件,即是這個意圖是什麼,我們來看看。呃!??這裡沒有物件……是的,我們只有了一個物件的類名,但遠遠不是某個具體的物件,這是反射麼?反射能通過一個類名來找到某個特定的類例項麼? 事實如下:Android有一個棧機制,每個產生的活動在過了產生期後,都會進入這個棧,新的活動壓著舊的活動,每一次尋找類名的時候,都預設提取的是棧頂的活動。這也是為什麼Android能快捷的執行返回操作。回到原點來,我們為Intent新增:openintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);之後,這個意圖一旦產生,就會自動清除棧頂的活動,即是說,上一個被開啟的活動會被終結掉,於是就實現了沒有兩個相同的活動被同時開啟。

原文:http://www.apkbus.com/android-4875-1.html


相關文章