为什么80%的码农都做不了架构师?>>>   

从2016年4月到6月主要做的工作是网站的开发,而6月到现在2016年8月初,主要做的工作是Android和IOS两种App的开发,又以Android为主。

将这段时间的Android开发心得记录如下。

1.开发环境和参考资料

由于学会翻墙的时间比较短(2016年7月才学会),现在在用的mac版AndroidStudio是在国内某站上下载的。今年将开发环境由windows转为mac了,好在各种IDE都是跨平台的,迁过来后麻烦不多,Android Studio也贴心地支持Eclipse风格快捷键,使用技巧方面,《Android群英传》的第2章「Android开发工具新接触」讲了些很好的技巧。

同样因为学会翻墙比较晚,主力参考资料一直是手头的几本书籍:可以当词典用的《疯狂Android讲义》,手把手地带新手入门的《第一行代码》,优雅细致地讲Android体系结构的《Android开发精要》,这三本是2015年买的,很喜欢读,另外《Android群英传》《Android UI设计》《打造高质量Android应用》《App研发录》《Android开发艺术探索》买来后翻开的次数较少,感觉对不起它们。这几本其实也都是好书,以后要多看。

学会翻墙之后,Android官网也成了好选择,但不代表书本就没用了。官方资料的优势是正统和条理清晰,但在「最佳实践」甚至「黑科技」上还是一线程序员写的书更接地气。而当想深入理解底层原理、类库的作用时,官网是好选择,而不像书本上的知识会让你有「说得对吗」「没翻译错吧」「没过时吧」的担忧。官网和书本,应当优势互补。具体编程中遇到的各种问题,书本上当然不能穷尽,官网就更不可能了,这时候Google和StackOverflow就有了巨大作用,当然,这也不能解决一切问题,很多时候还是要耐心地慢慢调试。

2.页面知识

这方面《Android开发精要》讲得非常好:安卓的四大组件,被以「任务」的方式组织在一起,「应用边界」和「进程边界」都被打破了。个人感觉,这是学习Android编程时极为重要、应该最早学习到的基础知识。

四大组件中,Activity最重要,它名为「活动」,视为「页面」更容易理解。页面间的关系,以「栈」的方式组织,显示一个新页面即将新页面入栈,总显示栈顶的页面,点击手机上的返回键,则弹出栈顶页面,这些跟浏览器的「前进/后退」按钮的逻辑是一致的,有些时候需要更复杂的控制,例如A打开B,B打开C,希望关闭C时直接返回到A,则应在显示C时将B关掉,栈内元素由ABC变成AC,即可实现目的。

国人用App,习惯了底部标签栏,但官方只有顶部标签栏,所以只好自己实现,Activity中放一个Fragment和一组显示为标签栏的页面元素(具体使用的是RadioGroup,也可以使用别的元素,这不重要),实现当点击标签按钮时,菜单、标签栏、Fragment的样式和逻辑都符合要求即可。Fragment的生命周期和能力,跟Activity几乎一模一样,问题只在于当和另外Activity交互时,接到信息的往往是TabActivity(即Fragment所在的Activity),需要把消息从TabActivity转交给Fragment。菜单的控制也是,点击菜单的消息会到TabActivity手里,要由它转交给具体的Fragment。

Activity和Fragment(下简称页面)中的元素关系,与html的dom类似,是树状的层次,事件也是先由子元素接收,再冒泡到父元素。布局方面,LinearLayout(线性布局)和RelativeLayout(相对布局)最常见,线性布局可以思路清晰地将元素摆在一条直线上,线性布局嵌套,即可先行后列地摆放,类似bootstrap中的row和column,可以嵌套许多层,而RelativeLayout适合用来摆以元素之间的相对位置为核心的页面,在思路上比LinearLayout要复杂一点,但功能强大,布局层次扁平,页面效率高。这两者的关系有点像html中的布局:各种block和inline元素的使用是常规武器,大部分时间好用且省心,但个别时候则需要脱离文档流。

