推送显示未读消息数量

2020-01-17  本文已影响0人  Liu积土成山

在实际开发中会有这样还一个需求,显示推送过来的未读消息数量
推送实时更新未读消息数量,接收到【一条消息】,就【显示未读数量】,当用户点击,或者拖拽的时候消除掉未读消息数量,先上一下效果图,当我推送两条消息过来的时候显示的样子


image.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);
    }

}
上一篇下一篇

猜你喜欢

热点阅读