Android高仿微信之mvp實現(四)

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

前面把聊天的基本功能都實現了,最近有點忙,因為快到學期末了,考試就來了,所以後面可能會慢點。大家都反映沒有訊息提醒,所以抽了點時間把聊天的提醒簡單的實現了下,下面簡單的介紹下。

原理

我這裡用到得原理主要就兩個知識點

  • Notification
  • BadgeView

只要你解決了這兩項以後的訊息提醒神馬的都能輕鬆搞定。首先來解釋下他們的應用,對於Notification我想應該很多都接觸了,但還是簡單的說下,我這裡使用它就是實現我們日常看到的訊息通知框的出現,不過其中的使用要注意幾點,下面會詳細指出。至於BadgeView這是一個開源庫,它的功能就是我們日常看到的在應用中顯示的未讀訊息數。

原理介紹完了下面來看看實現

通知欄的顯示

這裡除了Notification還有一個重要的是PendingIntent(延遲意圖)就是實現點選通知欄後的操作

延遲意圖PendingIntent

既然是意圖自然要使用Intent指定我們點選後的應用操作

配置Intent

Intent intent = new Intent(App.getAppContext(), MainActivity.class);
//防止開啟重複的Activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Bundle bundle = new Bundle();
//防止pendingIntent相同
intent.setData(Uri.parse("message://"   regId));
bundle.putInt("_id", _id);
intent.putExtras(bundle);

我這裡是點選都自動跳轉到主介面,然後在主介面做相應的操作。在這裡要注意下我前面說的注意點。

注意點
第一點

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

這句程式碼是防止我們點選通知欄後開啟指定的介面,後退棧時介面重複。如果你沒有清空棧,就會出現重複建立的現象。可能這裡有人會說可以使用launchMode的模式,沒錯當我們使用signalTop或者其它的如singleTask能解決重複介面的建立,但是這裡有個問題如signalTop當在棧頂是並不會重新建立該Activity而是會直接複用原來的。所以這樣就會導致頁面不會更新未讀訊息數。

第二點

intent.setData(Uri.parse("message://" regId));

intent設定不同的資料來源,雖然PendingIntent提供了四個這方面的引數,但都是針對相同物件的延遲意圖

  • FLAG_ONE_SHOT 意思就是你設定的延遲意圖只可使用一次,說明以後通過它的都不會實現
  • FLAG_NO_CREATE 這個更簡單了就是不存在也就不會建立了直接返回null
  • FLAG_CANCEL_CURRENT 這個就是存在就取消原來的,使用新的,新的只改變要傳遞的資料
  • FLAG_UPDATE_CURRENT 跟上面的相差不大,它會更新原來的資料

上面的對要開啟不同的介面都沒有作用,都會覆蓋原來的意圖,導致不同的人傳送訊息時,點選通知欄的不同通知顯示同一個聊天介面。這裡使用regId做唯一標識就能消除這方面的問題。

建立PendingIntent

                PendingIntent pi = PendingIntent.getActivity(App.getAppContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

通知Notification構建

這裡我就直接貼程式碼了都是很容易理解的了。

Notification notification = new Notification.Builder(App.getAppContext())
.setSmallIcon(R.drawable.icon)
.setAutoCancel(true)
.setTicker("高仿微信有新訊息")
.setContentTitle(userName)
.setContentText("["   unReadNum   "條] "   rMessage)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS)
.setContentIntent(pi)
.setWhen(System.currentTimeMillis())
.build();

傳送通知

獲取系統通知管理

                manager = (NotificationManager) App.getAppContext().getSystemService(Context.NOTIFICATION_SERVICE);

傳送通知

manager.notify(_id, notification);

通知欄的構建就完美結束了

訊息數的顯示

既然前面都說了藉助了開源庫,所以實現就相對來說就簡單了,我這裡把它總結成三步

建立BadgeView例項

        BadgeView badgeView = new BadgeView(context, view);

其中view代表你要依附的檢視

構建文字

badgeView.setTextColor(Color.WHITE);
badgeView.setText(textValue);
badgeView.setBackground(context.getResources().getDrawable(R.drawable.dot_bg));
badgeView.setTextSize(12);
badgeView.setBadgePosition(BadgeView.POSITION_TOP_RIGHT);
badgeView.setBadgeMargin(0, 0);        

上面的肯定沒問題吧,簡單明瞭,顯示位置badgeView.setBadgePosition預設是右上角,但我感覺效果不明顯,不是我們要得效果,沒有像微信那樣檢視出去了部分,所以我都後面看了下原始碼,發現了badgeView.setBadgeMargin(0, 0);能使該效果明顯些。

顯示

badgeView.show();

到這裡所有的訊息提醒功能就完成了

一系列文章

Android高仿微信之mvp實現(一)
Android高仿微信之mvp實現(二)
Android高仿微信之mvp實現(三)

專案地址:https://github.com/idisfkj/Hi…

關注

clipboard.png

相關文章

Android 開發 最新文章