安卓软件Android学完之后可以从事什么工作

专访邓凡平:Android开发路上的快速学习之道
发表于 16:34|
作者钱曙光
摘要:随着Android系统越来越流行,Android应用的需求也在不断变化,对于开发者而言,深入理解Android系统原理显得越来越重要。社区之星第22期采访了移动开发牛人、技术精深、乐于分享的邓凡平,感受属于他的那份正能量。
邓凡平(网名innost),毕业于中科院研究生院,资深Android开发工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解。现任Tieto信息技术有限公司高级软件架构师,主要负责Android系统方面的研发工作。《深入理解Android
卷I/II》作者,华章公司《深入理解Android》系列书籍总策划。此外,他对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究。我的学习方法是以点带面,建立自己的知识结构CSDN:请和大家介绍下你及所从事的工作?邓凡平:大家好,我叫邓凡平,来自湖南。2000年进入华中科技大学水电系,所学专业是水利水电与自动化。2004年进入中科院电工研究所读硕士,研究方向是超导磁体。2007年毕业后,进入中科大洋公司。从此跨入软件开发行业,至今已经6年。目前就职于Tieto公司,职位是高级软件架构师,主要负责Android系统方面的研发工作。CSDN:回顾你的学生经历,能和大家分享一些有趣的事情吗?邓凡平:从本科到研究生,我一直不喜欢所学专业,水电和超导都不喜欢。但是我并没有另起炉灶,而是希望在这些大专业里边找到自己的兴趣爱好点(我的网名innost就是国内一家超导技术公司的英文名)。硕士期间,因为要计算电磁场,发现Ansys是一个不错的工具,所以我就研究了它的用法。一个偶然的机会,我得以编写《ANSYS 10.0有限元自学分析手册》一书。该书已重印了十几次,至今仍是ANSYS入门书籍中最好的一本。(这里要说明一下,《ANSYS 12有限元自学分析手册》一书并非我写,只是出版社误用了我的名字而已。当时在写《深入理解Android卷I》,也就没时间理会这个事情,他们答应后续不会再用我的名字。)从水电到超导,再到ANSYS,中间还搞过一段时间低温光纤传感。较多专业的转换,逼着自己掌握了一种能力,即快速学习所需知识的能力。这种能力对我日后的工作帮助非常大。CSDN:你在大学本科专业是水利水电,而在硕士研究生的时候学习超导磁体,并非计算机出身,后来为什么转为一名职业的IT从业人员?邓凡平:硕士毕业后,在北京没法找到专业对口的工作,后来机缘巧合去了中科大洋。记得当时大洋的领导问我:是想搞软件还是搞硬件?我想了半天,觉得研一还学过VHDL(一门硬件电路设计语言),就想去硬件部门。领导介绍说大洋的核心部门是软件,我就说那就做软件吧。就这样,我跨入了软件行业。这个选择可能比较仓促,我的同学也觉得比较奇怪,毕竟当时在电力行业也有一些积累了。不过我一直对软件行业有如此多可学的东西而感到高兴。另外,软件开发是一个听起来比较光鲜的行业。作为一个软件开发的新手,压力可想而知有多大了。幸好中科大洋是国内技术实力非常雄厚的公司,而且研发部工作气氛很好。那三年我很努力(没熬过夜,但是每天回家都读书、学习、做笔记),因为我知道自己属于零基础入门(从另外一个角度来看,这同时也是件好事,因为心中没有任何条条框框,很多东西都想去尝试)。在这样的环境下,我的技术水平在这三年中提升非常快,很快就成为公司的核心开发人员了。另外,大概一年半的时候,项目组的几个前辈跳槽,结果,开发重任只能放到我们这些小辈身上。这段时间技术成长非常快。回想这段经历,感触很深,一定要给新人机会正是这个道理。所以,现在的工作过程中,我也特别注意把机会给新人,帮助他们成长。CSDN:你出版了目前唯一以情景方式深入Framework源码进行分析的书《深入理解Android卷I/II》,什么原因促使你写了这本书?可以分享一下写书过程中印象深刻的故事么?接下来还有著书的计划吗?邓凡平:很高兴的是,这两本书现在已经不是唯一关于Android源码分析的书籍了。它们的出版还是和个人经历有关。在大洋工作三年合同期满后,我跳槽到中科创达。原因很简单,因为它做手机、平板等这些我个人比较感兴趣、看起来很酷的东西。当Android刚出来不久,中科创达就投入了几乎全部力量到这个平台中。为了配合公司的发展方向,当时我就想着一定要把Android中那些不会的东西都学会。大家都知道“好记性不如烂笔头”这句话,在学习过程中,我就把自己的学习心得记录下来。再加上工作中又需要这些知识,二者相互促进,使得自己在Android这块有机会、有动力去学习和积累。写书其实都对自己的挑战非常大,尤其是在技术层面。当书写完后,整个知识结构就相应搭建起来了。我个人感觉在工作中很少能学到系统性知识,所以在此也鼓励读者一定要抽出整段时间来学习系统性知识。另外,学习过程一定要总结,现在云笔记是一个好东西。在工作时记下的东西,回家可以接着做。大家可以看我用Wiz做笔记时的示意图。这是2年下来的积累:
云笔记示意图随着对Android的了解,我发现这两本书的内容还远不能包括Android的内容。所以我后来和华章公司高级策划编辑杨福川先生共同规划了一个《深入理解Android》系列书籍的发展路线图。它囊括了Android的重要模块。目前,Framework部分的卷I、卷II,专题部分的Telephony都已经完成,其他的部分我们希望能邀请正直、有钻研精神、乐于分享、志同道合的朋友一起来写,欢迎与我联系。
《深入理解Android》规划另外,我个人觉得国内科研环境仍然很浮躁,所以每一本书我们都会请专家审稿,把好质量关,真真切切帮助开发者学到东西。CSDN:你对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究,在学习上有什么心得可分享?邓凡平:我的学习方法是以点带面,建立自己的知识结构。例如,工作中,往往只需要集中全力解决一点或几点问题就可以了。但这些点背后一定有一个较完整和深入的知识结构。所以,工作做完后,还需要继续学习背后的知识结构。以多核并行开发为例,09年做了一个FTP服务器,用到了多线程网络开发的技术,工作内容很快就定型了。但我觉得多核并行开发是一门新兴的技术,而我不想停留在仅会熟练使用多线程API这种程度,所以后续还花了不少时间去研读多核并行方面的专著。所以,我觉得不管读者是在开发自己的产品也好,还是在修改bug也好,一定要努力从工作中提炼、积累出一个完整的知识框架。这个方法说起来简单,做起来还是有点困难。因为它要求工作之后还得投入大量时间学习,把知识点串成面。而且,学这些知识的好处一时半会很难体现,需要耐心。CSDN:你是怎么组建、管理好一个团队的?你觉得一个团队最重要的是什么?邓凡平:这个问题很难回答,因为它要随环境、人而定。从目前我所在的Tieto公司来说,大家为之努力的就是要组建一个学习型团队。团队成员的技术素养很好,氛围也很民主和开放。另外,我们都有一种对知识追求的愿望(求知欲应该是人类都具有的原始且长久的冲动)。刚好学习型组织的核心理念也包括这些东西。具体的管理手段有很多,比如时间管理、敏捷开发等。这些方法都有很多资料可以参考。不过大家一定要结合实际情况来因地制宜。我个人觉得团队最重要的是要做到大家心中都有同一个目标,即华为所说的“力出一孔”。这一点比较难做到,决定于成员素质、公司文化等。另外,团队成员之间经常交流、统一对目标的认识也很重要。CSDN:技术出生的人能做好管理者吗?两个身份之间如何协调?邓凡平:我在管理岗位的时间并不长,所以对管理的认识还比较肤浅。从现在的职责来看,随着个人技术能力的增加,公司需要我发挥更大的作用,所以就安排一个团队一起为一个更大的目标而工作。当然,一个人单干和一个团队一起干活肯定有不同,所以我也需要培养技术团队管理方面的意识。身份协调的话,要结合具体情况。我们每天都有Scrum Meeting。在Meeting中大家介绍自己的工作情况。然后还要制定中短期工作计划,并设置Check Point和负责人。如果中间有偏差,我们就要分析原因,及时调整。我读硕士的时候,导师除了管理学生外,也在钻研技术,甚至做得比我们深入很多。这种方式我觉得可以在工作中采用。而且,它还符合Tieto公司的研发管理文化。没有“速成”的架构师CSDN:你作为一名高级架构师,谈谈对软件架构师的认识?邓凡平:软件架构师只是一个职位,但具体职责每个公司都不相同。我现在的职责主要有两个:一个是培养和增强团队的Android技术实力,另一个是组织一个高效灵活、能征善战的技术团队。CSDN:软件架构师必须具备哪些技能或素质?哪项技能(素质)是你认为最重要的?邓凡平:虽然每个公司定义架构师的职责都不相同,但架构师也需要具备一些基本技能:较为广博的知识面。这项技能对团队组建尤为重要,因为你得知道哪个模块是短板、哪个模块是核心。要有不断学习和改进的欲望。某个时间、某个阶段要能迅速明确目标。知道要做什么,比知道怎么做有时候更重要。CSDN:要成为一个架构师,是否存在快速成长的捷径?普通程序员如何一步步向架构师的目标靠近?邓凡平:我比较反对速成之类的说法。架构师只是一个职位,而没有放之四海都一样的职责。所以,普适的速成方法很难找到。从个人成长的角度来看,我倒是有几点建议:工作前3年求知识的广度。这三年对任何一个职场新人来说都很重要,所以要抛开语言之见(例如C/C++孰优孰劣)、平台之见(Linux好还是windows好)。大家只要抱着一个问题来学习。即,这项知识你都清楚吗?不清楚就去学,而不要把其他观点牵扯进来。三年之后可以根据自己的兴趣爱好选择一个合适的平台进行深耕细作。这个阶段求深度,并保持一定的广度。在这里,深度和广度并不矛盾,二者是相辅相成,互相促进的关系。任何事情都要把握度。求深度、广度,什么时候才算完了呢?我建议一定要结合工作情况来调整。例如工作中是搞Android App开发,空闲时间拓展一下Android framework的知识是不错的选择。但如果去研究iPhone或云计算等与工作毫无关系的内容,这种做法就值得商榷了。Android是开源世界的集大成者,是一个完整的系统CSDN:随着智能终端的发展,安全问题日益凸显。而开放的Android平台也成了恶意软件攻击的头号目标。研究人员已发现Android上的流行软件普遍存在安全陷阱与安全漏洞,那么,目前有哪些安全问题需要重视?从技术上应该如何减少这些漏洞呢?邓凡平:我对安全方面的问题没有太多研究,不过可以向大家推荐一本书《Enhanced Security Solution in Android》。另外,华章公司即将上市的《Android安全机制解析与应用实践》也请大家多关注。CSDN:你能谈谈Android
Framework是什么,以及Android
NDK和Framework和NDK之间是什么关系?另外,什么是Android内核?邓凡平:Android分为几个层次,首先是Kernel层,它用得是Linux
Kernel。然后是用户空间中的Framework层。最后是Application层。Android的核心内容大部分集中在Framework层,我个人又把它划分成两个层次:以Native语言编写的模块,包括负责显示的SurfaceFlinger、负责音频I/O的AudioFlinger、负责媒体播放的MediaPlayerService、负责Wi-Fi的wpa_supplicant、负责蓝牙的Bluez。我称之为Native Framework以Java编写的模块,包括和App紧密交互的ActivityManagerService、WindowManagerService等。我称之为Java Framework从App角度来看,Android内核就是framework。而从framework角度来看,linux kernel是内核。对App来说,Android尽力向应用层避免其他OS上的进程及进程间交互手段,取而代之的是四大组件及把它们相互连接起来的Intent。这是一种内涵远高于其技术实现的设计理念。所以,我觉得把APP层以下的内容称之为Android内核更能体现Android的特点。注意,官方并未有这种划分,所以读者也大可有自己的划分方法。Android提供的开发工具有SDK和NDK之分。其实两个都是传统意义上的SDK,只不过SDK提供的是Java API,而NDK提供Native语言的API罢了。NDK出现的目的是因为Android App是一个Java应用程序,它有时候需要调用Native库来做一些事情,而Native库就用Native语言的API来实现。CSDN:你有这么些年的Android开发经历和对Framework源码的分析经验,能分享一下Android Framework工作方式及原理?Android应用开发者和系统开发者怎么高效的学习Framework呢?需要掌握哪些技能?邓凡平:Android Framework各个模块之间以及Framework各模块和上层APP之间基本上都是基于C/S方式来交互的,交互手段有Binder、Socket、Pipe、共享内存等。这是Android Framework的核心工作机制。Android Framework包含的知识点非常多,读者应根据需要进行广度和深度的拓展,例如:如果工作中涉及到播放器开发,则可以深入研究Framework中MultiMedia模块,包括播放引擎、编解码、OMX等。如果工作和Wi-Fi相关,则可以研究wpa_supplicant、802.11协议等。如果对Activity切换、Provider工作原理感兴趣,可以研究Java Framework。一个基本原则是:由点及面,努力构造完整的知识结构。Android是开源世界的集大成者,是一个完整的系统。我相信大家只要在这个系统中钻研1-2年一定会受益匪浅。CSDN:去年阿里云OS推出时就因修改Android代码而受Google责难,最后取消了与Acer的新品发布会。现在阿里云OS回来了,并表示将会力争成为第五大移动OS,大有与安卓划界的架势。阿里云OS和Android有什么关系?能否从技术层面分析一下。邓凡平:讨论这个问题先得基于一个前提:根据已有的消息,云OS最核心的内容是自主实现了一个Java虚拟机。我们假设这个前提是正确的。那么,现在来讨论Java虚拟机在Android OS中的位置。Android Framework包括Java层和Native层。以Java层而言:毫无异议的一点是:Java层最终会运行在一个或多个Java虚拟机上。当然,这个Java虚拟机最终会以进程的形态运行在Linux之中。现在问题就出来了:Google花了大量心血用Java语言编写的ActivityManagerService、WindowManagerService、PackageManagerService等模块,不光能运行在云OS的虚拟机上,也能跑在dalvik自己实现的虚拟上。在这种情况下,java虚拟机的作用就好比PC机中的CPU。当你把CPU从Intel的换成了AMD后,就把运行在上面的Linux叫做自主OS。个人认为这种说法有夸大之嫌。另外还有一个关键点:除了Java模块,Framework还包括Native模块,这些东西和虚拟机几乎没有关系。它们也属于云OS中的重要一部分。仅从技术的角度来推测,云OS现在并将一直会参考Android。那么,什么时候云OS可以被称作是自主OS了呢?我个人觉得一个很简单的标志就是云OS有自己的SDK。阿里似乎并不比微软差钱。微软能搞一个独立的WinPhone,并且有自己的SDK。相信云OS或其他OS能拿出让国人为之真正振奋的东西。不过,OS这个东西,需要长期积累、埋头苦干。另外,Redhat、Ubuntu对Linux所做的修改绝不亚于云OS,但它们还只是Linux的一个发行版本。所以,云OS和国内各种OS还将任重而道远。CSDN:纵观Android的发展历程,你认为哪些因素是成功的关键?邓凡平:Android的高速发展和芯片厂商尤其是高通的大力支持有直接且重要关系。我觉得可以组织人力调查一下这方面的内容。另外,技术只是Android成功的一部分因素,还有很多商务、市场方面的因素。我对这部分内容研究较少,所以就不详述了。移动互联网时代,需要不同的平台CSDN:你关注移动互联网领域,你认为移动互联网现在处于一个什么阶段?邓凡平:移动互联网现在还处于一个不稳定的快速发展时期,而且百家争鸣、百花齐放,让人看得眼花缭乱。移动互联网时代对程序员的要求除了在技术上要紧紧跟上外,另外还需要程序员们培养一些市场、商务、甚至产品设计、人文上的素养和技能。所以,我个人一直反对将编程作为一种技能从小就来教育。编程仅是人们在计算机上实现一些事情的手段。就好比音乐家在电脑上谱曲,最重要的是这个音乐家的音乐天赋,而不是他会用甚至能开发谱曲软件。所以,我觉得应该要着力培养人文、音乐、哲学、美学方面的知识。CSDN:有人说,多年来,Android一直是Linux的一个变体,你觉得Android和Linux之间有何关系?邓凡平:Android Framework运行在Linux内核之上。从理论上来说,这个Framework也可以运行在Window内核之上。我的这篇曾记录了一位博友将Android移植到Win7的视频。我见过那段视频,它是直接将一个APK跑在win7上,而不是跑在模拟器或虚拟机上。Android和Linux关系密切,这是事实。但它是不是变体,我觉得没有必要为此争论不休。这本来就是一个仁者见仁智者见智的问题。CSDN:你是怎么看待iOS和Android这两大阵营的?你认为封闭和开放谁会最终胜出?邓凡平:我花了很长时间才理解一个基本事实就是“萝卜白菜,各有所爱”。就好像我喜欢不锈钢餐具,而很多人喜欢瓷器餐具一样。我希望这两个OS,甚至Windows Phone都能长久生存下去。移动互联网需要不同的东西,不同的设计理念,而这对广大开发人员以及用户来说都是一件幸事。CSDN:在移动互联网时代,Android占据一席之地,Android未来的发展趋势如何?邓凡平:Android在Google及其它合作伙伴的齐心协力下应该会保持稳健发展的势头。而更多、更先进的硬件(如更多传感器、更强劲的电池)、软件技术(例如Miracast也会通过Android手机和其他智能设备让千家万户真真切切体会到技术改变世界的力量)。CSDN:你从事开发多年了,这一路走来,最大的感悟是什么?邓凡平:求知欲是人的本能,很高兴自己一直保持了这种本能。另外,做好时间管理、明确自己的目标也非常重要。对于一些初学者我有一些以及和我一样仍在努力的人,有几点建议:在工作初期,先求广度,再求深度;只有见识面广,才有可能融会贯通;要努力接触新事物;Be Active。工作三年后,要选择适合自己的。这个时候,知道自己要做什么,比知道怎么做更重要。要有团队精神。覆巢之下无完卵。团队不好,个人也不会好到哪里去。大家要齐心协力把事情做好,不要过多考虑个人得失。要有定力和钻研精神。在知识学习上,高投入才可能有好产出。注意身体健康。活得越久,才能学得更多嘛。这是硬件,没有它,任何软件都跑不动。身体健康与否作为一个人最重要的风险因素,相信软件工程师们一定会重视并加强控制的。CSDN:你现在是如何分配自己的时间?是否还坚持在一线,这能给你带来什么乐趣?邓凡平:除了工作和必要的休闲锻炼外,我大部分时间都花在看书或写书。不论技术、管理、历史等书籍,只要感兴趣都会去看。另外,工作中如果有些知识点很重要,回家后也会赶紧补习相关的知识结构。学习可以满足求知欲。从可预计的未来3-5年来看,我还将工作在技术第一线。当然,我们团队成员技术实力都很高,团队意识也非常强,这也使得自己有时间和精力来钻研Android中还有那么多不了解的模块。同时,也希望能及时和大家分享自己的学习成果,独乐乐不如众乐乐嘛。CSDN:你对CSDN有什么建议?对未来有什么期待?邓凡平:希望CSDN能推出电子版的程序员杂志,可通过多看或京东电子书提供付费下载。另外,我一直希望CSDN能打造一个独立、公正的技术社区,使得各方意见、各种声音都能在此表达并能被听到,给这个喧嚣、略显浮躁的移动互联网世界带来一股清新之风。希望自己能一直保持乔布斯所说的“Stay foolish, Stay hungry”的状态。若想获悉邓凡平更过动态,请关注:CSDN博客:
& & & & 新浪微博:
社区之星访谈系列文章:
更多精彩内容,请点击查看。
本文为CSDN原创,未经允许不得转载。如需转载请联系market#csdn.net。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章随笔分类 - Android学习系列
Android开发相关的总结
摘要: ##事件总线框架针对事件提供统一订阅,发布以达到组件间通信的解决方案。##原理观察者模式。##EventBus和Otto先看EventBus的官方定义:```Android optimized event bus that simplifies communication between Activ...
谦虚的天下 阅读(10358) |
摘要: ######11)Widget样式(Widget Style)特别说明,此处定义大量的系统内置控件的样式,对于重写原生控件的样式具有很大的参考价值。```xml @android:style/Widget.AbsListView @android:sty...
谦虚的天下 阅读(14591) |
摘要: 使用android studio开发项目的一些问题,功能和技巧。####1. 环境Mac OSX 10.9.5 + Android Studio 0.8.9####2. gradle项目加载超慢这是因为gradle官方下载地址特别慢导致,解决方案有2个:* VPN,干净利索。 [推荐VPN...
谦虚的天下 阅读(23902) |
摘要: Google服务全线被封杀
android是依赖google服务的,从2个多月前,XX全线封杀google服务,对我们开发者造成的影响就是: 不能访问/ 不能下载android source 不能更新android SDK 不能下载...
谦虚的天下 阅读(11934) |
摘要: ####1. 环境UBUNTU 14.04 + Android Studio 0.8.2####2. 安装jdkopenjdk-7是一个很好的选择:```as3sudo apt-get updatesudo apt-get install openjdk-7-jdk```不排除你需要选择一个默认版本...
谦虚的天下 阅读(27260) |
摘要: 【基于最新的Android4.4的源码分析】每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui。所以,学习和理解android的UI设计是最基础和非常有必要的。android ui设计最重要的就是主题和样式。1、位置在Android的fr...
谦虚的天下 阅读(22670) |
摘要: 前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在《拓展系列》里。随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以把它提到《学习系列》专讲一章基础篇。刚装了UBUNTU14.04,所以尝试在新环境下编译一下android源码。...
谦虚的天下 阅读(21694) |
摘要: 接着《Android学习系列(36)--App调试内存泄露之Context篇(上)》继续分析。5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncTask等系统自带类去做事情,当然无可厚非。 但是AsyncTask确实需要额外注意一下。它的泄露原理和前面Handler,Thread泄露的原理差不多,它的生命周期和Activity不一定一致。 解决方案是:在activity退出的时候,终止AsyncTask中的后台任务。 但是,问题是如何终止? AsyncTask提供了对应的API:public final boolean cancel (bo...
谦虚的天下 阅读(7202) |
摘要: Context作为最基本的上下文,承载着Activity,Service等最基本组件。当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏。下面针对一些常用场景逐一分析。1. CallBack对象的引用 先看一段代码:@Overrideprotectedvoid onCreate(Bundle state){ super.onCreate(state); TextView label =new TextView(this); label.setText(&Leaks are bad&); setContentView(lab
谦虚的天下 阅读(12688) |
摘要: 当前比较成熟一点的应用基本上都会在进入应用之显示一个启动界面.这个启动界面或简单,或复杂,或简陋,或华丽,用意不同,风格也不同.下面来观摩几个流行的应用的启动界面.1. 货比三家以腾讯qq,新浪weibo,UC浏览器,游戏神庙逃亡等7个应用为例,比比看:(我认为最精美的界面应该是qq2012,虽然只有一张图,基本的应用名称,版本,图标这些信息都有,但是看着舒服,觉得美.)2. 元素启动界面的本意是以友好用户界面来掩饰后台缓冲加载,让用户用平和等待的心情进入正常应用界面.但是因为启动界面是放在开始,在这个特殊的点上,可以做更多的事情,如应用宣传,显示版权,展示广告等等.所以,这个启动界面的元素,
谦虚的天下 阅读(19116) |
摘要: Android的广告平台是很多的,各市场对各平台的接受程度是不一样的,Android的开发者如果想集成广告基本要考虑下面两个问题:(1)集成什么广告,会赚钱?(2)集成什么广告,不会被市场拒绝?最终的结果往往是折中的。第一个问题是广告平台的判断问题,我没有发言权去评论,本文主要是针对第二个问题展开。解决方案就是打包应用的不同广告平台版本,本文接下来逐一展开相关话题。1. 基础本文其实是针对《Android学习系列(6)--App模块化及工程扩展》和《Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包》的一个扩展和应用场景。所以当然也需要这两篇文章的基础:(1). An
谦虚的天下 阅读(5847) |
摘要: 最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,流关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题这么说起来比较笼统,接下来我会根据问题,把一些实例代码贴出来,一步一步分析,在具体的场景下,用行之有效的方法,找出泄露的根本原因,并给出解决方案。 现在,就从cursor关闭的问题开始把,谁都知道cursor要关闭,但是往往相反,人们却常常忘记关闭,因为真正的应用场景可能并非理想化的简单。1. 理想化的cursor关闭// Sample CodeCursor cursor ...
谦虚的天下 阅读(19019) |
摘要: 随着工程越来越复杂,项目越来越多,以及平台的迁移(我最近就迁了2回),还有各大市场的发布,自动化编译android项目的需求越来越强烈,后面如果考虑做持续集成的话,会更加强烈。 经过不断的尝试,在ubuntu环境下,以花界为例,我将一步一步演示如何使用命令行,使用ant编译android项目,打包多渠道APK。 要点: (1). 编译android的命令使用 (2). ant基本应用 (3). 多项目如何编译(包含android library) (4). 如何多渠道打包 ps:我将以最原始的方式来实现,而不是使用android自带的ant编译方式,并尽量详细解释,这样有益于...
谦虚的天下 阅读(25282) |
摘要: Android的ListView是应用最广的一个组件,功能强大,扩展性灵活(不局限于ListView本身一个类),前面的文章有介绍分组,拖拽,3D立体,游标,圆角,而今天我们要介绍的是另外一个扩展ListView:下拉刷新的ListView。 下拉刷新界面最初流行于iphone应用界面,如图: 然后在Android中也逐渐被应用,比如微博,资讯类。 所以,今天要实现的结果应该也是类似的,先贴出最终完成效果,如下图,接下来我们一步一步实现。1. 流程分析 下拉刷新最主要的流程是: (1). 下拉,显示提示头部界面(HeaderView),这个过程提示用户&下拉刷新& (2).
谦虚的天下 阅读(38477) |
摘要: 在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下。1.logcat命令这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v timeadb logcat -v time 2.bugreport命令这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dumpsys,dumpstate和logcat信息,是一份完整的日志记录。对分析用户行为,异常信息,系统状态有很
谦虚的天下 阅读(19161) |
摘要: 手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能。人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验。谷歌刚推...
谦虚的天下 阅读(49441) |
摘要: CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式。从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法。原型模式,能快速克隆出一个与已经存在对象类似的另外一个我们想要的新对象。1.意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。热门词汇:克隆 深拷贝 浅拷贝2.结构图和代码它的结构图非常简单,我们以Intent为例子:Intent的clone方法非常简单: @Override public Object clone() { return new Intent(...
谦虚的天下 阅读(6014) |
摘要: 对于android开发者来说起,适配器模式简直太熟悉不过,有很多应用可以说是天天在直接或者间接的用到适配器模式,比如ListView。ListView用于显示列表数据,但是作为列表数据集合有很多形式,有Array,有Cursor,我们需要对应的适配器作为桥梁,处理相应的数据(并能形成ListView所需要的视图)。正是因为定义了这些适配器接口和适配器类,才能使我们的数据简单灵活而又正确的显示到了adapterview的实现类上。适配器模式,Adapter Pattern,勇敢的去适配,大量的资源可以重用。1.意图适配器模式,把一个类的接口变换成客户端所期待的另一种接口,从而使原本不匹配而无法在
谦虚的天下 阅读(10701) |
摘要: 无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户。Android的apk可以说是作为小型应用,其中99%的应用并不是需要实时更新的,而且诟病于蜗牛般的移动网速,与服务器的数据交互是能少则少,这样用户体验才更好,这也是我们有时舍弃webview而采用json传输数据的原因之一。采用缓存,可以进一步大大缓解数据交互的压力,特此,我们简略列举一下缓存管理的适用环境:1. 提供网络服务的应用2. 数据更新不需要实时更新,但是哪怕是3-5分钟的延迟也是可以采用缓存机制。3. 缓存的过期时间是可以接受的(不会因为缓存带来的好处,导致某些数据因为更新不及时
谦虚的天下 阅读(39164) |
摘要: 最近经常思考团队开发的一些东西,其中代码风格不统一是最常见的问题之一。按理说,大家协商和沟通一下,风格统一一下就可以了,其实不然,因为这是个个性张扬的时代!工作code review中用了CheckStyle小半年了,觉得很好很强大很方便,大家写出来的代码就像一个人写出来的一样,值此辞旧迎新,特简做说明,与尔同飨。1.简介官方网站:http://checkstyle.sourceforge.net/CheckStyle提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。CheckStyle检验的主要内容(1)
谦虚的天下 阅读(6094) |
摘要: 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜。上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快,不如用图片来的惊艳和迅速,又懒的去改原来的,所以我又用图片来实现一个更完美的效果。1. 准备您可能需要参考我之前的两篇文章:(1).Android学习系列(16)--App列表之圆角ListView(2).Android学习系列(4)--A
谦虚的天下 阅读(8569) |
摘要: 有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈。甚至,有时觉得设计之殇是审美疲劳。直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中几乎随处可见圆角设计,也开始出现很多圆角名片了...今天我们就实现一个圆角的ListView效果。圆角的设计,我们并不追求到处都用,无处不用,android中有少数界面用直角确实容易显得锋利,和周边界面太过对比而显得不协调,比如大栏目列表,设置等等,而采用圆角实现,则会活泼,轻松的多,也融合的特别好。1.感觉实际上在Android中因为SDK中没有默认对圆角的一个完整的支持,需要麻烦自定义设置才能
谦虚的天下 阅读(26675) |
摘要: 在上篇文章《Android学习系列(22)--App主界面比较》中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局。今天我们就这个经典布局,用代码具体的实现它。1.预览图先看下最终的界面设计图:上面顶部是一个9patch背景图片+标题文字;下面底部是5个tab标签,表示应用的5大模块。中间内容部分则是各个模块的具体内容,可以再分类,或者直接显示内容。2.准备素材按照上篇文章的界面,我们需要事先提供两大方面的素材:顶部+底部。顶部的素材非常简单,最重要的是背景(9patch的图片):底部的素材稍微多一点:(1).每个tab的背景都需要正常和选中两种,一共10张图片;(2).每个tab之
谦虚的天下 阅读(24167) |
摘要: 本文算是一篇漫谈,谈一谈当前几个流行应用的主界面布局,找个经典的布局我们自己也来实现一个。不是为了追求到底有多难,而是为了明白我们确实需要这么做。走个题,android的UI差异化市场依然很大,依然值得去挖掘。铸就经典,是为了超越经典!下面我们以下面10个应用来分析比较它们的主界面:1.QQ20112.新浪微博3.凤凰周刊4.小米读书5.微信6.太平洋电脑网7.360卫士8.Camera3609.大众点评网10.挖财1.QQ2011QQ应用最新版本QQ2011 Beta3,从最新的版本看,界面比之前简洁了一些。我以夜间模式为例子:从图中可以看出来,QQ分为3大模块:空间动态,QQ聊天,其他QQ
谦虚的天下 阅读(11676) |
摘要: 游标ListView,提供索引标签,使用户能够快速定位列表项。 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧。 一看图啥都懂了:1.游标(Fast scroll thumb) 就是右边的那个拖动的方块,这个非常的简单: &ListView android:id=&@+id/tweaked_list& android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:fastScrollEna
谦虚的天下 阅读(15723) |
摘要: JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习。 恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位。 为了文章简明清晰,尽量多列点,少废话。 参考文档:http://www.ietf.org/rfc/rfc4627.txt?number=46271.JSON解析 (1).解析Object之一:{&url&:&/qianxudetianxia&} 解析方法:JSONObject demoJson = new JSONObject(json
谦虚的天下 阅读(13597) |
摘要: 宜未雨而绸缪,毋临渴而掘井。----朱用纯《治家格言》 离线下载,在有网络的情况下下载服务器数据,以便无网络时也能阅读,就是离线阅读。 离线下载的功能点如下: 1.下载管理(开始、取消下载)。 2.网络判断(Wi-Fi,3G)。 3.独立进程。 4.定时和手机催醒。 5.自启动。1.下载管理 这里不便关注下载的细节方法,网络下载的方法很多,大概如下: /** * 下载文件 * @param url 下载地址 * @param dest 下载存放的本地文件 * @param append 断点续传 * @return * @throws Exception */ public long dow.
谦虚的天下 阅读(8649) |
摘要: 本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构。 关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的。 从艺术的角度看,其实我们是在追求一种美。 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板。 1. 微盘 2.久忆日记 3.网易新闻 4.小米应用1.微盘 微盘的架构比较简单,我把最基本,最主干的画了出来: 第一层:com.sina.VDisk:com.sina(公司域名)+ap.
谦虚的天下 阅读(18639) |
摘要: 根据前面文章中ListView拖拽的实现原理,我们也是很容易实现推拽GridView的,下面我就以相同步骤实现基本的GridView拖拽效果。 因为GridView不用做分组处理,代码处理起来更简洁,而且原理前面已经讲解清楚了,代码中只是简单的过下,必要的地方简单的注释一下。1.主界面DragGridActivity.public class DragGridActivity extends Activity { private static List&String& list = //自定义适配器 private DragGridAdapter adapter = n
谦虚的天下 阅读(13318) |
摘要: 接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果。7.重写onTouchEvent()方法。 在这个方法中我们主要是处理拖动和放下。 拖动是选中项的影像随着手指滑动;放下是在拖动结束的时候交换数据。 方法的整体结构如下: /** * 触摸事件 */ @Override public boolean onTouchEvent(MotionEvent ev) { //如果dragmageView为空,说明拦截事件中已经判定仅仅是点击,不是拖动,返回 //如果点击的是无效位置,返回,需要重新判断 if(dragImageView.
谦虚的天下 阅读(16085) |
摘要: 研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨。 鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章。一、准备。1.需求问题 初步:实现列表的拖拽效果(可参考Android源码下packages/apps/Music中的播放列表TouchInterceptor.java源码)。 (提前说明一下,本文不是完全按照Music中实现的,代码实现方式做了一些调整,去掉来很多无关的东西,方便大家理解,效果上也修改成了另外一种个人认为是更简单更高效的一套。) 拓展:借鉴上一篇文章Android学习系列(9)--App列表.
谦虚的天下 阅读(23372) |
摘要: 吸引用户的眼球,是我们至死不渝的追求; 第一时间呈现最有价值的信息,简明大方,告诉客户,你的选择是多么的明智,这正是你寻觅已久的东西。 分组的应用场合还是很多的,有数据集合的地方往往要分组显示; 分组的形式也很多,最常见的就是镶嵌在列表中,网上说的很多ExpandListView的也是一种。 Android自带的通讯录中的联系人是按照拼音首字母(A,B,C,D......)分组分类的,效果如下: 我们今天也是要实现这样类似的一个效果。1.样本数据: 为了突出重点,直击要点,这里提供一个整理好的数据样本://list:数据集合private List&String& list = n
谦虚的天下 阅读(37856) |
摘要: 这篇文章是android开发人员的必备知识。1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务。 其中需要注意轮询的频率设置,要在需求和性能中平衡。2.独立进程 无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后...
谦虚的天下 阅读(23059) |
摘要: Android学习系列的文章目录Android学习系列(1)--App签名(为apk签名)Android学习系列(2)--App自动更新之通知栏下载Android学习系列(3)--App自动更新之自定义进度视图和内部存储Android学习系列(4)--App自适应draw9patch不失真背景And...
谦虚的天下 阅读(14660) |
摘要: 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.需求 无论是在.net还是java平台,合理的分层架构是最普遍的模块化思路之一。 dll,jar文件无不风靡盛行,无处不在。 一天,tx团队和我说,我们现在要做android上做三个论坛的客户端,一个是新闻论坛,一个是文学论坛,一个是音乐论坛。除了数据,界面和很少的模块不一样,其他的都一摸一样。 jar是我第一刻就想到的东西,但是共用的jar文件无法方便的共享资源或者覆盖资源。 而我们也不会傻傻的单独做三个客户端的吧,也不会傻傻的做3个客户端再傻傻的copy3份,依次修改吧。2.问题 在Androi
谦虚的天下 阅读(18746) |
摘要: 人类科技的进步源自探索,探索来自于发现本原,当然App布局没这么先进,本文也只是一个归类总结。这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。Android界面开发多多少少会有很多雷同或者相似的布局,不仅如此,纵观Android应用的界面,总也逃不出那些熟悉的结构。今天,我根据经验,把我认为的常见的布局做一个分析,归纳出几种简单的模型,这些模型一般是我认为解决其对应布局问题的最佳布局,具体要看情况。因为工作的限制,我无法专门研究天马行空,万罗天象的布局,只能根据我工作中碰到的布局,略加斟酌。还有一点我要强调,这些布局的原则就是:简单,灵活。模型一:水
谦虚的天下 阅读(19226) |
摘要: 友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏。这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。这一篇是对上一篇《Android学习系列(2)--App自动更新之通知栏下载》的补充,因此只是以点为要,点到为止。1.内部存储 出于考虑到用户可能禁掉了SDCard或者电脑暂时插在电脑上且为磁盘连接状态等等,对于这么个情况下,我们应该也要保证我们的程序也是能正常的运行。所以我们要考虑内部存储。 我暂时把内部存储定在/data/data/xxxxxappxxxx/files目录,核心代码如下: //创建
谦虚的天下 阅读(8539) |
摘要: 1.背景自适应且不失真问题的存在;2.9.PNG格式;3. 使用Draw9Patch.jar制作9.PNG图片之定义拉伸区域;4.使用Draw9Patch.jar制作9.PNG图片之定义内容区域;5.制作.9.PNG的高级技巧;6.SDK中如何处理9.PNG图片;7.android系统中大量应用了9.PNG图片;8.最后送上一些图例,以飨读者,以做后鉴。
谦虚的天下 阅读(33576) |
摘要: 见证过博客园的多次升级,你也希望你的软件通过更新发布新特性通知用户吧,是的。这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.设计思路,使用VersionCode定义为版本升级参数。 android为我们定义版本提供了2个属性:&manifest package=&blogs.tianxia.subway& android:versionCode=&1& &!--Integer类型,系统不显示给用户--& android:versionName=&1.0&&l
谦虚的天下 阅读(45099) |
摘要: 写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台。这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)。2.签名的步骤 a.创建key b.使用步骤a中产生的key对apk签名3.具体操作 方法一:命令行下对apk签名(原理) 创建key,需要用到keytoo
谦虚的天下 阅读(108333) |

我要回帖

更多关于 安卓软件 的文章

 

随机推荐