1. 程式人生 > >Android之動態更新通知欄

Android之動態更新通知欄

我們在QQ專案中實現了通知欄後臺執行,以及來新訊息提示,通常在訊息通知時,我們經常用到兩個元件Toast和Notification。特別是重要的和需要長時間顯示的資訊,用Notification就最合適不過了。當有訊息通知時,狀態列會顯示通知的圖示和文字,通過下拉狀態列,就可以看到通知資訊了,Android這一創新性的UI元件贏得了使用者的一致好評,就連蘋果也開始模仿了。其實有點類似於Windows的托盤顯示。

下面我們就來根據QQ小專案,來具體分析一下。先看下兩張效果圖:


一、通知欄的佈局檔案,在我們這個QQ小專案中,當我們在好友列表的Activity按返回鍵的時候,先作一個程式進入後臺執行的標記(可以是全域性變數,也可以儲存到SharedPreferenced檔案中)

,然後傳送一個廣播,我們通過在服務裡接收這個廣播,就馬上初始化後臺執行的通知欄的view,當新訊息到來時,我們就不把訊息通過廣播發送出去了(因為沒有Activity在執行),而是直接通過更新通知欄來提醒使用者,同時傳送一個通知(帶聲音、帶振動)。下面是我們這個在通知欄的view的佈局檔案notify_view.xml:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width
    ="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="vertical">
  6.     <LinearLayout
  7.         android:layout_width="match_parent"
  8.         android:layout_height="wrap_content"
  9.         android:orientation="vertical"
  10.         android:padding="2dp">
  11.         <RelativeLayout
  12.             android:layout_width="match_parent"
  13.             android:layout_height="wrap_content">
  14.             <ImageView
  15.                 android:id="@+id/notify_imageLog"
  16.                 android:layout_width="40dp"
  17.                 android:layout_height="40dp"
  18.                 android:layout_alignParentLeft="true"
  19.                 android:layout_centerVertical="true"
  20.                 android:paddingLeft="5dp"
  21.                 android:src="@drawable/h001"/>
  22.             <TextView
  23.                 android:id="@+id/notify_name"
  24.                 android:layout_width="wrap_content"
  25.                 android:layout_height="wrap_content"
  26.                 android:layout_centerVertical="true"
  27.                 android:layout_toRightOf="@+id/notify_imageLog"
  28.                 android:paddingLeft="5dp"
  29.                 android:text="name"
  30.                 android:textColor="#000000"
  31.                 android:textSize="20sp"/>
  32.         </RelativeLayout>
  33.         <LinearLayout
  34.             android:layout_width="fill_parent"
  35.             android:layout_height="wrap_content"
  36.             android:layout_gravity="center"
  37.             android:orientation="horizontal">
  38.             <TextView
  39.                 android:id="@+id/notify_msg"
  40.                 android:layout_width="wrap_content"
  41.                 android:layout_height="wrap_content"
  42.                 android:layout_weight="1"
  43.                 android:paddingLeft="15dp"
  44.                 android:text="msg"
  45.                 android:textColor="@color/black"
  46.                 android:textSize="15sp"/>
  47.             <TextView
  48.                 android:id="@+id/notify_time"
  49.                 android:layout_width="wrap_content"
  50.                 android:layout_height="wrap_content"
  51.                 android:layout_weight="1"
  52.                 android:gravity="right"
  53.                 android:paddingRight="15dp"
  54.                 android:text="time"
  55.                 android:textColor="@color/black"
  56.                 android:textSize="15sp"/>
  57.         </LinearLayout>
  58.     </LinearLayout>
  59. </LinearLayout>

二、初始化通知欄view的方法,在GetMsgService中寫一個方法,初始化我們這個通知欄的view:
  1. /** 
  2.      * 建立通知 
  3.      */
  4.     privatevoid setMsgNotification() {  
  5.         int icon = R.drawable.notify;  
  6.         CharSequence tickerText = "";  
  7.         long when = System.currentTimeMillis();  
  8.         mNotification = new Notification(icon, tickerText, when);  
  9.         // 放置在"正在執行"欄目中
  10.         mNotification.flags = Notification.FLAG_ONGOING_EVENT;  
  11.         RemoteViews contentView = new RemoteViews(mContext.getPackageName(),  
  12.                 R.layout.notify_view);  
  13.         contentView.setTextViewText(R.id.notify_name, util.getName());  
  14.         contentView.setTextViewText(R.id.notify_msg, "手機QQ正在後臺執行");  
  15.         contentView.setTextViewText(R.id.notify_time, MyDate.getDate());  
  16.         // 指定個性化檢視
  17.         mNotification.contentView = contentView;  
  18.         Intent intent = new Intent(this, FriendListActivity.class);  
  19.         PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0,  
  20.                 intent, PendingIntent.FLAG_UPDATE_CURRENT);  
  21.         // 指定內容意圖
  22.         mNotification.contentIntent = contentIntent;  
  23.         mNotificationManager.notify(Constants.NOTIFY_ID, mNotification);  
  24.     }  


三,好友列表Activity返回按鍵的廣播接收者,使用者按返回鍵傳送廣播,並做好標記,程式進入後臺執行:

  1. // 收到使用者按返回鍵發出的廣播,就顯示通知欄
  2.     private BroadcastReceiver backKeyReceiver = new BroadcastReceiver() {  
  3.         @Override
  4.         publicvoid onReceive(Context context, Intent intent) {  
  5.             // TODO Auto-generated method stub
  6.             Toast.makeText(context, "QQ進入後臺執行"0).show();  
  7.             setMsgNotification();  
  8.         }  
  9.     };  


四,通過handler更新通知欄,我們是通過handler來處理訊息並更新通知欄的:

  1. // 用來更新通知欄訊息的handler
  2.     private Handler handler = new Handler() {  
  3.         publicvoid handleMessage(Message msg) {  
  4.             switch (msg.what) {  
  5.             case MSG:  
  6.                 int newMsgNum = application.getNewMsgNum();// 從全域性變數中獲取
  7.                 newMsgNum++;// 每收到一次訊息,自增一次
  8.                 application.setNewMsgNum(newMsgNum);// 再設定為全域性變數
  9.                 TranObject<TextMessage> textObject = (TranObject<TextMessage>) msg  
  10.                         .getData().getSerializable("msg");  
  11.                 // System.out.println(textObject);
  12.                 if (textObject != null) {  
  13.                     int form = textObject.getFromUser();// 訊息從哪裡來
  14.                     String content = textObject.getObject().getMessage();// 訊息內容
  15.                     ChatMsgEntity entity = new ChatMsgEntity("",  
  16.                             MyDate.getDateEN(), content, -1true);// 收到的訊息
  17.                     messageDB.saveMsg(form, entity);// 儲存到資料庫
  18.                     // 更新通知欄
  19.                     int icon = R.drawable.notify_newmessage;  
  20.                     CharSequence tickerText = form + ":" + content;  
  21.                     long when = System.currentTimeMillis();  
  22.                     mNotification = new Notification(icon, tickerText, when);  
  23.                     mNotification.flags = Notification.FLAG_NO_CLEAR;  
  24.                     // 設定預設聲音
  25.                     mNotification.defaults |= Notification.DEFAULT_SOUND;  
  26.                     // 設定震動(需加VIBRATE許可權)
  27.                     mNotification.defaults |= Notification.DEFAULT_VIBRATE;  
  28.                     mNot