页面中具体的单个元素,则与html的dom中的元素也非常类似,有宽度、高度、margin、padding、背景色、文本色、字号等「样式」属性,因此正如html中可以把样式写在html里,也可以写在css里一样,Android页面的样式也可以拿出来放到style配置文件里,这样能减少重复,便于维护。输入元素中用户输入的内容,当然也能从该元素的属性中读出。响应事件的元素的响应函数注册,也是在该元素上直接声明即可,类似网页中的xx.onClick方式。元素和所属页面之间的关系,在页面的onCreate方法中使用findView找到该元素,并设到该页面的成员变量上。页面持有它的元素,元素拥有属性、输入值,并绑定有响应函数,这在任何有界面的编程中都是一致的。

3.数据知识

作为c/s程序,在本地当然有保存数据的能力,包括了键值对保存和数据库保存,这能力连html5后的b/s程序都具有了(5之前只有cookie的方式),Android这些能力的代码都很简单,不多说。

与服务器的交流,rest的交流方式是事实标准,这种交流方式保证了服务端写好rest接口后,开发的Android、IOS甚至Angular这种OPOA的网页程序都能共用这一套接口。rest的编码规范,网上早已有很多了,不多说。Android的HttpClient程序,只要指定url、参数、Get或Post等请求类型,即可发送请求,当服务器给出Http响应之后,Android程序可以从中拿到返回的json字符串,用JSON等库解析为集合或实体(其实json本质无非是map和list两种集合的混搭),然后遍历和取值,自动或手动构造成实体对象,然后改变页面的显示。在要页面显示时,由于Http返回的处理函数运行于另一个线程,直接调用页面的成员变量以试图修改其显示内容会报错。为此需要提早注册一个Handler,用于在接收到消息时读取页面的「数据属性」并改变页面显示,Http返回处理函数将数据更新到页面的「数据属性」中,向Handler发送一个消息,让Handler读取「数据属性」并更新页面即可。

在页面显示数据时,最常用到是ListView,可以定义一个Adapter,实现根据下标返回Item页面元素的方法,方法是声明一个Item布局文件,Adapter持有数据集合,在要实现的方法中使用传入的下标获得单个实体,再使用Item布局文件实例化一个页面元素对象,用实体的属性渲染页面元素对象,将页面元素对象返回即可,推荐使用ViewHolder来提高性能,这在包括《打造高质量Android应用》等书都讲了。

4.实践经验

有了上面1至3的知识,理论上即可完成App的开发,善于将各种编程技能元素组合使用即可(界面知识 + 数据知识 = 一切),但还有些具体工作了才会获得的经验。

在Android Studio中引入第三方库是使用Gradle,类似maven,写配置文件即可。

App上架方面360、百度、腾讯、豌豆荚、小米都成功上线了,华为和PP助手不允许非公司用户上线,没办法。

尝试手动实现定时轮询来获得服务器上的提醒,不成功,但对Service和BroadcastReceiver的理解更深了,Service的主要用途就是保证它打开的线程一直活着,但怎么保证这Service不死?一是设成常驻在通知栏的前台Service,二是在安卓手机「设置」里将该App设为「锁屏后继续运行」,还要将网络设为「锁屏后不断网」,以保证锁屏后线程能继续轮询并从网络上得到最新信息。而BroadcastReceiver的主要作用是,让两个相互之间解耦合得很好的组件可以互相通讯,只需要发起通讯那方指定一个字符串——既不需要访问对象,也不需要指定class类对象,指定一个字符串即可,这时通讯发起方根本不知道会不会有人响应它、会有几个人响应它,零个、一个、多个响应者都有可能,这就是「广播」的意义,可以联系「消息队列」来理解它,主要的目的是解耦。

虽然如此还是常有用户反馈收不到消息推送,只好使用专业的推送服务,目前使用的是「友盟」,文档很好,还提供了编程式发消息的sdk,测试也很友好,调了两天,用户基本能顺利收到推送了,当然还是要在手机设置中将App加入「锁屏后继续运行」的白名单,否则友盟的PushService被杀掉就收不到推送了。另外第三方的「统计」还在摸索。

