前面把聊天的基本功能都實現了,最近有點忙,由於快到學期末了,考試就來了,因此後面可能會慢點。你們都反映沒有消息提醒,因此抽了點時間把聊天的提醒簡單的實現了下,下面簡單的介紹下。git
我這裏用到得原理主要就兩個知識點github
只要你解決了這兩項之後的消息提醒神馬的都能輕鬆搞定。首先來解釋下他們的應用,對於Notification我想應該不少都接觸了,但仍是簡單的說下,我這裏使用它就是實現咱們平常看到的消息通知框的出現,不過其中的使用要注意幾點,下面會詳細指出。至於BadgeView這是一個開源庫,它的功能就是咱們平常看到的在應用中顯示的未讀消息數。微信
原理介紹完了下面來看看實現
這裏除了Notification還有一個重要的是PendingIntent(延遲意圖)就是實現點擊通知欄後的操做ui
既然是意圖天然要使用Intent指定咱們點擊後的應用操做spa
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提供了四個這方面的參數,但都是針對相同對象的延遲意圖源碼
意思就是你設置的延遲意圖只可以使用一次,說明之後經過它的都不會實現
這個更簡單了就是不存在也就不會建立了直接返回null
這個就是存在就取消原來的,使用新的,新的只改變要傳遞的數據
跟上面的相差不大,它會更新原來的數據
上面的對要開啓不一樣的界面都沒有做用,都會覆蓋原來的意圖,致使不一樣的人發送消息時,點擊通知欄的不一樣通知顯示同一個聊天界面。這裏使用regId作惟一標識就能消除這方面的問題。
PendingIntent pi = PendingIntent.getActivity(App.getAppContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
這裏我就直接貼代碼了都是很容易理解的了。
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 = 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...