fWX228941 / project

all by myself
1 stars 0 forks source link

彩信参考代码设计思想 #61

Open fWX228941 opened 2 months ago

fWX228941 commented 2 months ago

1.捕获异常重连,崩溃后进程恢复 技术方案:Application中捕获UncaughtExcepetionHandler

Image

Image

初始化与使用的地方

Image

Image

Image

Image

fWX228941 commented 2 months ago

2.绑定第三方服务 技术方案:绑定时机,包括初始化,断开重连以及崩溃异常重连

Image

Image

Image

断开后延迟两秒绑定服务(不同的版本,相同的服务),一直绑定直到成功为止,并不是所有终端开关后都会自动重连的,考虑兼容性

Image

Image

fWX228941 commented 2 months ago

3.绑定本地服务 技术点:服务绑定的通用方式以及版本兼容,前台服务

Image

Image

Image

Image

fWX228941 commented 2 months ago

4.Application职责 4.1.初始化,尤其是提供服务业务 (备注:onTrimMemory 和onLowMemory 基本没用,所以其不存在生命周期,如果有明显生命周期痕迹的逻辑需要放在服务中进行初始化和销毁) 4.2.提供全局的变量和接口 (这部分逻辑可以放在一起)尤其是第三方服务接口(或者IP 端口等)类似于如下这种,就可以放在一个单独类中

Image

4.3.恢复性质的逻辑(比如发送上次失败的彩信,控制未读数等,都是可以按照业务来进行划分的)

fWX228941 commented 2 months ago

5.本地服务提供业务 技术点:外观模式的服务,只对外提供UI用的全部的业务接口,其他内部业务的实现与管控分别交给各种的业务类来处理(彩信+定位业务)

Image

Image

Image

Image

其他定时器唤醒的逻辑可以单独开一个服务来执行,状态机由外部触发

fWX228941 commented 2 months ago

6.登录流程状态机

Image

当前状态,分为登录中,登录,空闲,三个状态

Image

切换状态 从上一个状态的exit到下一个状态的enter,状态之间的事件由handler来维护

Image

事件传递,切换状态之间都是可以传递任意数据的,保证状态之间的通信

Image

状态机业务,分别提供三个回调给外部,尤其是UI,通过回调的方式把结果向上反馈,开主线程,子线程来控制,登录,彩信的收发

Image

Image

Image

Image

Image

一个标准的状态机定义,也是可以参考源码中的状态机,核心业务里面再封装XMPP对外的接口

fWX228941 commented 2 months ago

7.重连机制

Image

Image

Image

Image

定时器+简单策略+多个重连客户端+对齐

fWX228941 commented 2 months ago

8.定位

Image

定位的策略,周期上报,版本差异

Image

上报的数据在一个子线程中进行,用handler来管理业务,打开定位服务,关闭定位服务,用handler +版本+线程管理

Image

Image

Image

打开定位开关,权限检查

Image

停止服务

Image

核心算法:定位开关-》定位权限-》当前是否有定位-》至少4颗有效卫星(CN值大于15)

Image

Image

Image

其他策略,包括时间,距离,精度,速度的策略 (对比前后两个location)

Image

Image

上报策略是优先上报最新的定位,其次是上一次有效定位,间隔 收到彩信可以使用两个handler 来拆分,两个Handler impl

Image

Image

fWX228941 commented 2 months ago

9.TittleView自定义布局 复杂的自定义布局是适配大小屏,横竖屏的时候,改好不太好,尽量不要修改onMeasure+onLayout ,靓点是 View也是可以实现UI交互的,View+Tag(object)

Image

Image

Action就是Tag 定义一个Tag 就好了

Image

Image

Image

Image

通过Tag来进行通信 区分文本与图片

Image

fWX228941 commented 2 months ago

10.BaseActivity 1)沉浸式+横竖屏+主题 (职责可以划分为View相关或者Activity相关)

Image

