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

相关文章
相关标签/搜索