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

前面把聊天的基本功能都實現了,最近有點忙,由於快到學期末了,考試就來了,因此後面可能會慢點。你們都反映沒有消息提醒,因此抽了點時間把聊天的提醒簡單的實現了下,下面簡單的介紹下。git

原理

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

  • Notification
  • BadgeView

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

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

通知欄的顯示

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

延遲意圖PendingIntent

既然是意圖天然要使用Intent指定咱們點擊後的應用操做spa

配置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);

我這裏是點擊都自動跳轉到主界面,而後在主界面作相應的操做。在這裏要注意下我前面說的注意點。code

注意點
第一點

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);對象

這句代碼是防止咱們點擊通知欄後開啓指定的界面,後退棧時界面重複。若是你沒有清空棧,就會出現重複建立的現象。可能這裏有人會說可使用launchMode的模式,沒錯當咱們使用signalTop或者其它的如singleTask能解決重複界面的建立,可是這裏有個問題如signalTop當在棧頂是並不會從新建立該Activity而是會直接複用原來的。因此這樣就會致使頁面不會更新未讀消息數。ip

第二點

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

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

相關文章
相關標籤/搜索