2)按键 (触摸) 任何的UI交互 界面性质很强,UI关联性很强 菜单按键等 Activity的部分业务逻辑包括这些按键也是可以交给View进行处理,如果很复杂甚至是可以单独抽离出来的 View 也是可以进行事件处理(Event Handling) View不处理生命周期事件,但可以与所属的Activity的生命周期相关联

Image

Image

Image

Image

Image

Image

Image

不处理+向下传递/向下不传递 ;处理+向下不传递

Image

Image

Image

Image

长按,短按,返回键 finish 3)权限

Image

Image

Image

Image

Image

4)布局 管理不同的View

Image

典型的标题栏+内容

Image

Image

本质还是addView 子类来复写

Image

(VIew添加生命周期感知,添加业务数据感知,也可以单纯提供更新UI接口,还是让Activity来连接) 添加Actitity的生命周期感知

Image

Image

Image

Activity 更多是控制器的角色 把纯UI部分拆分出来

5)管理Fragment 之间的切换,尤其是返回按键 (原生)堆栈管理

Image

Image

Image

Image

6)外部跳转过来 (管理生命周期相关的)

Image

Image

Image

理清三者之间的职责是整理的一个重要思路 Activity职责:按键 + 动态添加布局 + 权限 Activity 天然持有View和Fragment 的引用

fWX228941 commented 2 months ago

11)BaseView 1.自定义View 按键处理 Activity传递给View

Image

Image

全面拥抱动态布局

Image

设置间距 布局参数

Image

2.优先选择天然支持按键的View 比如ListView 远比自己来管理要强很多 很复杂的ListItem 适合自定义布局,数据由binddata

Image

数据与View 进行绑定 adapter 肯定是知道View 和 Data 的 Fragment肯定是知道adapter的,间接知道全部 对外提供UI交互 View里面屏蔽UI 差异 更加清晰 自定义布局 分发

Image

Image

重点是父类 子类 管控焦点 UI交互

Image

自定义布局对外隐藏差异点,自己来管控布局 通过addView ,View绑定数据Data

Image

大小屏的定义可以用到宏控,实现方案有时是会影响到编码方式的 3.布局复用性,可以拆解出来给任意的Fragment 或者Activity使用,作为一个服务端,互相为服务端,不直接持有引用,你想要就自己订阅 自己组合 同时要支持修改方案,比如轻易的替换布局,最大化的减少依赖

Image

按键什么的交互 其实都是正对View 的 只不过承接上可以是View 也可以是Activity 都是可以处理回调的,甚至是Fragment 任意

Image

Image

View 一次只能服务于一个窗口

fWX228941 commented 2 months ago

4.自定义布局的坑 1)焦点问题 (可用,可点击,置灰)

Image

Image

Image

2)动态修改布局参数 包括margin 和 padding

Image

针对不同的屏幕尺寸或方向,需要调整UI布局 组合多个标准或自定义的视图组件 精确的控制特殊用户交互 灵活地控制动画的执行和效果 共享的UI元素或者特定的交互模块 整个应用中进行重用 灵活地控制UI元素的外观和交互 3)大小屏适配 (差异有点大,但是ID 还是相同)

Image

显然自定义布局更好,保证ID 相同即可

Image

动态添加布局(小) 本质上 所有的UI交互都是可以用自定义布局来完成,包括数据传递,UI交互,复杂的UI交互就可以拆分不同UI 3)父布局子布局 焦点抢占的问题

Image

3)自定义属性

Image

fitsSystemWindows 适配导航栏与状态栏,不会出现覆盖重叠

Image

KeepScreenOn 常亮 很多UI交互的属性,如果能够静态控制就静态控制

Image

子View常用属性

Image

影响交互 Relativelayout 子view布局

Image

文本滚动显示

Image

Linearlayout 子View布局

Image

Include 那些标签也是可以利用起来了

Image

Edittext 编辑框

Image

Image

Image

设置横线

Image

列表

Image

5.面向接口与回调编程

Image

Image

Image

抽象的父布局提供点击接口

Image

子布局来提供具体实现

Image

Image

