为什么网上随便百度一个身所公司负面新闻就有负面的信息啊。就算前几页没有,后面也有。身所公司负面新闻有负面该怎么处理呢???

我的Android之旅——学习、项目、心态 - 文章 - 伯乐在线
& 我的Android之旅——学习、项目、心态
学习Android也一年多了,项目做了五六个,有大有小,有难有易。一直以来都没有好好总结过,今天周六休息,就写下这一年多从事Android以来的一些感想和小经验。涉及学习、项目和一些个人感受。
我是从11年5月份开始接触并学习Android的,在那之前有过一年的J2EE的经验,做过三个J2EE的项目,从08年开始接触Java,所以到去年学习Android时,开发语言上我还是比较熟悉的,这也成了我为什么学习Android的一个理由。还有一个更重要的理由就是接下来的研究生学习中,Android也是我一个比较重要的方向,所以我选择在没开学前就开始自学Android。
我有一个学习癖好,我喜欢看视频去学,然后马上根据视频中讲到的东西去练习,然后反复去重复,刚开始可能不理解,但是在不断的重复中有两个好处,一个是对Android的使用熟悉了,还一个更重要的是在重复中逐渐对知识进行理解了。刚开始我的学习资料全部都是视频,加起来有好几十G,最先看的是Mars的学习视频,在网上是公认的对Android基础讲的比较不错的视频教程。我从第一集完整的看到了最后一集,里面的每个小例子都做了一遍,有的甚至还看了几遍,从最初对Activity的不理解到后来的轻车熟路,这是一个过程,学习的过程就是不断解决问题的过程,遇到困难不去逃避才是成功的最大保障。Mars的视频看完后我又看了一个专门讲Android小项目的视频(地址:/topics/2847310/),讲这个视频的是个大学生,学Android比较早了,貌似也是湖南的(我是湖南益阳人),总共三个小项目,分别是通讯录、手机卫士、应用管理器,虽然都很小,但是对刚学过基础的我来说确实是一个比较不错的练手资料,我从头到尾的边学边做了一遍,然后又自己独立做了一遍,这一遍就加了自己的一些改动和延伸,虽然是做同样的事,但是第二遍的感觉跟第一遍完全不一样,从思想上去理解与从流程上去理解是完全不同的。这样,我的Android小项目就完成了,通过第二波的学习,我对Android的框架和基本使用就基本没问题了,收获到的经验就是:不断深入理解、重复、重复、再重复。不要觉得已经看过的知识点就已经理解了,其实随便一考,还是不会。所以,别给自己偷懒的机会,别停留在心里的舒适区域,不断挑战自己才能取得成功。下面贴出我最先完成的两个小项目的截图,很简单,但是是我的第一件作品:
上面这个是我做的第一个App,功能很简单,就是把当前手机中用户自己安装的应用全部列出来,然后可以在这里打开,卸载和查看详细信息的操作。功能简单,但是做完这个,对Android的使用已经有了初步的认识。
接下来我又做了第二个App,实现的功能是手机防盗,根据判断用户手机SIM卡的唯一序列号来进行识别,绑定安全号码后,如果手机的SIM卡被更换,就会再下次开机时自动发送一条短信给安全号码,信息的内容包括对方更换的SIM卡的电话号码和位置信息以及SIM卡的其他详细信息。界面截图如下:
做完这两个小项目以后,我开始了继续的学习,这次的目的主要是深化知识体系,深入了解Android框架的原理和使用,配合更多的练习和重复来强化自己的知识体系。还是一样,这段时间我又看了一套视频,是由Sundy讲的一套Android视频,这套视频的目的是结合Android源码来讲的,讲的比较深入,适合提高阶段来学习,同时,他也会配套一些练习,这套视频的讲授过程结合思维导图来进行,思维结构特别清晰,是一套非常不错的视频教程,有时间可以多看几遍。随后也看过传智播客黎活明老师讲的Android开发视频,感觉这位老师实力真的很强(台湾人,普通话不是很好),我有个同学在传智播客学过,说这位老师为人很低调,但实力非同一般,年薪100W+,也是传智播客的几位大牛级人物之一(这里没有广告嫌疑,只是顺便说说,嘿嘿)。关于视频部分,后来陆陆续续还看了几部,不过这期间以动手练习为主了,像以前讲微博客户端的那些我都看了一下,其实,那时(月左右)网上的Android视频还不是很多,经典的就更少,现在很多啦。与此同时,我开始关注像CSDN和开源中国等一类的技术博客,在上面寻找一些有用的学习资源,包括一些电子书和一些别人做的小Demo小教程,通过这些,可以了解别人的学习思路和过程,通过看电子书,可以更扎实的掌握Android的基础知识。后续我也陆续看过几本Android开发的书籍,这样可以更系统的了解知识体系,弥补了前期看视频的一闪而过。
期间还做过一个APP,这个我只负责界面制作,也是通过这个项目使我对布局和Android界面实现有了一个很大的进步,具体请看以前我写的
到了这个阶段,研究生开学了,我也就进入了学校,开始了研究生的学习和生活,那个时候,我已经算有初步的Android开发经验和知识体系了,可以说走在了其他同学的前面,加上以前不算很久的J2EE经验,很快就被大家认可,并被选为我们学习组的组长,负责班上10个同学的Java基础辅导和Android辅导,那个时候每周我们都会找一个晚上聚在一起,首先我会跟大家讲一些Java基础知识,然后会讲一些Android最基础的内容,因为那个时候Android知识体系还不是特别健全,所以给大家讲Android基本都是入门级的,就这样,我们坚持了一个学期,为此,我还专门做了一个计划,内容基本涵盖了Android的初级知识体系,到最后也基本都讲完了,通过这段经历,使我对Android知识的理解又有了更深一层的认识,真正自己讲出来的和在脑子里理解的还是不一样,自己的永远是自己的,但讲出来给别人听,确实需要对知识理解的比较完整。在研一的第一个学期,我完成了从Android初学者到初中级Android开发者的转变,在此期间,通过两轮面试,我进入了北航爱立信联合实验室,直接进行Android项目的开发工作。
进入爱立信实验室后,导师分配给我们每个人一个项目,那时只是个很抽象的概念,一个名字和一些简单的描述,然后我们就开始做。我做的是一款名片类应用,到现在为止,我还在做这款应用,这款App已经经过了几个版本的迭代,功能也是越来越全面,现在,这个项目已经成了实验室的重点项目,人员也从最初的我一个人,到现在由我带领的一个五人团队,有Android开发、有UI/UX、根据功能,我们后续又增加了服务端开发、IOS版开发。到现在,我们仍然会继续把这个项目做好做大。这里贴出来目前最新版本的截图,不足之处,还望大家见谅,哈哈
现在这款应用已经在Google Play上发布了最新版,名字叫CardBox,这个软件从最初的构思、设计、实现基本上是由我一个人完成的,后续组成团队后,也有团队成员的共同努力,感兴趣的朋友可以去下载试用,给出评价意见供我们改进那就再感谢不过了,呵呵。
附上Google Play上的下载地址:
接下来继续讲我的Android学习之旅吧!
在此期间,我又陆续做了几个项目,一个是学校课程的项目,也是由我带一个组进行设计和开发,这个项目是一个移动图书馆,我们自己利用J2EE技术做了服务端,然后用Android做客户端,功能很简单,但是这个项目让我们的团队成员都发挥了各自的能力,分工明确,大家一同努力的感觉很好。同样附上这个项目的几个截图:
这个项目我们主要实现了登陆和书籍查询的功能,同时用到了科大讯飞提供的语音查询API,这也是我们的特色之一,另外就是支持把自己感兴趣的书籍分享到SNS平台,分享这一块我们用的是友盟提供的SDK,目前支持新浪、腾讯、人人网分享。这个项目我主要负责项目的统筹管理、Android端设计以及基本实现,我们的分工是我负责移动端设计开发,另外两名同学协助我,一名同学负责需求分析与文档整理,两名同学负责服务端,这样下来,到最后答辩的时候,我们的效果还是不错的,呵呵!
到这里,我的Android知识面相比最初开始学习时,已经丰富了很多,当然,开发的过程中会遇到很多问题,包括不会的知识点,包括bug等,对于新知识点,我一直认为不断的学习非常重要,不能因为一个点不会就放弃或找别的方法,如果这是最优方案,那就一定要去学。关于开发中的bug,做软件开发都不可避免遇到这个问题,沉下心来,仔细分析、不浮躁,问题总会解决,我对bug的看法就是这是一个重新审视自己写的代码的机会,从中会收获很多。
接下来,通过朋友的介绍,我接了一个外包项目,这是我第一次接项目来做,项目是一个手机连锁的移动终端,有服务端支持,我负责Android端的实现,整个项目由我一人负责,同时我也找了一个同学来协助我。这个项目是我目前做的最大的一个Android项目了,它涉及三个权限,功能覆盖定位、网络操作、数据解析、存储、通知、服务、下载、广播和与服务端的轮询,涉及的知识点比较多,时间持续了两个多月,代码总共2万5千多行,当然这个项目是有报酬的,具体多少我就不说了,呵呵,但是是我目前自己赚到的数量最多的一次了,包括现在这个项目还在由我自己维护。通过这个项目真的学到了很多很多,一方面是对Android知识的学习和真正的运用,还有就是参与这种真实的商业项目开发所接触到学校所不能接触的东西,包括团队协作、管理等。在服务端与客户端接口设计那段时间,真的是非常头疼,光接口我们就开了不少会,接口版本就改了十几版,期间功能也不断更新、移动端界面也不断在改,很庆幸,这个项目我们顺利的做下来了,项目团队中我最小,负责服务端的都是有十来年开发经验的人,和他们比我真是小巫见大巫了,但真的学到了不少。这里我就不贴界面截图了,因为涉及商业机密,因为这个项目是他们集团内部使用的一个项目。
最后我要介绍的一个我参与过的项目也是一个商业项目,这是一个公益平台,由我们实验室的几个人接的一个活,我主要负责项目的界面实现以及几个小功能的实现,这个项目我接触到了一个比较正规的项目架构,带我们做这个项目的是以前百度出来的一个人,他现在自己在和朋友开公司,通过朋友介绍,安排了一个项目给我们做,我们也把这个当做一个机会,以练习为主,主要学习到了一个优秀的Android项目架构,学习了一些平常我们不用的只是,比如Monkey测试,这个在以前我就没用过,包括局部调试,以往调试都是把项目全部运行一次,用了局部调试,真的是省时省力。这里我贴一个那时我们还在开发中的一个截图,大家看看就行,基本功能类似微博,服务端是由他们自己做的,把各大微博平台的数据收集起来到这里展示,大部分功能都类似微博:
不管做什么,好心态永远是最重要的,像IT行业,更新快、竞争大。我们无法时时刻刻保持自己在最新状态,所以,要保持一个好心态,不断学习的同时要把生活过好、把身体锻炼好,本来身处这个累心累身的行业,尤其要注意这点,对自己好点,别跟自己过不去,有难题,先放放,整理思路,调整心态,大不了重新出发。同时,也要坚持,坚持自己的原则、坚持自己的梦想,踏实的走好每一步,辉煌总将来临。平时多发现生活的美好,和朋友多聊聊,和家人多沟通,提高自己的生活品味,过好每一天,体验每一天。工作、学习、生活三者平衡,把这些做好,我们的人生一定很美好,不求完美,但求充实。
以上就是我学习Android的一些精力和一些做过的项目,还做了一些其他的小App,这里就不一一列举了,通过这些项目,一方面是让我对Android开发有了深入的理解,另一面是对团队协作重要性的认识,自身再强大,如果没有一个团队的支持,那是无法取得最大的成功的。所以,现在我全身心投入实验室的项目,希望我们这个团队能把事做好,把团队做好,把项目做好。我想,明年初,我们会交出一份满意的答卷。学习无止境,永远有一颗向上的心很重要,永远不要对自己满足,永远不要安于现状、永远相信自己的潜能无限大,做好人,做好事,成功离我们很近。
没想到我写的这篇分享得到了这么多人的肯定和关注,特别感谢大家鼓励的话语,着实给我增添了很多信心,希望和大家多交流、多分享,一同成长,也希望大家多提意见。我将继续将我的学习分享进行下去,希望能给后来者以参考,也希望前辈能给出指导!最近我在学习IOS,我会将自己的学习笔记分享在BLOG中,另外也会经常更新Android后续学习的一些笔记(主要以官方文档为主),希望大家继续关注,并给出宝贵意见!谢谢大家!
欢迎关注我的新浪微博:
关于作者:
可能感兴趣的话题
写得很好!很有启发!我也是安卓初学者,现在正在培训!很感谢你分享你的学习过程!
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线Android&企业需求与开发者状况简析
& & & 随着
大行其道,目前国内也有越来越多的企业投身其中,而从企业的招聘与人才缺口的观察中,还是让我找到了那么一些不同。也比较好的解释了为什么现在企业很难招到
Android 高端人才,而又有一些 Android 开发者面对着高薪也不愿意去企业内就职。
首先我想明确一点,那就是招聘和应聘这回事,其实是一个互利的过程,企业需要有人来为其项目进行服务,而开发者也希望通过自己的劳动,来为自己谋取福利。当双方通过协商达成一致后,招聘就成立了,而目前的主要问题,并不是协商,而是信息,双方需求信息的可靠性,对对方需求的理解情况,将直接导致一次招聘的成败。
& & & 我的
上有很多猎头,有很多都是专职做移动互联网方面的推荐的,从这一方面来看,也可以说国内移动互联网发展得如火如荼吧,也有一些猎头是有技术背景,很有经验的。通过与他们交谈,我大致可以提取到以下的一些企业需求:
三年以上 Android 开发经验
曾经独自完成过一个较大型的项目,例如微博客户端,手机阅读器等
& & & 3) 精通
Java /J2EE 开发
& & & 4) 熟悉
Android 系统构成,熟读 Android 源码的优先
可以把 Android 程序界面做成 iPhone 那样的优先
能破解,修改他人程序的优先
而从我自己与业内的开发人员交流,以及我面试到的人才来说,也可以大致提取出人才对企业的需求
薪资位于行业内中高水平
能按自己的想法编写代码,不要有过多的限制,特别是不要强迫写文档
在想做一些自己的研究的时候,可以占用上班时间,甚至停下手里的工作
有一个自由上国外网站的环境
做过一阵子之后,可以不再写代码,转做管理
简单的对比一下,身为开发者的你是不是觉得有些招聘需求很无喱头,不屑和这样的公司为伍;或者身为 HR
的你觉得开发者要求太高,要在简历筛选的时候先扔掉他们的?在这种情况下,人才能够适配到适合的岗位,几乎就是梦话。
下面我简单的分析一下企业的需求。
一) N年的经验到底重不重要?
& & & 谁都知道
Android 是一个新领域,它是 2008 年底才兴起,并被人广泛得知,现在是 2011 年底,正好三年,难道你想招一个从 2008
年就搞 Android 的人?这样的人并不是没有,但是也不多。因此 Android
领域内的招聘,凡是遇到“三年”这个需求的,也就固定了猎头只能找那些人。其他的 Android
工程师,没有三年那么久的经验,但是并不代表他们写不出优秀的应用。说到底 Android 开发并不困难,我在盛大做 Android
培训数十期,也遇到过不少完全没有编程基础的人,一周培训可以通过考试,然后再一个月进项目组开发实习,出来后换岗直接做公司项目,现在也做得好好的。关键问题在于有没有学习欲望,愿不愿意提升自己,经验可以让一个人在遇到某些特定问题时,快速拿出解决方案,减少一定的成本,但是有的时候,经验也会固化一个人的思想,使他不愿往新的方向走。我需要有经验的人,但是我更需要勇于创新的人。
二) 独自完成大型项目指的是什么
我曾经写过一篇文章,说骑士作战和兵团作战的。虽然目前的移动互联网世界里,越来越适合单兵作战,但是同样也不应该抛弃多人合作的模式。往外说开,Android
也不是一个人“独自”完成的。另外什么是大型项目,在这点上完全没个准,微博客户端是大型项目吗?阅读器是大型项目吗?可以是,也可以不是。在我的理解上,一个项目只要包含明确起止时间,有具体详细的需求和策划方案,有成果时间约束性,有组织架构,那么它就是一个大型项目。这样的东西一个人能完成吗?我不排除这个可能性,但是很难。一般情况下,企业需要了解的,是一个开发人员对代码的掌控能力,不妨将这一条改为“代码掌控力5万行”或是其他。
三) 精通 Java / J2EE?
& & & 虽然
Android 是采用 Java 作为其主要开发语言,但是要求精通 Java 或 J2EE,这着实有点扯蛋。移动开发的思想和 PC
或服务器的开发思想几乎完全没有一致性,精通那些做什么,不如说熟悉 Java 语法来得实际。至于说 J2EE,和 Android
更是半毛钱关系都没有。说到这里,还得再提一下,有一些企业招聘时,会附加说有 C 语言经验的优先,这是对的,一个精通 C
的人,的确可以在 Android 下大有作为,虽然他们写的东西往往用户看不到。举个简单的例子,加解密模块,当然用 Java
也可以写,但是用 C 写可以大幅提高性能,你是用户的话,你会选性能高的还是低的,不用说了吧。另外就是 C
拥有最好的可移植性,这点也不用说了。
四) 熟悉 Android 架构和源码
我想这点不用说了,可以说是业内的共识,如果自己没下载过 Android 代码,没编译过 Android
系统,那还是花点时间自己研究一下吧。唯一让我不爽的地方,就是很多企业口口声声的要求开发人员熟读 Android
源码,可以在源码基础上做修改,但是连一台 Linux 都不给配,难道让人都去折腾 CygWin?
五) 把 Android 做成 iPhone?
每当我听到这种需求,我都会忍不住想骂人,想把程序做得像 iPhone 的界面,为啥不直接搞 iPhone 开发,非要在 Android
上折腾那些,搞得一点个性都没有。以上只是我个人的看法,当然我也承认 iOS
在很多方面的确做得很好,值得学习。但是有一点始终请你记得,移动设备不是 PC,在 PC 做开发,你可以做到
Windows,Linux,Mac 各平台行为表现都一样(如
Eclipse),但是在移动设备上,应该尽可能的发挥平台特性,让用户觉得他购买的设备物有所值,追求几个平台表现形式一样,硬要把
Android 搞成 iPhone 的,我只想问你们,它们真的一样么?
六) 会破解和修改
这是我听到的最无喱头的招聘需求了,也许是中国特色吧。很多猎头给我打电话,问着问着就会提到,“你会破解软件的吧”,“你有没有做过给一个已经发布的软件加上自己的广告啊”诸如此类的话。我就不明白了,这种技术不是应该被封印的么?行业里面用破解手段的,仅仅是为了学习研究,如果用来取消他人的收费限制,或是反编译后恶意修改,这不是一个正当的技术人该做的事。作为我个人来说,我鄙视这样的公司,但是我也无法阻止,或许你作为一个开发者,在应聘的时候看到这个需求,你知道怎么做。Google
上曾有人这样说,“虽然我能力有限,也没做过什么好产品,但是我的每一行代码都是自己写的,光凭这点就比国内很多公司强”。很多人并不明白代码在开发者心目中的地位。
好了,说完了企业,再说说开发者吧,不知你有没有发现一个现象,就是越来越多的开发者,都不再趋向于写代码,而且趋向于“指挥他人写代码”。也许是因为写代码太累,或者是不想老是受人指挥,又或者是觉得自己的年龄不再适合,总之会有一个理由。但是从我个人来说,我还是偏爱写代码,与策划斗,与测试斗,与电脑斗,其乐无穷。
下面来说说开发者的需求吧,与企业的完全不一样,也许企业的招聘人员,真的该看看什么是应聘者真正的需求。
一) 薪资待遇
一个开发者不要高薪,几乎是不可能的,应届毕业生做 Android 开发,往往也能拿
8~10K,足以证明这个行业有多火(当然你也可以说它是泡沫,我不反对)。这个我不想多说,要求高薪是对的,当然前提是自己清楚自己的能力,如果你说你刚学
Android 开发一个月,连 eclipse 都配得不熟练,就想要 20K 的工资,那我只能对你说,have a good day
二) 按自己的想法写代码,不写文档
的确,做开发的都比较随性,就拿我自己来说,我很有可能一整天什么都写不出来,也有可能啥时灵感来了,两天两夜不睡觉也要把东西写出来。所以对于开发者来说,一定程度上的自由很重要。如果一个项目只有你一个人做,那么想怎么写代码都随你。但是对于一个需要多人合作的项目来说,完善的代码规范和文档也是有必要的,它可以帮助到以后的维护。开发人员不愿写文档是不对的,毕竟没有人比身处前线的更了解每句代码的作用,实在不愿写文档的,也把注释写得漂亮点吧,省得以后麻烦,如果文档注释都不愿写的,那你还是自己写个应用传Market吧。
三) 可以占用上班时间做自己的研究
其实现在允许员工这么做的公司不少的,所以基本上不必担心,当然这还是有前提,就是在你已完成了当前自己手头的工作,拥有空余时间时,可以这么干。要说停下手里的工作来做自己的研究,这就比较难了,先看看自己遇到的是什么主吧。做个广告,盛大创新院是鼓励员工这么干的,100%的时间都可以用来做自己的研究,而且创新院也有很多
Android 项目,非常棒。
四) 自由上网
相信这点也不需要多说,国内的网络环境大家有目共睹。对于这样的要求,企业有什么理由不满足呢?我以前也待过一个完全不允许员工上网的公司,生不如死。对于现在的移动互联网企业,没有网络还做啥事?曾经有人跟我这么说过,“连个
Android SDK都下不到,这样的公司还做啥开发”,“不给我上
twitter,钱再多有屁用”,这虽然可能是一时冲动或是面试时受了点气才说出来的话,但是目前开发者对网络的需求,的确日益强烈了。
五) 要求有转做管理的机会
其实这点我很能理解,因为我也是从这条路走过来的,被策划和测试压着通宵加班并不好过,我也曾经很想很想跃升比他们更高的职位,然后把那些欺负过我的人全炒了。但是当我真的坐上了经理的位子,手下有了一班人之后,我开始理解最初身为程序员的那些事。其实说白了也很简单,因为公司要项目,项目就要人来做,项目组里有各种各样的人,有各种各样的沟通问题。开发的人往往理解代码很在行,但是理解需求却往往不那么顺利,一趟代码写下来,与需求往往有出入,这能不改吗?也难怪策划和测试要盯着了,大家都承受了压力。相信你在网上也看到过很多描述程序员悲惨生活的恶搞图片,而事实上,程序员要的并不是那个管理职位,而是要一个有人倾听,认同其发言的机会,他们也需要被尊重。
对于企业来说,一个合格的 Android 开发人员可能是这样的
& & & 1) 熟悉
Android 框架,阅读过 Android 源码
& & & 2) 熟悉
Andorid SDK,特别是网络,线程
有较强的代码掌控力
懂一点 NDK 或 C (精通就更好了)
& & & 5) 使用
Git 来管理代码
开发者的需求总结起来也很简单
符合自己能力与产出的薪资待遇
一个能够发挥自己能力,且受到尊重的环境
可以满足自己学习、提升能力的愿望
优秀的网络环境
到了这里,身为开发者的你,是不是觉得企业的需求其实也不那么扯蛋;身为 HR 的你是不是觉得开发者也挺可爱的。
回到一开始说的,招聘和应聘是一个互利的过程,企业需要想清楚自己要什么,能给什么,想清楚自己的发展计划,千万不要为了与同行抢人才,提出各种不合理的需求,比如说明明是做客户端的,却说要有
开发的经验,这样会把人吓跑,就算招到了人才,他也会认为自己不受重用,对企业越来越没有信心。而作为开发者,要明确自己的能力,做好自己的职业规划,没有哪个企业愿意招一个光说不做,或是不知道什么时候就跑路的人。
在当前移动互联网越来越火的情况下,无论企业或是开发者,都应该明确的想清楚,自己想要什么,想做什么,以靠谱的信息进行人才资源的交换及利用。不浪费人才,不恶意竞争,给予良好环境,给予尊重。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Android开发经验谈-很少有人会告诉你的Android开发基本常识
招聘信息:
作者: 授权本站转载。本文介绍Android开发过程中的一些基本常识,大多是一些流程、专业术语和解决问题的方法等。软件开发流程一个完整的软件开发流程离不开策划、交互、视觉、软件、测试、维护和运营这七个环节,这七个环节并不是孤立的,它们是开发一款成功产品的前提,但每一项也都可以形成一个学科,是一个独立的岗位,随着敏捷开发的流行,以及来到了体验为王的时代,现代软件开发更多的是注重效率和敏捷,而不是循规蹈矩的遵循这些开发流程,比如软件开发的岗位不再仅仅是个技术岗位,它需要去参与前期的设计和评审、可以在视觉和交互方面提出自己的见解,在开发的过程中需要自测程序尽快解决现存问题,运营和维护的过程中也需要软件的帮助。可见现代软件开发对开发者的综合素质(这并不是facebook所讲的全栈工程师)越来越高,自称为码农或者程序猿显然是不合理的,因为这个过程是脑力劳动和体力脑动并存,称呼自己为工程师显得更为合理。策划:需求收集(通过用户调研、灰度发布、大数据分析、竞品分析、领导拍脑袋等方式获取需求)、需求整理(将需求归类、划分优先级等)、将需求转换成解决方案(输出设计文档);交互:从心理学(利用人性的弱点)、人性化(心智)、个性化的角度将解决方案转换成可交互的功能和界面(需要输出交互文档),比如加载等待、消息提示、页面布局、页面内和页面间的交互逻辑、页面切换动画等等,这个过程中一般会使用Axure或者PowerPoint来制作交互文档;视觉:根据交互图,使用PhotoShop来做视觉效果,在Android上的图片格式大多是png和jpg,对于需要屏幕适配,程序又适合做屏幕适配的地方可以使用九图,格式为*.9.png。软件:根据视觉和交互效果将需求转化为具体的实现,在实现的过程中可能会因为需求、交互或者视觉的变动导致软件实现的变动,因为策划、交互、视觉这每一个环节都可能会有信息失真的现象,或者是由于市场环境的变化、获取信息不够准确、领导拍脑袋等等情况导致软件始终处于被动状态,所以现在会提倡敏捷开发、结对编程、程序设计、同行评审、单元测试来提高程序的灵活性和稳定性;测试:软件达到可交互的标准后,需要将可交互的程序提供测试,其中灰度发布(用户测试)、自测(开发自测)、SQA(品质保证)都算是测试;维护和运营:通过测试程序达到稳定标准后,软件就可以上线了,软件上线后,需要去维护,用户反馈的问题要及时解决、用户有疑问要及时解答;根据后台统计信息、抓住可运营的节日、民族文化需要做运营来提高用户使用产品的粘度,让更多的用户知道、使用产品都是运营应该做的。注:可以查看这个答案了解一个APP从创意到上线的具体流程,?可以查看笔戈科技的这篇文章了解一个手机(平板或其它电子产品也差不多)的诞生需要哪些环节,提问的智慧大多数工作都是以结果为导向的,特别是软件开发这个职业,绩效考核、KPI这些都是在考核你工作的成果,所以工作更多地是需要你解决问题的能力,至于学习这个事情,还是在工作之外的时间去做吧。对于提高解决问题能力我有两个建议:学会学习和思考:学习的过程中要广度和深度并存,Android应用开发本身对技术功底的要求不高(因为很多底层的东西都被google、框架、开源代码给封装起来了,多数时候你只需要看ReadMe或者API知道怎么用就可以了),更多地是在你遇到问题的时候知道这个问题能够通过什么方法和方式来解决。书要看,但多逛逛论坛、QQ群、Github、StackOverflow、CSDN博客专栏对自己都是有益的。学会提问:你身边有很多资源,比如同事、StackOverflow、QQ技术交流群、搜索引擎,当你遇到问题的时候完全可以利用身边的资源来解决遇到的问题,如果一个问题在一个小时之内自己都不能够解决它,我就会通过搜索引擎、Github、QQ技术交流群、同事、StackOverflow(以上排序是按优先级排列的)来解决它。如果你需要好的答案你就需要有好的提问,特别是在QQ群或者论坛,在提问的过程中需要体现出你的思考,能够通过搜索引擎解决的问题坚决不问他人,这是对别人的尊重,在这里推荐几个链接,认真看会对你有莫大的帮助:解决bug的方法为了写这一项我专门在知乎上提过一个问题:在知道如何快速解决bug之前,你需要知道什么是bug。没有完成策划、交互、视觉要求的功能,这不叫bug,这叫功能缺陷;一个功能完成后不能正常使用也不叫bug,因为它根本还没达到可测试的标准。我认为当你的程序达到可测试标准之后发现的问题才叫bug。综合我自己解决bug的经验和知乎上的回答,总结常见的解决bug的方法有(你想要高效解决bug的前提是你能够快速定位到缺陷所在的位置,所以以下方法多数讲的是如何快速定位问题,至于真正解决bug,需要你自己修改程序才行):断点调试:以Eclipse为例:1、打断点:(1)打断点:(2)清除断点:2、启动调试模式的两种方式:(1)通过debug as启动调试程序:右键工程名--]Debug AS --]Android Application --]模拟器或者真机会弹出......watching for the debugger......的提示框,不要点击等待其自动消失 --] 此时已经进入调试模式,操作程序到达打断点的地方。(2)在程序运行过程中,在DDMS视图下选中要调试的程序,启动调试模式:3、调试:请自行尝试F5、F6、F7、F8这几个调试的快捷键;4、watch成员变量:在调试的过程中,比如在执行for、while、do while循环、递归、系统回调等程序时可以通过watch来观察成员变量或者方法返回值的变化情况,watch的方法:注:更多关于在Eclipse IDE中调试Android程序的知识请参见:打印:打印调试的方法对于循环、异步加载、递归、JNI等代码段非常有用,特别是在循环中,在循环次数非常大时,通过打断点调试显然是一件费力的事情,这时候打印就显得更“智能”了,我通常会通过下面封装的打印调试类来输出打印信息,这个类可以打印print、log、行号、文件名、StrictMode等信息,当不需要打印信息时,只需要将DEBUG_MODE改为false就可以了:&&&&import&android.content.C
&&&&import&android.os.StrictM
&&&&import&android.util.L
&&&&import&android.widget.T
&&&&&*&调试打印类
&&&&public&class&DebugUtils{
&&&&&&&&private&DebugUtils(&){
&&&&&&&&public&static&void&println(&String&printInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&printInfo&){
&&&&&&&&&&&&&&&&System.out.println(&printInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&print(&String&printInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&printInfo&){
&&&&&&&&&&&&&&&&System.out.print(&printInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogI(&String&logInfo&){
&&&&&&&&&&&&printLogI(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogI(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&&&&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.i(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogE(&String&logInfo&){
&&&&&&&&&&&&printLogE(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogE(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&&&&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.e(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogW(&String&logInfo&){
&&&&&&&&&&&&printLogW(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogW(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&&&&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.w(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogD(&String&logInfo&){
&&&&&&&&&&&&printLogD(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogD(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&&&&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.d(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogV(&String&logInfo&){
&&&&&&&&&&&&printLogV(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogV(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&||&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.v(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printLogWtf(&String&logInfo&){
&&&&&&&&&&&&printLogWtf(&TAG,&logInfo&);
&&&&&&&&public&static&void&printLogWtf(&String&tag,&String&logInfo&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&&&&null&!=&tag&&&&null&!=&logInfo&){
&&&&&&&&&&&&&&&&Log.wtf(&tag,&logInfo&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&showToast(&Context&context,&String&toastInfo&){
&&&&&&&&&&&&if(&null&!=&context&&&&null&!=&toastInfo&){
&&&&&&&&&&&&&&&&Toast.makeText(&context,&toastInfo,&Toast.LENGTH_LONG&).show(&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&showToast(&Context&context,&String&toastInfo,&int&timeLen&){
&&&&&&&&&&&&if(&null&!=&context&&&&null&!=&toastInfo&&&&(&timeLen&]&0&)&){
&&&&&&&&&&&&&&&&Toast.makeText(&context,&toastInfo,&timeLen&).show(&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printBaseInfo(&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&){
&&&&&&&&&&&&&&&&StringBuffer&strBuffer&=&new&StringBuffer(&);
&&&&&&&&&&&&&&&&StackTraceElement[&]&stackTrace&=&new&Throwable(&).getStackTrace(&);
&&&&&&&&&&&&&&&&strBuffer.append(&";&class:"&).append(&stackTrace[&1&].getClassName(&)&)
&&&&&&&&&&&&&&&&&&&&&&&&.append(&";&method:"&).append(&stackTrace[&1&].getMethodName(&)&)
&&&&&&&&&&&&&&&&&&&&&&&&.append(&";&number:"&).append(&stackTrace[&1&].getLineNumber(&)&)
&&&&&&&&&&&&&&&&&&&&&&&&.append(&";&fileName:"&).append(&stackTrace[&1&].getFileName(&)&);
&&&&&&&&&&&&&&&&println(&strBuffer.toString(&)&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printFileNameAndLinerNumber(&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&){
&&&&&&&&&&&&&&&&StringBuffer&strBuffer&=&new&StringBuffer(&);
&&&&&&&&&&&&&&&&StackTraceElement[&]&stackTrace&=&new&Throwable(&).getStackTrace(&);
&&&&&&&&&&&&&&&&strBuffer.append(&";&fileName:"&).append(&stackTrace[&1&].getFileName(&)&)
&&&&&&&&&&&&&&&&&&&&&&&&.append(&";&number:"&).append(&stackTrace[&1&].getLineNumber(&)&);
&&&&&&&&&&&&&&&&println(&strBuffer.toString(&)&);
&&&&&&&&&&&&}
&&&&&&&&public&static&int&printLineNumber(&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&){
&&&&&&&&&&&&&&&&StringBuffer&strBuffer&=&new&StringBuffer(&);
&&&&&&&&&&&&&&&&StackTraceElement[&]&stackTrace&=&new&Throwable(&).getStackTrace(&);
&&&&&&&&&&&&&&&&strBuffer.append(&";&number:"&).append(&stackTrace[&1&].getLineNumber(&)&);
&&&&&&&&&&&&&&&&println(&strBuffer.toString(&)&);
&&&&&&&&&&&&&&&&return&stackTrace[&1&].getLineNumber(&);
&&&&&&&&&&&&}else{
&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printMethod(&){
&&&&&&&&&&&&if(&Debug.DEBUG_MODE&){
&&&&&&&&&&&&&&&&StringBuffer&strBuffer&=&new&StringBuffer(&);
&&&&&&&&&&&&&&&&StackTraceElement[&]&stackTrace&=&new&Throwable(&).getStackTrace(&);
&&&&&&&&&&&&&&&&strBuffer.append(&";&number:"&).append(&stackTrace[&1&].getMethodName(&)&);
&&&&&&&&&&&&&&&&println(&strBuffer.toString(&)&);
&&&&&&&&&&&&}
&&&&&&&&public&static&void&printFileNameAndLinerNumber(&String&printInfo&){
&&&&&&&&&&&&if(&null&==&printInfo&||&!Debug.DEBUG_MODE&){
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}
&&&&&&&&&&&&StringBuffer&strBuffer&=&new&StringBuffer(&);
&&&&&&&&&&&&StackTraceElement[&]&stackTrace&=&new&Throwable(&).getStackTrace(&);
&&&&&&&&&&&&strBuffer.append(&";&fileName:"&).append(&stackTrace[&1&].getFileName(&)&)
&&&&&&&&&&&&&&&&&&&&.append(&";&number:"&).append(&stackTrace[&1&].getLineNumber(&)&).append(&"\n"&)
&&&&&&&&&&&&&&&&&&&&.append(&(&null&!=&printInfo&)&?&printInfo&:&""&);
&&&&&&&&&&&&println(&strBuffer.toString(&)&);
&&&&&&&&public&static&void&showStrictMode(&)&{
&&&&&&&&&&&&if&(DebugUtils.Debug.DEBUG_MODE)&{
&&&&&&&&&&&&&&&&StrictMode.setThreadPolicy(new&StrictMode.ThreadPolicy.Builder()
&&&&&&&&&&&&&&&&&&&&&&&&.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
&&&&&&&&&&&&&&&&StrictMode.setVmPolicy(new&StrictMode.VmPolicy.Builder()
&&&&&&&&&&&&&&&&&&&&&&&&.detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
&&&&&&&&&&&&}
&&&&&&&&public&static&void&d(String&tag,&String&msg){
&&&&&&&&&&&&if(DebugUtils.Debug.DEBUG_MODE){
&&&&&&&&&&&&&&&&Log.d(tag,&msg);
&&&&&&&&&&&&}
&&&&&&&&public&class&Debug{
&&&&&&&&&&&&public&static&final&boolean&DEBUG_MODE&=&
&&&&&&&&public&static&final&String&TAG&=&"Debug";
&&&&}目视法:这适合于code review,但是不太靠谱,因为人的精力毕竟有限,有时候你多敲一个分号,缩进不对都有可能导致程序出现问题,但在代码量较少时是一个高效率的方法。自动化测试:Android的自动化测试(分白盒测试和黑盒测试)工具有:monkey、Robotium、Appium、云端测试(比如testin),具体用法可参见:排除法:调试、打印、目视这三种方法适合于可以复现的问题,对于随机问题(实际上不存在随机问题,只是问题不那么容易复现而已),比如在线程、音频播放、AnsynTask、Timer切换或者结束时刚好做了相应地人为操作导致出现灵异现象。这时候可以通过排除法来排查问题,具体的方法是首先大概定位到出现问题的位置,然后将代码一段一段地注释,观察程序现象,逐步缩小出现问题的范围。版本管理介绍在较大的软件开发过程中,可能有多个软件工程师同时开发一个项目的情况,比如有负责读取数据、获取网络数据等API封装的,有负责程序架构的,有负责上层界面实现的,为了能够最终编译一个完成的程序出来,需要将代码整合,这个时候最方便的方法就是使用版本管理工具,固定时间上传(比如每天、没改动一个功能等等),这样能够实时保证服务器上的代码是最完整、最新的,也可以避免由于自然灾害、电脑异常导致本地电脑挂掉损失掉代码的问题。常见的版本管理工具有SVN和Git,我也使用过CVS,关于版本管理工具的介绍参见:注:对于windows用户来说,建议使用乌龟壳系列的版本控制客户端,使用github的朋友可以使用github for windows客户端:编译通常我们用Eclipse或者Android Studio开发android程序时,只需要运行程序就可以在模拟器或者机器上运行程序了,但为了保证代码的完整性、能够在服务器上编译,需要通过编译工具将代码编译成apk,常见的编译工具有:、,但这两种编译工具都是需要通过手动敲命令来完成编译功能(当然你也可以自己写脚本来实现编译自动化),是一个持续集成的工具,通过它可以代码克隆、编译以及程序加密自动化,其实它也是通过批处理来实现的,ant、gradle和jenkins的具体用法自行谷歌,使用起来很简单,目前android studio和github上很多功能都是通过gradle来编译的。专业术语介绍以下解释完全是本人的理解,详细解释可自行谷歌。版本迭代:按照需求优先级,在保证基本功能OK后持续开发和升级,这样能够降低软件开发的风险,并且能够及时解决用户反馈的问题,船小好掉头嘛;敏捷开发:小步快跑,大概意思就是不要过于注重文档,要注重当面交流,能够在实现时高保真的还原用户的需求场景,并且能够快速地解决用户的需求。单元测试:白盒测试的一种,对核心方法通过写程序来测试自己的程序,单元测试的目的是让你有意识地降低程序间的耦合,保证每一个方法都是最小单元,但这对于测试程序逻辑是没有帮助,这是我自己的理解。。。灰度发布:先找一部分用户来使用即将发布的程序(这部分用户可以是随机抽取、制定年龄段、指定地区或者通过某种方式知道他是活跃用户),在测试的过程中给与用户一点好处让用户写用户体验报告、反馈问题等方式来发现程序存在的问题和缺陷;DA统计:也叫后台统计,通过在程序中埋点的方式,在有网络的情况下将用户的操作行为和数据上传到后台,将每个用户的信息都上传回来就叫大数据,通过建模对这些数据分析就叫大数据分析。开放平台:比如分享到QQ空间、分享到微信、讯飞语音、友盟的后台统计、天气、地图等等都叫做开放平台,它提供了一些开放的接口给开发者,方便开发者使用它的服务,开放平台多数服务都是免费的,但有时候也可能不稳定,比如用的人少它自然就活不下去了,然后就没有然后了。同行评审:你的同行和你一起看看你的代码,发现是否有问题;结对编程:在写代码的过程中,有个人坐在你旁边或者你坐在别人旁边,编写边讨论,降低程序出现逻辑和低级错误的概率。Android开发资源参见我的另一篇文章:建议尽量阅读,这才是原汁原味、不失真的开发指导;即使你认为设计程序是浪费时间,你只是喜欢写程序,至少你也得用思维导图理清思路,思维导图对于帮助你理解设计文档、理清思路有很大的帮助;不要用Intent传递大量的数据,这有可能导致ANR或者报异常;在退出页面后,系统不一定会及时执行onDestory方法,如果你在onDestory方法里做关闭文件、释放内存的操作可能出现退出程序又立即进入时,由于需要重新初始化这些信息导致代码重入的异常;在改动JNI后,运行程序之前记得卸载掉已经安装在模拟器或者真机上的该程序,如果直接运行,android不会load最新编译的so,也就不能立即看到修改后的效果;代码至少每天备份一次,或者是完善一个功能就备份一次,不要堆积之后一次性备份,因为在你的代码出问题需要回溯代码时你需要从服务器上重新取代码,同时也可以避免代码不是最新导致最后和其他人合并时不知道改了哪些地方;将打印信息封装成一个方法,用一个标志位控制这个这个方法的方法体是否需要执行,这样在由debug版释放到release版本时,不需要傻傻地一行一行地去掉代码,你只需要改变标志位的值就可以了;对于有返回值的JNI函数,即使你不返回任何值,用NDK编译JNI的时候也不会报错,所以在写JNI代码的时候,一定要仔细检查代码;JNI频繁读写文件操作会影响程序的运行性能,可以考虑一次性在内存中申请一块大内存作为缓存空间,用这种空间换时间的方式可以大大提高程序的运行效率;不要指望类的finalize方法去处理需要回收和销毁的工作,因为finalize是系统回调的方法,调用时机不可预见,切记;使用文件流、Cursor时,使用结束后记得一定要关闭,否则可能导致内存泄漏,严重的情况可能引发程序崩溃;优先使用Google搜索引擎(少用百度),如果不能正常使用Google搜索引擎建议通过代理、VPN、修改hosts文件等方式搭建梯子。这里提供一个免费的谷歌搜索引擎对于不需要使用硬件加速的activity(没有动画效果、视频播放以及各种多媒体文件的操作都可以关掉硬件加速),在AndroidManifest.xml文件中通过“android:hardwareAccelerated="false"”关掉硬件加速可节省应用内存;对于需要横竖屏转换的应用,又不想在横竖屏切换的时候重新跑onCreate方法,可以在AndroidManifest.xml文件中对应的Activity标签下调用“android:configChanges="screenSize|orientation"”;为了减轻应用程序主进程的内存压力,对于耗内存比较多的界面(比如视频播放界面、flash播放界面等),可以在AndroidManifest.xml文件中对应的Activity标签下调用“android:process=".processname"”单开一个进程,但在退出这个界面的时候一定要在该界面的onDestory方法中调用System的kill方法来杀掉该进程;在res/values/arrays.xml文件中定义的单个数组的元素个数不宜过大,过大会导致加载数据时非常慢,有时候你需要使用数组资源时数据有可能还没加载完成;一个Activity中最耗费内存的是activity的背景(多数情况如此,特别是对于分辨率很大的机器,一个界面的背景算下来都需要好几兆内存),所以在程序界面较多时,可以考虑将图片转换成静态的drawable,然后多个activity共用这一张背景图;可以通过为application、activity自定义主题的方式来关掉多点触摸功能,只需要在自定义的主题下添加这两个标签:&&[item&name="android:windowEnableSplitTouch"]false[/item]
&&[item&name="android:splitMotionEvents"]false[/item]很多游戏进入时,播放的片头动画多数是一个视频文件;Android单个dex文件的方法数不能超过65536个,使用模拟器代替android自带模拟器(它需要虚拟机vituralbox的支持,不过官网已经提供了一个集成虚拟机的安装包了,直接下载下来安装即可),可以大大提高使用模拟器的体验(流畅、快),它也可以以插件的形式集成在Eclipse中,给Application或者activity设置自定义主题时,最好不要设置为全透明,否则在activity按Home键回退到桌面的时候效果很渣;如果你需要取消toast显示的功能,在一个类中你只需要实例化该类一次(也就是说将Toast定义成一个全局的成员变量),这样你就可以调用mToast.cancel()了,我把它写成了一个静态类:&&public&class&ToastUtils&{
&&&&&&private&ToastUtils(&){
&&&&&&public&static&void&showToast(&Context&context,&String&toast&){
&&&&&&&&&&if(&null&==&mToast&){
&&&&&&&&&&&&&&mToast&=&Toast.makeText(&context,&toast,&Toast.LENGTH_LONG&);
&&&&&&&&&&}else{
&&&&&&&&&&&&&&mToast.setText(&toast&);
&&&&&&&&&&}
&&&&&&&&&&mToast.show(&);
&&&&&&public&static&void&cancel(&){
&&&&&&&&&&if(&null&!=&mToast&){
&&&&&&&&&&&&&&mToast.cancel(&);
&&&&&&&&&&}
&&&&&&public&static&Toast&mToast&=&
&&}你可以定义一个静态类来实现防止按钮被重复点击导致重复执行一段代码的问题:&&/**
&&&*&按钮重复点击
&&public&class&BtnClickUtils&{
&&&&&&private&BtnClickUtils(&){
&&&&&&}&&&&&&&&&&&&
&&&&&&public&static&boolean&isFastDoubleClick()&{
&&&&&&&&&&long&time&=&System.currentTimeMillis();
&&&&&&&&&&long&timeD&=&time&-&mLastClickT
&&&&&&&&&&if&(&0&[&timeD&&&&timeD&[&1000)&{&&&
&&&&&&&&&&&&&&return&&&&
&&&&&&&&&&}
&&&&&&&&&&mLastClickTime&=&
&&&&&&&&&&return&&&&
&&&&&&private&static&long&mLastClickTime&=&0;
&&}放在apk的assets或者raw目录下的数据文件最好做加密处理,在需要使用的时候才解密,这样可以避免在apk被他人破解时数据也被破解的问题;最好不要再activity的onCreate方法里面调用popupwindow的show方法,有可能由于activity没有完全初始化导致程序异常(android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid),如果非要在一进activity就显示popupwindow,建议用handler.post、View.postDelay来处理;对于自定义View,在构造方法里面是获取不到视图的宽高的(此时获取长宽都为0),需要在onMeasure方法中或者跑了onMeasure方法后才能够获取到视图的宽高,不过你可以通过在构造方法里面强制测量视图的宽高来实现在构造方法里获取视图的宽高信息,具体见如果你觉得在安装Eclipse后还需要配置android开发环境很麻烦,你可以直接使用ADT Bundle,它是一个懒人套餐,下载下来就可以用了,可以在下载。有时间看看阿里技术嘉年华、InfoQ演讲与访谈、Google IO视频,可以学习到一些解决问题、做大项目的经验。当应用中动画比较多,并且动画都是通过图片来切换的时候,可以考虑借用思想,这样就可以避免图片命名的烦恼。工具推荐代码对比:屏幕取色:梯子:思维导图: 在线工具:Android应用开发第三方解决方案下图为Android应用开发第三方解决方案汇总,有些可以借助第三方平台搞定的就尽量不要自己搞,一是可以节省成本,二是你没人家专业,原文链接:
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6196点击量4498点击量3643点击量3608点击量3282点击量2862点击量2792点击量2729点击量2643
&2016 Chukong Technologies,Inc.
京公网安备89

我要回帖

更多关于 身所公司负面新闻 的文章

 

随机推荐