在实际开发中会有这样还一个需求,显示推送过来的未读消息数量
推送实时更新未读消息数量,接收到【一条消息】,就【显示未读数量】,当用户点击,或者拖拽的时候消除掉未读消息数量,先上一下效果图,当我推送两条消息过来的时候显示的样子
![](https://img.haomeiwen.com/i1859043/c49023d9bd1aca66.png)
用到的技术 EventBus 响应式框架:以及显示消息的QBadgeView负责来显示
目的:
1.把接收到的消息从Receiver发送到主Activity,在主Activity中接收这个数量
2.把接收到的数量用QBadgeView来显示 badgerView更多用法请参考 https://github.com/qstumn/BadgeView
第一步
先引入我们的QBadgeView 库和EventBus库在我们的app->build.gradle中添加
implementation 'q.rorbin:badgeview:1.1.3'
implementation 'org.greenrobot:eventbus:3.0.0'
第二步
在我们接收自定义消息的地方添加
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "JPush";
@Override
public void onReceive(Context context, Intent intent) {
//当接受到消息, 弹出通知栏
Bundle bundle = intent.getExtras();
// 消息内容
String content = bundle.getString(JPushInterface.EXTRA_ALERT);
if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
processCustomMessage(context, bundle);
}
}
}
// 这里当我们APP端接收到推送过来的消息,我们就递增,并存起来
private void processCustomMessage(Context context, Bundle bundle) {
sendNotification(context,bundle);
String msgText = bundle.getString(JPushInterface.EXTRA_MESSAGE);
// 初始化一个存取未读消息的,默认存储是0
int pushcount = SharePreferenceUtils.getInt(context,"pushcount",0);
pushcount++;
// 当收到消息的时候在存
SharePreferenceUtils.setInt(context,"pushcount",pushcount);
getMsgCount(context);
}
// 拿到我们存的消息
private int getSendMessage(Context context) {
return SharePreferenceUtils.getInt(context,"pushcount",0);
}
// 发送我们的消息给MainActivity
private void getMsgCount(Context context) {
int msg = getSendMessage(context);
MessageEventBean messageEvent = new MessageEventBean(msg);
EventBus.getDefault().post(messageEvent);
}
接下来看看我们的MainActivity
public class MainActivity extends AppCompatActivity{
@InjectView(R.id.swicth_draggable)
Switch swicth_draggable;
private int msgCount; // 接收消息数量
private QBadgeView badgeView;
private List<Badge> badges;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
init();
}
// 初始化 注意看我的顺序,badges 要放在后面
private void init() {
EventBus.getDefault().register(this);
CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
for (Badge badge : badges) {
badge.setOnDragStateChangedListener(isChecked ?
new Badge.OnDragStateChangedListener() {
@Override
public void onDragStateChanged(int dragState, Badge badge, View targetView) {
SharePreferenceUtils.remove(MainActivity.this,"pushcount");
}
} : null);
}
}
};
swicth_draggable.setOnCheckedChangeListener(onCheckedChangeListener);
badges = new ArrayList<>();
badgeView = new QBadgeView(this);
// 拿到我们存的数据
msgCount = SharePreferenceUtils.getInt(MainActivity.this,"pushcount",0);
// 这里我们把显示未读数量提取出来放到一个方法里,这里是我们用户一进来主页面显示的未读消息数量
getBrageCountMsg(msgCount);
}
// 未读数量
private void getBrageCountMsg(int msgCount) {
badgeView.setBadgeNumber(msgCount);
badgeView.bindTarget(mTabtab4);
badges.add(badgeView);
swicth_draggable.setChecked(true);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMsgEvent(MessageEventBean messageEventBean){
msgCount = messageEventBean.getMessage();
SharePreferenceUtils.setInt(MainActivity.this,"pushcount",msgCount);
// 这里是我们推送数据过来实时显示的未读消息数量
getBrageCountMsg(msgCount);
}
// 在我点击了位置服务的时候删除未读消息[在你想删除的地方调用该方法即可]
private void removeBadge() {
for (Badge badge : badges) {
SharePreferenceUtils.remove(MainActivity.this,"pushcount");
badge.hide(true);
}
}
// 别忘了解除绑定
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
网友评论