1. 流行技术
- 框架:MVP(框架) + Rxjava(响应式编程) + Retrofit(网络请求封装)
- 常用三方库:
- Rxbus :事件订阅管理
- ButterKnife :view 注入框架(setting 设置 m 开头)
- fastjson/Gson :Json 处理工具
- glide/Fresco :图片加载组件
- PictureSelector :图片选择器
- zxing :二维码扫描
- Lifecycle :生命周期管理组件
- tinker :热修复组件 使用
- Android-PickerView :多功能选择框(时间、地点、文件等,支持单选多选)
- AndPermission :权限管理组件
- SmartRefreshLayout :上拉加载、下拉刷新
- material-calendarview :日历控件
- SwipeDelMenuLayout : 侧滑菜单
- banner :广告轮播图
- 常用三方工具:
- 友盟统计、友盟分享、第三方登录
- 百度/高德地图、定位
- 极光推送
- 微信支付、支付宝支付
- Bugly 异常上报和运营统计
- leakcanary 内存检测工具
- ViewServer 可使用可视化界面显示工具
- 语言:
- java、kotlin(官方 kotlin 上位,但是 java 短时间也不能淘汰)
- 其他:
- React Native :跨平台解决方案,但目前属于踩坑阶段。
- Hybrid :混合开发,Android 的壳 + webview 页面,可服务器直接更新,但是加载受网络限制,超级耗流量。
- dagger2 :依赖注入框架(通过注解注入对象,在预编译的时期,非反射),上手成本超高。
- MVVM :也是一种新的架构模式、数据和 view 双向绑定,但绑定后 view 复用性差。
2.技术栈
-
架构的演变:MVC -> MVP、MVVM。
我们前公司架构使用的 MVP ,划分比较狠一些,就是 activity/fragment 中只有 view 更新,其余的所有操作全在 presenter 中(包扩跳转、onActivityResult 的处理),中间使用接口定义规范,这样做的好处就是 view 的页面可以直接复制去使用,不一样的逻辑全部都在 presenter 中去修改,我们的同业客户端(toBC)和旅游客户端(toC)在页面展示上几乎没有区别,区别就在于逻辑的处理,可以根据订单进行返佣操作。
-
网络请求、数据解析
最开始使用的是 httpurlconnection ,通过流的方式去处理数据,后期有 volley、xUtils,在后来 okhttp 出现,使用的是 OkGo(那时候还是 MVC 模式)、在后来就是现在的 MVP + Rxjava + Retrofit。
-
页面、动画
想要做一个动画的过程:先把你需要动的 view 先画出来,然后通过 动画 让他动起来,最后在加上手势判断,添加逻辑。
- 画出来:
- 动画 :属性动画(Property Animation)、视图动画 (View Animation)。
- 设置动作:平移、旋转、缩放、渐变。
- 设置属性:时长、重复规律、速度拦截器(匀速、加速、减速、回弹等,也可自定义)
- 特殊场景:ArgbEvaluator 颜色渐变、自定义 Evaluator(设置起始值、根据动画完成度,自行定义函数),
- 复杂场景:使用 AnimatorSet 来同时管理调配多个动画;
-
优化:页面、内存
- 页面:过度绘制、边界布局。
- 过度绘制(Overdraw):开发者模式,调试 GPU 过度绘制。
- 移除默认的 Window 背景
- 移除控件中不必要的背景
- 减少布局文件的层级(嵌套)
- 边界布局
- Hierarchy View 工具
- 尽量让布局扁平、减少嵌套、RelativeLayout 代替 LinearLayout、使用 include、merge 等标签 。
- 过度绘制(Overdraw):开发者模式,调试 GPU 过度绘制。
- 内存:溢出、泄漏。
- 内存管理
- Android 性能优化
- leakcanary 内存检测工具 LeakCanary使用详解
- 页面:过度绘制、边界布局。
-
安全: 安全这里接触的比较少,一般就是代码混淆,加 360 加固。
-
其他:
- webview 交互:坑多、很多个性的问题。
- 交互:
-
- Android 调用 js 代码。
-
- js 调用 Android 代码。
-
- 具体 Android WebView与 JS 的交互方式
- 页面适配:文件适配,算好各种分辨率文件,放到资源文件中,通过
@dimen/..
引用。 - 新控件: 新控件
- webview 交互:坑多、很多个性的问题。
-
代码管理:
- git :GITHUB 系列。
- svn
3.经验踩坑
- java 的值传递。引用数据类型和基本数据类型在当作参数传递时、要时刻明白传递的是地址值,还是值,对数据进行修改时,会不会改变值。
使用滚轮的三方库,传入 list,在回调中根据返回的 position 取值发现 list 数据变了,在他的代码里发现他是直接进行了赋值操作,在滚动时对 list 进行了修改导致。
- 启动模式 singleTask 。
在重新开启页面的时候,不会走 onCreate 方法,会走 onNewIntent 方法。
- 没什么特殊情况的话,在 build.gradle 中最好使用指定版本。
高德地图 : 使用的是最新版本,恰巧使用 tinker 打补丁包,发现包大了 20 多兆,查找发现因为使用的是 last 版本,自动更新了,最后改回指定版本。
- 学会换位思想,可以减少沟通成本。
开启你的 activity 需要带哪些参数,可以在你自己的类里面写开启的方法,把参数带上。
- 使用重载方法,解决参数数量变化的问题。
分享功能:酒店分享新添加出入店时间,利用重载方法添加参数,省去修改其他掉用方法。
- 尽量和 ios 端统一变量和逻辑。
这个坑实在是太多了,历史记录最开始是本地保存,我和 ios 各写各的,后来需求开了,需要同步后台,发现我们本地数据类不同,又做的适配。活动页面,从列表进入详情,ios 列表判断是否过期,我进入详情后判断,造成了逻辑不统一。
- xml 中 include 相同的文件。
只有最上面的布局才会被注入到 activity 中,下面的布局需要手动 findviewbyid。做悬停页面的时候,通过 include 引入两个相同的页面。
- getTop()的方法获取的高度是相对于父布局。
邮轮的详情页面,添加产品下线时,展示推荐产品功能,布局进行嵌套(为了显示和隐藏),高度对不上,悬停错误。
- popupwindow 嵌套 edittext时,无法使用粘贴功能,系统bug。
处理:换成 dialogfragment 代替。弹窗查询手机号。
- popupwindow 中 edittext 无法获取焦点。
在 new popupwindow 的时候在构造时,选择为 true。
- view 实例化,最好使用
LayoutInflater.from(mContext).inflate(getResId(), parent, false)
。
- 使用 NestedScrollView 代替 Scrollview ,防止滑动冲突,以及嵌套 RecyclerView 的显示不全。
- 引导页面点击或者滑动进入,取消点击按钮。
setOnTouchListener 重写 onTouch 方法,进行手势就判断拦截。
- 机票日历选择页面,点击自动定位到中间位置。
重新设置 LayoutManager 中 smoothScroller 的 calculateDtToFit 方法实现。
- 7.0 的新特性的 apk 下载后的升级安装。
7.0 以后禁止向你的应用外公开。 Android7.0新特性,及Android N适配
-
TextView 和 SpannableStringBuilder。
有一些样式、间距等完全可以使用 TextView 和 SpannableStringBuilder 去实现。 比如:设置行间距、行数、超过指定字数以 "..." 结尾、设置折叠、字体居中。 只用一个 TextView 实现字体大小不同、颜色不同、加粗、删除线等。
- RecyclerView 复用的问题。
item 的状态、图片错乱这个比较常见,好解决。
酒店的房间列表,属于列表套列表,最开始数据全部返回,加载列表,没有问题。 后期列表的子列表改成单独接口访问,这就需要更新操作了,问题也就来了,列表的item notifyDataSetChanged 会产生新的 item 对象,新的 item 没有绑定 adapter ,刷新无效,但是我的子 item 显示隐藏还必须要刷新,就只能手动更新,不使用 notifyDataSetChanged。
- view.gone 和 invisiable 的区别。
在 RelativeLayout 中,两个 view 有依赖关系,当一个 view gone 时,另一个 view 就找不到依赖,位置就乱了。
- onWindowFocusChanged 方法里面去获取高度。
需要测量 view 的时候,onCreate 获取不到,页面还没有绘制完。
- notifydatechange 是在子线程进行更新,需要时间。
notifydatechange 之后直接调用滚动方法,可能位置会有问题。ScrollView 嵌套 RecyclerView 时,更新后,要通过 ScrollView 定位。
- ScrollView 滑动过快回调会不及时。
做一些悬停渐变的操作时,要在上下边界重新设置位置或渐变度。悬停和渐变。
- webview 和 h5 同步浏览器测试需要设置代码。
//用于同步浏览器调试
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
复制代码
- popupwindow 里如果使用的 listview 添加分割线时,在高度计算时,要添加上。
- textview 设置 drawable,更换图片。
Drawable drawable = getResources().getDrawable(R.drawable.signdown);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
复制代码
- 页面添加悬浮按钮时,最好单独写 view 非侵入的 xml,在使用时,直接 new 出来,add 进页面。否则需求改动,你就哭了。
- webview 交互 h5 时的数据类,需要包装。
var jsonStr = JSON.stringify(str);
复制代码
在接收的时候需要去除 "/"。 27. 预览 pdf 跳转浏览器,Android webview 没有 ios 的强大。 28. RecyclerView 的 adapter 如果有 if 一定要不全 else 否则会发生错乱。 29. 简单的列表建议使用 LinearLayout addview 使用。 31. 机票列表的数据和经停数据不在一个借口中。
列表一个接口,经停数据需要再次访问,访问后使用 map 存储,减少请求时间。
- 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)
performClick方法
- TelephonyManager 使用时,第一次会走无任何状态的回调,TelephonyManager.CALL_STATE_IDLE:
添加 一个 变量,第一次走逻辑。
- realm 与 新大陆打印之间的 so 冲突。so 的过滤。
- 屏蔽 home 按键引发的 Window type can not be changed after the window is added 问题
- dialogfragment 显示弹窗 中间有padding link
- edittext 设置整数和小数
android:inputType="numberDecimal|number"
- android rsa 与 java rsa 加密不同 link
4.规范
- Android 开发规范 :Android 开发手册
- 阿里巴巴 java 插件 :java 开发规约插件
- 版本控制规范:使用 GIT FLOW 管理开发流程
5.小技巧
- tips:
- ctrl + p :查看方法的传入参数
- ctrl + e :查看最近打开的文件
- F2:快速跳转到报错的代码
- alt + 数字键 :快速打开对应数字的侧边栏
- ctrl/ctrl + shift + r :当前页面/整个项目查找替换
- ctrl/ctrl + shift + f :当前页面/整个项目搜索
- ctrl + shift + f :生成成员变量。
- shift + f6 :重命名。
- alt + m :提取方法(我改键了)
- alt + i : generate 的弹窗
- 代码模版 :类似新建 activity 可以直接将 MVP。 所需要的类全都生成出来,不用一个一个新建。
- 阿里巴巴矢量图库
- tinypng图片压缩
6.其他
- 文案排版:中文文案排版指北
- 在学习技术之外,最好能在掌握其他的知识,比如:产品、运营
- 给大家推荐几本书:
- 社科类:《影响力》、《乌合之众》(心理学)、《启示录》(产品)、《原则》、《穷查理宝典》
- 技术类:《24 种设计模式介绍与 6 大设计原则》、《重构》、《大话设计模式》、