Open fWX228941 opened 2 months ago
2.绑定第三方服务 技术方案:绑定时机,包括初始化,断开重连以及崩溃异常重连
断开后延迟两秒绑定服务(不同的版本,相同的服务),一直绑定直到成功为止,并不是所有终端开关后都会自动重连的,考虑兼容性
3.绑定本地服务 技术点:服务绑定的通用方式以及版本兼容,前台服务
4.Application职责 4.1.初始化,尤其是提供服务业务 (备注:onTrimMemory 和onLowMemory 基本没用,所以其不存在生命周期,如果有明显生命周期痕迹的逻辑需要放在服务中进行初始化和销毁) 4.2.提供全局的变量和接口 (这部分逻辑可以放在一起)尤其是第三方服务接口(或者IP 端口等)类似于如下这种,就可以放在一个单独类中
4.3.恢复性质的逻辑(比如发送上次失败的彩信,控制未读数等,都是可以按照业务来进行划分的)
5.本地服务提供业务 技术点:外观模式的服务,只对外提供UI用的全部的业务接口,其他内部业务的实现与管控分别交给各种的业务类来处理(彩信+定位业务)
其他定时器唤醒的逻辑可以单独开一个服务来执行,状态机由外部触发
6.登录流程状态机
当前状态,分为登录中,登录,空闲,三个状态
切换状态 从上一个状态的exit到下一个状态的enter,状态之间的事件由handler来维护
事件传递,切换状态之间都是可以传递任意数据的,保证状态之间的通信
状态机业务,分别提供三个回调给外部,尤其是UI,通过回调的方式把结果向上反馈,开主线程,子线程来控制,登录,彩信的收发
一个标准的状态机定义,也是可以参考源码中的状态机,核心业务里面再封装XMPP对外的接口
7.重连机制
定时器+简单策略+多个重连客户端+对齐
8.定位
定位的策略,周期上报,版本差异
上报的数据在一个子线程中进行,用handler来管理业务,打开定位服务,关闭定位服务,用handler +版本+线程管理
打开定位开关,权限检查
停止服务
核心算法:定位开关-》定位权限-》当前是否有定位-》至少4颗有效卫星(CN值大于15)
其他策略,包括时间,距离,精度,速度的策略 (对比前后两个location)
上报策略是优先上报最新的定位,其次是上一次有效定位,间隔 收到彩信可以使用两个handler 来拆分,两个Handler impl
9.TittleView自定义布局 复杂的自定义布局是适配大小屏,横竖屏的时候,改好不太好,尽量不要修改onMeasure+onLayout ,靓点是 View也是可以实现UI交互的,View+Tag(object)
Action就是Tag 定义一个Tag 就好了
通过Tag来进行通信 区分文本与图片
10.BaseActivity 1)沉浸式+横竖屏+主题 (职责可以划分为View相关或者Activity相关)
2)按键 (触摸) 任何的UI交互 界面性质很强,UI关联性很强 菜单按键等 Activity的部分业务逻辑包括这些按键也是可以交给View进行处理,如果很复杂甚至是可以单独抽离出来的 View 也是可以进行事件处理(Event Handling) View不处理生命周期事件,但可以与所属的Activity的生命周期相关联
不处理+向下传递/向下不传递 ;处理+向下不传递
长按,短按,返回键 finish 3)权限
4)布局 管理不同的View
典型的标题栏+内容
本质还是addView 子类来复写
(VIew添加生命周期感知,添加业务数据感知,也可以单纯提供更新UI接口,还是让Activity来连接) 添加Actitity的生命周期感知
Activity 更多是控制器的角色 把纯UI部分拆分出来
5)管理Fragment 之间的切换,尤其是返回按键 (原生)堆栈管理
6)外部跳转过来 (管理生命周期相关的)
理清三者之间的职责是整理的一个重要思路 Activity职责:按键 + 动态添加布局 + 权限 Activity 天然持有View和Fragment 的引用
11)BaseView 1.自定义View 按键处理 Activity传递给View
全面拥抱动态布局
设置间距 布局参数
2.优先选择天然支持按键的View 比如ListView 远比自己来管理要强很多 很复杂的ListItem 适合自定义布局,数据由binddata
数据与View 进行绑定 adapter 肯定是知道View 和 Data 的 Fragment肯定是知道adapter的,间接知道全部 对外提供UI交互 View里面屏蔽UI 差异 更加清晰 自定义布局 分发
重点是父类 子类 管控焦点 UI交互
自定义布局对外隐藏差异点,自己来管控布局 通过addView ,View绑定数据Data
大小屏的定义可以用到宏控,实现方案有时是会影响到编码方式的 3.布局复用性,可以拆解出来给任意的Fragment 或者Activity使用,作为一个服务端,互相为服务端,不直接持有引用,你想要就自己订阅 自己组合 同时要支持修改方案,比如轻易的替换布局,最大化的减少依赖
按键什么的交互 其实都是正对View 的 只不过承接上可以是View 也可以是Activity 都是可以处理回调的,甚至是Fragment 任意
View 一次只能服务于一个窗口
4.自定义布局的坑 1)焦点问题 (可用,可点击,置灰)
2)动态修改布局参数 包括margin 和 padding
针对不同的屏幕尺寸或方向,需要调整UI布局 组合多个标准或自定义的视图组件 精确的控制特殊用户交互 灵活地控制动画的执行和效果 共享的UI元素或者特定的交互模块 整个应用中进行重用 灵活地控制UI元素的外观和交互 3)大小屏适配 (差异有点大,但是ID 还是相同)
显然自定义布局更好,保证ID 相同即可
动态添加布局(小) 本质上 所有的UI交互都是可以用自定义布局来完成,包括数据传递,UI交互,复杂的UI交互就可以拆分不同UI 3)父布局子布局 焦点抢占的问题
3)自定义属性
fitsSystemWindows 适配导航栏与状态栏,不会出现覆盖重叠
KeepScreenOn 常亮 很多UI交互的属性,如果能够静态控制就静态控制
子View常用属性
影响交互 Relativelayout 子view布局
文本滚动显示
Linearlayout 子View布局
Include 那些标签也是可以利用起来了
Edittext 编辑框
设置横线
列表
5.面向接口与回调编程
抽象的父布局提供点击接口
子布局来提供具体实现
客户端来监听,Fragment 实现与View 之间的交互,Fragment 来协调自定义布局与其他模块之间的交互,比如数据绑定,自定义布局也可以与某个数据进行绑定,建议不要强绑定,Fragemnt 来转化这一层,即使绑定的数据类型不同,也要归一,尽量不与具体的数据类型进行绑定,具体的UI交互进行绑定 数据类型都是Base的
附件下载交互,包括开始下载,长按,取消下载,关闭对话框 定义一套复杂的UI交互
进行实现
对外只提供交互接口,至于怎么实现,不关心,UI交互动作AttachmentView自己来实现,谁要监听,自己来管控与实现,相同的交互动作可以有不同的实现,不同的自定义布局,实现相同的接口即可
实现 自定义布局与自定义布局之间的交互,数据传输,都是父子布局之间
6.1.Selector
字体颜色变更,图片变更,背景色变更,原色就用transparent 透明 只是颜色变化 res/color 其他 res/drawable 能用原生的颜色就用原生的颜色6.2.自己画图 (适配) 适用场景是画规则图像,正方形,原形,椭圆,直线
复杂的图 可以使用vector 矢量图 优先使用 图片要求 6.3.适配 (只要是资源都是可以添加限定符)
适配的原则: 小到图片适配,大到布局适配 是很容易得事情 真的是只需要一套即可 Nine-Patch .9 图片适用于需要动态调整大小的 UI 元素(背景),而矢量图片适用于需要在不同屏幕密度下保持清晰度的图标和图形 限定符是适配的关键,可以满足全部定制项目
12)BaseFragment 1.兼容性,动态管理布局,目前实现不太好,是可优化
两种方式,一种是View差异很大,一种是View内部差异很大,用Fragment 试过了 ,真的是不太好,差异大的改为自定义布局,差异化的View逻辑全部放在View中进行统一管理 2.外部跳转(Activity)通信
Fragment 管理差异容易出问题 跟项目耦合太深了 尤其某些控件有或者没有 容易出现空指针异常 3.界面跳转 回调
4.不同的Fragment 组合
也是add
还是不太建议使用这种方式 这种方式是Fragemnt A 添加Fragment B 本质还是View的add 统一还是靠自定义布局 由一个Fragment 来进行管控
列表 每一个类 设计都是服务类 4.常用公共接口设计
查询数据,当前item数据,当前View 数据字段的设计 adapter的选择
13)对外提供服务
对外提供收发接口,收发各一个接口,收是回调的收
具体封装实现
如果是在mk文件中,可以编译成jar包
类似这种,不用暴露远程服务
AIDL通信 添加服务死亡回调
跨进程调用资源文件
14)多媒体相关的坑 1.根据多媒体路径来获取多媒体类型
2.根据URI来获取多媒体文件的具体路径 路径形式很多,包括从文件夹,图片,SD卡.....
2.1.文件管理器,文件类型
2.2.截图
2.3.视频
3.打开附件
面向接口编程,至于具体方案的实现,随时都是可以变化的,这样是最好的、
15)彩信的坑 1)彩信发送的场景与流程 场景:用户操作,转发,选择多媒体发送 预处理(发送号码-本机号码-内容-网络-服务器连接)
2)编辑框,光标的处理 (草稿,转发,删除)
3)草稿
4)号码格式 人机交互 View的部分 View自己处理 其余部分模块处理
1.捕获异常重连,崩溃后进程恢复 技术方案:Application中捕获UncaughtExcepetionHandler
初始化与使用的地方