程序更新提示的实现是在启动时向服务器发一个请求了解最新版本号,与本地程序版本号比对后,如果有更新的,则询问是否要更新。apk包是在Android Studio里签名打包之后,用360加固了之后(否则各平台不允上线),传到了「七牛云存储」的服务器上,在App获取最新版本号时,将最新的apk包的地址一并获取下来,如果用户同意更新,则在后台启动线程下载该apk包,下载完成后自动安装。

App的登录,是将用户名密码提交到服务器,服务器检查正确后返回一个token,App将这token保存在本地,以后请求api时附带用户名和token一起发给服务器,服务器检查用户名和token正确,则将关键的数据返回给App,否则视具体需求返回不完整的数据(未注册用户看到的数据不完整),或者直接返回错误(未注册用户完全不允许访问的数据)。注册时,则是生成一个验证码,将手机号和验证码存到库里,调用发短信的服务商的接口发到用户手机,当用户输入验证码发送请求到服务器,服务器检查手机号和验证码是否匹配,如果匹配,则注册成功。

Android页面中嵌入Html页面很简单,但这两者产生交互的功能还没做过,如果以后做到,再补充进来,这里留个TODO的「抽象方法」占位置。还有图像的延迟加载、数据库的使用,都要留个「TODO」。有时间即实践之。

5.个人感想

「应用程序员」做久了,总是觉得没太多成就感,虽然功能有人用会很开心。但当陷入没什么技术含量的细枝末节,觉得「知道这些东西仅代表有经验,没什么了不起」,就觉得很虚无。安卓的知识,对我来说最有趣的还是体系结构、界面的逻辑、数据的逻辑这三者,当陷入具体的事务,某个api该怎样调,函数有几个该怎样写,甚至最无聊的安卓各版本差异,就算做成功了,也觉得没什么好满足的。

而关于代码质量,在写了这么多年Java的服务器代码,用过市面上几乎所有流行框架,做过无数次封装之后,写这种App的代码,真提不起重构的兴头,「重构的第一原则就是不要重构」,这种思辩,恐怕没几个人辩得过我,因为我对在设计模式、重构、软件工程这些方面的阅读和思考量都非常大,而且逻辑清晰,文采飞扬,曾经而且如今也正在因一些文字被有大名气大影响力的人物欣赏,这些事情久了,就觉得无聊,很多时候人的火气不是来源于别人不认同自己,而是来源于自己不认同自己,当你对自己有了认同,就会觉得别人的发言很无聊,连反驳的兴头都没有,有那工夫,不如真真切切地读两本书,写两行代码。自身修为的提升,总要依赖于这些脚踏实地的努力,而非来源于口舌上的斗争。最重要的是,要知道自己想要的是什么。

转载于:https://my.oschina.net/u/866216/blog/729325

