Android之動態更新通知欄
阿新 • • 發佈:2019-01-18
我們在QQ專案中實現了通知欄後臺執行,以及來新訊息提示,通常在訊息通知時,我們經常用到兩個元件Toast和Notification。特別是重要的和需要長時間顯示的資訊,用Notification就最合適不過了。當有訊息通知時,狀態列會顯示通知的圖示和文字,通過下拉狀態列,就可以看到通知資訊了,Android這一創新性的UI元件贏得了使用者的一致好評,就連蘋果也開始模仿了。其實有點類似於Windows的托盤顯示。
下面我們就來根據QQ小專案,來具體分析一下。先看下兩張效果圖:
一、通知欄的佈局檔案,在我們這個QQ小專案中,當我們在好友列表的Activity按返回鍵的時候,先作一個程式進入後臺執行的標記(可以是全域性變數,也可以儲存到SharedPreferenced檔案中)
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
android:layout_width
- android:layout_height="match_parent"
- android:orientation="vertical">
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="2dp">
-
<RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <ImageView
- android:id="@+id/notify_imageLog"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:paddingLeft="5dp"
- android:src="@drawable/h001"/>
- <TextView
- android:id="@+id/notify_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerVertical="true"
- android:layout_toRightOf="@+id/notify_imageLog"
- android:paddingLeft="5dp"
- android:text="name"
- android:textColor="#000000"
- android:textSize="20sp"/>
- </RelativeLayout>
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="horizontal">
- <TextView
- android:id="@+id/notify_msg"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:paddingLeft="15dp"
- android:text="msg"
- android:textColor="@color/black"
- android:textSize="15sp"/>
- <TextView
- android:id="@+id/notify_time"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:gravity="right"
- android:paddingRight="15dp"
- android:text="time"
- android:textColor="@color/black"
- android:textSize="15sp"/>
- </LinearLayout>
- </LinearLayout>
- </LinearLayout>
二、初始化通知欄view的方法,在GetMsgService中寫一個方法,初始化我們這個通知欄的view:
- /**
- * 建立通知
- */
- privatevoid setMsgNotification() {
- int icon = R.drawable.notify;
- CharSequence tickerText = "";
- long when = System.currentTimeMillis();
- mNotification = new Notification(icon, tickerText, when);
- // 放置在"正在執行"欄目中
- mNotification.flags = Notification.FLAG_ONGOING_EVENT;
- RemoteViews contentView = new RemoteViews(mContext.getPackageName(),
- R.layout.notify_view);
- contentView.setTextViewText(R.id.notify_name, util.getName());
- contentView.setTextViewText(R.id.notify_msg, "手機QQ正在後臺執行");
- contentView.setTextViewText(R.id.notify_time, MyDate.getDate());
- // 指定個性化檢視
- mNotification.contentView = contentView;
- Intent intent = new Intent(this, FriendListActivity.class);
- PendingIntent contentIntent = PendingIntent.getActivity(mContext, 0,
- intent, PendingIntent.FLAG_UPDATE_CURRENT);
- // 指定內容意圖
- mNotification.contentIntent = contentIntent;
- mNotificationManager.notify(Constants.NOTIFY_ID, mNotification);
- }
三,好友列表Activity返回按鍵的廣播接收者,使用者按返回鍵傳送廣播,並做好標記,程式進入後臺執行:
- // 收到使用者按返回鍵發出的廣播,就顯示通知欄
- private BroadcastReceiver backKeyReceiver = new BroadcastReceiver() {
- @Override
- publicvoid onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- Toast.makeText(context, "QQ進入後臺執行", 0).show();
- setMsgNotification();
- }
- };
四,通過handler更新通知欄,我們是通過handler來處理訊息並更新通知欄的:
- // 用來更新通知欄訊息的handler
- private Handler handler = new Handler() {
- publicvoid handleMessage(Message msg) {
- switch (msg.what) {
- case MSG:
- int newMsgNum = application.getNewMsgNum();// 從全域性變數中獲取
- newMsgNum++;// 每收到一次訊息,自增一次
- application.setNewMsgNum(newMsgNum);// 再設定為全域性變數
- TranObject<TextMessage> textObject = (TranObject<TextMessage>) msg
- .getData().getSerializable("msg");
- // System.out.println(textObject);
- if (textObject != null) {
- int form = textObject.getFromUser();// 訊息從哪裡來
- String content = textObject.getObject().getMessage();// 訊息內容
- ChatMsgEntity entity = new ChatMsgEntity("",
- MyDate.getDateEN(), content, -1, true);// 收到的訊息
- messageDB.saveMsg(form, entity);// 儲存到資料庫
- // 更新通知欄
- int icon = R.drawable.notify_newmessage;
- CharSequence tickerText = form + ":" + content;
- long when = System.currentTimeMillis();
- mNotification = new Notification(icon, tickerText, when);
- mNotification.flags = Notification.FLAG_NO_CLEAR;
- // 設定預設聲音
- mNotification.defaults |= Notification.DEFAULT_SOUND;
- // 設定震動(需加VIBRATE許可權)
- mNotification.defaults |= Notification.DEFAULT_VIBRATE;
- mNot