fWX228941 / project

all by myself
1 stars 0 forks source link

问答 #51

Open fWX228941 opened 6 months ago

fWX228941 commented 6 months ago

1.彩信的基本业务有哪些?

fWX228941 commented 6 months ago

Image

Image

Image

Image

Image

Image

1)Mms, Gis服务器的登录/登出,包括安全认证,心跳监测等。 2)文本,图像,视频等多媒体消息的发送与接收,包括附件上传下载功能,包括进度反馈、断点续传[服务器侧不支持]、删除取消等 3)定位指令接收以及定位数据上报等 4)对外提供发送彩信等控制接口与数据共享。 5)集群交互功能,包括通讯录,交互跳转等。

fWX228941 commented 6 months ago

3.彩信核心机制有哪些以及核心代码思路? 1)重连机制 使用场景:登录失败后,会隔一段时间后尝试再次登录,如此反复,直到登录成功。每次登录间隔是变化的 ReconnManager 采用AlarmManager+service(动态的重连时间+定时器唤醒对齐)+单例模式 最小重连周期min是30s,最大重连周期max是5分钟。当重连次数<=3次的话则以最小重连周期去尝试连接登录,当重连次数>3次,则将重连周期按min*(重连次数-2)递增最大不超过max 进行尝试重连,直到重连成功。 (30s,30s,30s,2分钟,3分钟,4分钟,5分钟,5分钟 ..... ),如果是多个客户端(TAG)则用线程安全的HashTable来存储各种的重连次数,并综合多客户端计算出最小重连次数,得到统一的重启周期,这个重启周期即为定时器的周期 (采用合适的数据结构也是很讲究的) AlarmManager 版本差异参考代码 M以上的代码参考 frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java N以下的代码参考 frameworks/base/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java

2)登录流程用状态机,UI与业务是观察者模式,UI注册关心的事件,回调监听器都是每一层的业务 干掉大量的判断语句

3)UI框架解耦,业务来拆分实现类 (外观模式 对外统一接口system 采用service服务的原因是提供给第三方使用,职责是独立的,可以提高非persist进程的优先级,业务崩溃后可以重启,管理业务)(接口设计)system会把实现按具体业务交给彩信或者定位

4)心跳机制 每隔5分钟,发送一次心跳包给服务器,用于检测应用与服务器连接状态,如果发送失败或者三次发送超时,则重新发起登录,使用HeartbeatManager类来统一管理两个服务器心跳开启,以及下次心跳触发时间等操作,Tag:表示关联的心跳任务,Mms以及gis心跳用不同字符串唯一标示 采用AlarmManager 是能够在休眠中也被唤醒,统计三次失败超时,并对外提供回调接口

5)超时机制 消息发送后,正常情况下,服务器会发回该消息ACK,通过消息ACK可以知道消息发送成功或失败,另外由于网络等一些情况,应用可能很长时间内都没有收到该消息ACK,因此需要设计超时重发机制: 默认发送超时时间设置为30秒,如果30秒内没有收到ACK消息,则重新发送该消息包,如果3次发送都超时。则通知消息发送超时失败处理 PendingIntent getPendingIntent(String tag, String msgId):其中tag是mms,gis标示,同心跳,重连介绍。其作用:根据发送的消息id,构建alarm触发的action, 其规则为: "com.caltta.msg.action.MSGTIMEOUT"+""+tag+"_"+msgId ,唯一标识超时发送信息, 同一个服务可以管理多个定时器

服务参考代码:都是一样的

6)UI与接口适配兼容性方案 兼容分四个方面,一个是Android版本适配,包括功能接口变更,行为变更(Android提供解决方法);一个是屏幕适配(公共控件,横竖屏,按键机触摸屏,UI解耦)