安卓版App开发心得相关推荐

  1. reddit android app,reddit安卓版app

    reddit安卓版app是一款社交聊天app软件,趣味互动丰富新闻内容,最佳排行兴趣排序,全新新闻社交方式,感兴趣的小伙伴快来下载reddit安卓版app体验吧. reddit安卓版app介绍 Red ...

  2. 安卓app开发工具_四川智慧社区安卓手机app开发多少钱

    四川智慧社区安卓手机app开发多少钱 注册登录应用公园后,有两种APP制作模式: 1.主题模式: 应用公园平台提供了上百个配置好的APP模板,可以直接使用,把图片文字替换就可以直接使用.如下图所示: ...

  3. take android,Protake安卓版下载,Protake安卓版app v0.9 - 浏览器家园

    Protake安卓版app是一款专业级的视频拍摄工具应用,能够为广大用户带来更为强大的视频拍摄体验,更为专业化的拍摄功能的服务,能够让广大用户轻松实现电影级别的画质拍摄效果,让用户能够轻松简单的进行视 ...

  4. 好分数阅卷3.0_好分数app下载-好分数网查成绩安卓版app v3.6.4.1-清风安卓软件网...

    好分数网查成绩安卓版app:是一个提供快速成绩查询服务的平台,让用户可以随时随地查看成绩,以及分析离自己理想的大学相差的分数.在这里,可以查看自己的试卷,分析错题,快速提高学习.好分数app,查成绩也 ...

  5. 小车手app安卓版下载_汽车助手安卓版app下载_汽车助手安卓版v1.0.0 手机版v1.0.0 手机版 - Win7旗舰版...

    汽车助手安卓版app,汽车油耗管理专家,能够随时记录汽车维修费.停车费.加油费等多种消费数据,轻松记录,智能分析,生成消费图表,更好管理汽车油耗.消费数据,方便又省心. 软件介绍 这是一款简单而又全面 ...

  6. 360安卓_有解商城安卓版App上架360及百度手机助手

    为提升用户体验,满足不同移动端用户需求,有解商城App已在各大应用市场陆续上架中. 今日,有解商城App已正式在360手机助手.百度手机助手上架,安卓手机用户可通过上述两个应用商店下载并安装使用. 同 ...

  7. 安卓物联网APP开发——基于编辑物联网平台环境实现远程控制数据传输

    本篇博客主要对app进行开发来实现对esp系列芯片的远程控制,通过mqtt协议来进行数据的传输,用wifi模块接收数据串口收发数据到单片机上使用,可远程操控. APP开发(Android Studio ...

  8. 华为手机助手安卓版_渲美手机恢复助手安卓版安卓版下载-渲美手机恢复助手安卓版app下载...

    渲美手机恢复助手是个非常好用的手机应用应用软件.ie小编强烈推荐哦,这个app不但能为你提供超多使用起来非常便捷的功能,还可以让你轻松对手机的系统以及内存进行优化,让自己不再因为手机卡顿而烦恼! 软件 ...

  9. 苹果版App开发心得

    之前发过安卓那篇,如感兴趣,戳我的名字看吧. 0.语言基础 去年购入mac开始学ios编程时用的是swift,今年用的是objective-c(下简称oc). 网上有将oc与java对比的博文,其实面 ...

最新文章

  1. 虚拟网卡与物理网卡TCP协议数据传输对比
  2. mybaits八:select查询返回map集合
  3. 2d的公式_用深度学习实现 2D 到 3D 的转换
  4. 上元节的灯会(灭)-区间dp
  5. mac如何删除用户或者群组
  6. 一元线性回归(Linear Regression)
  7. 基于MATLAB的汽车出入库计时系统 _matlab课程设计
  8. PS更换照片底色的方法(红底变白底为例)
  9. 快速掌握用户分层模型(RFM)的使用方法|【业务模型】
  10. QQ查询信息接口php源码,免登录获取QQ用户信息API接口源码
  11. Gerrit 工作流程及简单使用
  12. opencv19:轮廓凸包,距离与匹配
  13. 极光推送 java demo_android 极光推送demo
  14. 动态规划_(dynamic programming)_python_最大子序列(最长公共子序列)(可非连续子序列(several versions))
  15. day4new-转自金角大王
  16. Python学习周期一般多长?需要多久?
  17. php转调页面,怎样练到转调弹奏信手捏来,太实用
  18. 如何从TI官网下载芯片的AltiumDesigner原理图文件和封装文件
  19. clickhouse列转行
  20. 【软件工程】UML序列图

热门文章

  1. 动态HTML事件(Event)小结
  2. 【跃迁之路】【468天】程序员高效学习方法论探索系列(实验阶段225-2018.05.19)...
  3. SylixOS DNS浅析
  4. 4 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之Lvs为Mysql-slave做负载均衡
  5. RedHat Enterprise Linux 7下安装 Oracle 12C
  6. Android ListView 下拉刷新 上拉更多[实例]
  7. 为什么说《让子弹飞》是古今中外的神片
  8. Q77:怎么用Ray Tracing画仿射变换之后的图形
  9. 问题五十九:怎么求一元六次方程在区间内的所有不相等的实根(1)
  10. 在用ganglia时出现You don‘t have permission to access ganglia on this server