需求描述
微信消息列表中的小紅點(diǎn)為一級(jí)小紅點(diǎn)
點(diǎn)擊訂閱號(hào)后,訂閱列表頁面為二級(jí)小紅點(diǎn)
點(diǎn)擊某一個(gè)訂閱號(hào)后,消除該訂閱號(hào)相關(guān)各級(jí)小紅點(diǎn)
微信只是一個(gè)小例子,我的項(xiàng)目中,小紅點(diǎn)的級(jí)數(shù)是超多的.
項(xiàng)目樣例:
員工提交請(qǐng)假申請(qǐng)單,人事會(huì)收到后臺(tái)推送,推送中附帶一個(gè)code
code | 含義 |
---|---|
200 | 請(qǐng)假 |
201 | 出差 |
300 | 入職 |
301 | 辭職 |
人事一級(jí)頁面
- 基本功能(添加小紅點(diǎn),顯示200,201,300,301小紅點(diǎn)數(shù)量總和)
- 其他功能(添加小紅點(diǎn),顯示......小紅點(diǎn)數(shù)量總和)
人事二級(jí)頁面(基本功能)
- 審批(添加小紅點(diǎn),顯示200,201小紅點(diǎn)數(shù)量總和)
- 檔案(添加小紅點(diǎn),顯示300小紅點(diǎn)數(shù)量總和)
- 合同(301)
人事三級(jí)頁面(審批)
- 請(qǐng)假(添加小紅點(diǎn),顯示200小紅點(diǎn)數(shù)量總和)
- 出差(添加小紅點(diǎn),顯示201小紅點(diǎn)數(shù)量總和)
人事四級(jí)頁面(請(qǐng)假)
- 進(jìn)入此頁面消除掉請(qǐng)假的小紅點(diǎn)數(shù)量
方案:
- 原始方案
- 收到推送后,使用RxBus發(fā)送相應(yīng)code的通知
- 各級(jí)頁面注冊(cè)各個(gè)條目的所有code,收到通知后,計(jì)算紅點(diǎn)總和更新界面
- 當(dāng)需要添加一個(gè)code的時(shí)候,各級(jí)涵蓋該code的頁面都要修改相應(yīng)的處理
這種方案想想都要瘋了
- 改進(jìn)版本
- 一級(jí)頁面,比如基本功能,只需告訴它,該條目的紅點(diǎn)數(shù)來源于二級(jí)頁面(基本功能)
- 二級(jí)頁面,比如審批,只需告訴它,該條目的紅點(diǎn)數(shù)來源于三級(jí)頁面(審批)
- 三級(jí)頁面,比如請(qǐng)假,只需告訴它,該條目的紅點(diǎn)數(shù)來源于四級(jí)頁面(請(qǐng)假)
- 四級(jí)頁面,定義該頁面處理的code值,可多個(gè),頁面退出時(shí),自動(dòng)消除code對(duì)應(yīng)的各級(jí)紅點(diǎn)數(shù)
使用方式
一級(jí)頁面基本功能紅點(diǎn)處理
/**
* classes 所管理的頁面
* @param num 所管理頁面紅點(diǎn)總數(shù)
*/
@DealCodeClass(classes = {基本功能Activity.class})
public void unpdate(int num) {
//根據(jù)紅點(diǎn)總數(shù)更新界面
......
}
二級(jí)頁面審批紅點(diǎn)處理
/**
* classes 所管理的頁面
* @param num 所管理頁面紅點(diǎn)總數(shù)
*/
@DealCodeClass(classes = {審批Activity.class})
public void unpdate(int num) {
//根據(jù)紅點(diǎn)總數(shù)更新界面
......
}
三級(jí)頁面請(qǐng)假紅點(diǎn)處理
/**
* classes 所管理的頁面
* @param num 所管理頁面紅點(diǎn)總數(shù)
*/
@DealCodeClass(classes = {請(qǐng)假Activity.class})
public void unpdate(int num) {
//根據(jù)紅點(diǎn)總數(shù)更新界面
......
}
四級(jí)頁面請(qǐng)假消息處理
@DealCode(codes = {200})
public class 請(qǐng)假Activity {
/**
* 收到RxBus通知時(shí),調(diào)用該方法
* codes 表示通知的碼 可多個(gè),該codes各級(jí)頁面自動(dòng)管理
* code 表示通知的碼 一個(gè),該code各級(jí)頁面不管理
*/
@Subscribe(codes = {200}, threadMode = ThreadMode.MAIN)
public void refreshCode() {
}
}