客户端来监听,Fragment 实现与View 之间的交互,Fragment 来协调自定义布局与其他模块之间的交互,比如数据绑定,自定义布局也可以与某个数据进行绑定,建议不要强绑定,Fragemnt 来转化这一层,即使绑定的数据类型不同,也要归一,尽量不与具体的数据类型进行绑定,具体的UI交互进行绑定 数据类型都是Base的

Image

Image

附件下载交互,包括开始下载,长按,取消下载,关闭对话框 定义一套复杂的UI交互

Image

进行实现

Image

Image

对外只提供交互接口,至于怎么实现,不关心,UI交互动作AttachmentView自己来实现,谁要监听,自己来管控与实现,相同的交互动作可以有不同的实现,不同的自定义布局,实现相同的接口即可

Image

实现 自定义布局与自定义布局之间的交互,数据传输,都是父子布局之间

6.1.Selector

Image

Image

Image

Image

字体颜色变更,图片变更,背景色变更,原色就用transparent 透明 只是颜色变化 res/color 其他 res/drawable 能用原生的颜色就用原生的颜色6.2.自己画图 (适配) 适用场景是画规则图像,正方形,原形,椭圆,直线

Image

Image

复杂的图 可以使用vector 矢量图 优先使用 图片要求 6.3.适配 (只要是资源都是可以添加限定符)

Image

适配的原则: 小到图片适配,大到布局适配 是很容易得事情 真的是只需要一套即可 Nine-Patch .9 图片适用于需要动态调整大小的 UI 元素(背景),而矢量图片适用于需要在不同屏幕密度下保持清晰度的图标和图形 限定符是适配的关键,可以满足全部定制项目

fWX228941 commented 2 months ago

12)BaseFragment 1.兼容性,动态管理布局,目前实现不太好,是可优化

Image

Image

两种方式,一种是View差异很大,一种是View内部差异很大,用Fragment 试过了 ,真的是不太好,差异大的改为自定义布局,差异化的View逻辑全部放在View中进行统一管理 2.外部跳转(Activity)通信

Image

Image

Fragment 管理差异容易出问题 跟项目耦合太深了 尤其某些控件有或者没有 容易出现空指针异常 3.界面跳转 回调

Image

Image

4.不同的Fragment 组合

Image

也是add

Image 还是不太建议使用这种方式 这种方式是Fragemnt A 添加Fragment B 本质还是View的add 统一还是靠自定义布局 由一个Fragment 来进行管控

Image

列表 每一个类 设计都是服务类 4.常用公共接口设计

Image

查询数据,当前item数据,当前View 数据字段的设计 adapter的选择

fWX228941 commented 2 months ago

13)对外提供服务

Image

对外提供收发接口,收发各一个接口,收是回调的收

Image

Image

Image

Image

Image

Image

Image

Image

Image

具体封装实现

Image

Image

如果是在mk文件中,可以编译成jar包

Image

类似这种,不用暴露远程服务

Image

AIDL通信 添加服务死亡回调

Image

Image

跨进程调用资源文件

Image

Image

fWX228941 commented 2 months ago

14)多媒体相关的坑 1.根据多媒体路径来获取多媒体类型

Image

Image

2.根据URI来获取多媒体文件的具体路径 路径形式很多,包括从文件夹,图片,SD卡.....

Image

Image

Image

Image

Image

2.1.文件管理器,文件类型

Image

Image

Image

Image

Image

Image

Image

Image

2.2.截图

Image

2.3.视频

Image

3.打开附件

Image

面向接口编程,至于具体方案的实现,随时都是可以变化的,这样是最好的、

fWX228941 commented 2 months ago

15)彩信的坑 1)彩信发送的场景与流程 场景:用户操作,转发,选择多媒体发送 预处理(发送号码-本机号码-内容-网络-服务器连接)

Image

2)编辑框,光标的处理 (草稿,转发,删除)

Image

Image

Image

3)草稿

Image

Image

4)号码格式 人机交互 View的部分 View自己处理 其余部分模块处理