66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

App开发中,服务器主动向客户端推送消息,基本采用第三方推送服务。本文讲述在组件化项目开发中,如何集成推送服务并进行业务隔离,集成多通道推送提高到达率、消息去重等。

首先集成极光推送,具体操作参考极光推送Android SDK集成指南。我们要做到推送服务与业务代码隔离,在lib-push库中处理推送逻辑,对外暴露一个推送服务初始化接口,以及推送通知接口,具体实现如下。

推送初始化

新建PushClient类,使用单例模式,这是对外提供服务的工具类,包含推送初始化、别名设置、通知接口设置。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53public class{

PushListener mListener;

public static PushClient (){

...

return instance;

}

*

* @param context context

* @return

*/

public PushClient init(Context context){

this.mContext = context;

JPushInterface.setDebugMode(true);

JPushInterface.init(mContext);

// 其它推送

...

return PushClient.this;

}

/**

* set push alias

*

* @param alias alias

*/

public PushClient setAlias(String alias){

JPushInterface.setAlias(mContext, new Random().nextInt(), alias);

...

return PushClient.this;

}

/**

* set push listener to receive message

*

* @param listener

* @return

*/

public PushClient setListener(PushListener listener){

this.mListener = listener;

return PushClient.this;

}

}

推送回调

PushListener为回调接口,业务层实现此接口,当推送服务收到推送,会在接收器里回调此实现,1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17public void onReceive(Context context, Intent intent){

try {

Bundle bundle = intent.getExtras();

Log.d(TAG, "[JPush]: onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

...

if (PushClient.getInstance().mListener != null) {

PushClient.getInstance().mListener.onPush(context, content);

}

...

} catch (Exception e) {

}

}

当业务层接收到推送后,可进行具体而复杂的处理。

多通道推送

实际开发中,遇到小米推送不及时、偶发性推送失效的场景,解决方案是集成2-3个推送通道,本项目集成了小米、极光推送,小米推送集成参见小米推送Android客户端SDK使用指南,和极光推送一样,都配置在lib-push中,与上层逻辑隔离,集成时请留意权限配置。小米推送依然在PushClinet中初始化,别名设置也在setAlias()方法中。

此时迎来第二个问题,多通道推送必然导致消息重复,需要对收到的推送进行过滤,也正式因此,消息推送最好采用自定义消息(小米称透传消息)的方式推送,方便客户端进行消息过滤以及自定义通知栏。

消息去重

在消息到达客户端的时候,不再直接回调业务层接口实现,应该先进行消息处理,确认消息不重复之后再进行回调通知,加入PushManage消息处理类,public void onReceive(Context context, Intent intent){

try {

Bundle bundle = intent.getExtras();

Log.d(TAG, "[JPush]: onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));

...

// 处理消息 进行消息去重、数据库存储

PushManage.push(context, content);

...

} catch (Exception e) {

}

}

PushManage对消息进行过滤,并存储到数据库,重启App以后仍然可对消息进行有效过滤,防止推送延迟严重的现象。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