{"action":"opened","issue":{"url":"https://api.github.com/repos/wjch/wiki/issues/12","repository_url":"https://api.github.com/repos/wjch/wiki","labels_url":"https://api.github.com/repos/wjch/wiki/issues/12/labels{/name}","comments_url":"https://api.github.com/repos/wjch/wiki/issues/12/comments","events_url":"https://api.github.com/repos/wjch/wiki/issues/12/events","html_url":"https://github.com/wjch/wiki/issues/12","id":146048940,"number":12,"title":"Android学习路线指南","user":{"login":"wjch","id":1518663,"avatar_url":"https://avatars.githubusercontent.com/u/1518663?v=3","gravatar_id":"","url":"https://api.github.com/users/wjch","html_url":"https://github.com/wjch","followers_url":"https://api.github.com/users/wjch/followers","following_url":"https://api.github.com/users/wjch/following{/other_user}","gists_url":"https://api.github.com/users/wjch/gists{/gist_id}","starred_url":"https://api.github.com/users/wjch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wjch/subscriptions","organizations_url":"https://api.github.com/users/wjch/orgs","repos_url":"https://api.github.com/users/wjch/repos","events_url":"https://api.github.com/users/wjch/events{/privacy}","received_events_url":"https://api.github.com/users/wjch/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2016-04-05T17:01:25Z","updated_at":"2016-04-05T17:01:25Z","closed_at":null,"body":"在Android学习过程中，初学者踩过的坑我也都踩过，我也深深地知道大家在学习过程中最棘手的问题是什么。举个例子，在3年前，我想在SlidingMenu中放入一个ListView，发现二者总是不能很好地一起工作，这肯定是由于滑动冲突的问题，我也知道，但是不知道怎么解决。我就去学校图书馆翻遍了所有的Android书籍，无果。大家肯定都知道原因，为什么我无法从书中查找到问题的答案，因为入门书不讲滑动冲突，所谓的高级编程书也不讲。还有一个问题，我曾经以为view.post(runnable)可以让runnable的run方法在线程中执行，所以我就在run方法里面去做耗时的操作，现在想想我当时是多菜啊，因此我曾经也是菜鸟。\r\n\r\n直到若干年后的某一天，我终于琢磨透了滑动冲突的事，然后我就把解决问题的思想写在了CSDN博客上，但是好像看得人并不多，很多人并不能体会我的用心，后来我博客的访问量越来越大，这才慢慢地得到了一些人的关注。后来有一天我有了写书的契机，我想到了我最开始学习Android时所踩过的坑，想到滑动冲突对我的困扰，为了更好地传播我的技术经验，为了让更多的人少踩一些坑，为了让更多地人成为Android高级工程师，我毅然决定将Android开发中最重要的、最疑难的、最容易困扰大家的、成为高级工程师所必备的知识点和盘托出，这就是《Android开发艺术探索》存在的原因以及意义。书的反响怎么样呢？从目前读者的评价来看，内容基本无差评，我收到了很多读者的肯定以及感谢，这说明很多人能够理解我的用心。\r\n\r\n说了那么多，言归正传，下面说下Android学习路线的话题，本文打算从4个阶段来对Android的学习过程做一个全面的分析，分别为Android初级、中级、高级以及资深工程师，具体请看下面的分析。同理，本篇学习路线仍然只针对Android应用开发，不针对Rom开发和逆向工程等。这里虚拟一位“小明”的角色，在这里小明就是Android初学者的代表。\r\n\r\n初级工程师\r\n\r\n小明之前完全没接触过Android开发，是个应届生，他的待遇是13k，然后小明以校招的身份进入了百度，然后小明需要怎么学习才能成为初级工程师呢？这个时候，小明对编程基础、数据结构、C语言都有一定基础，Java语法什么的也都掌握的比较好，Android才有java语言，无奈的是小明并不会搞Android。\r\n\r\n小明首先需要购买一本Android入门的书籍，为了更快地学习Android，小明业余时间也都用来一边看书一边照着书中的例子敲代码，结果2周时间小明就把这本书学了一遍。看完这本书后，小明对Android的历史、结构、代码规范等都有了一个大概的了解，并且，小明已经可以写出一些简单的Activity了。这个时候在小明眼里，Android开发很简单很好玩，通过在xml中摆放一些按钮文本框什么的就可以做一些界面了。\r\n\r\n小明开始跟着他的技术导师做需求，一些简单的小需求小明自然是不在话下了。突然有一天来了一个需求，该需求要求小明在Activity中为一个button加一个动画效果，小明慌了：“完全没接触过，书上也没有讲，怎么办呢？”小明冷静了下，打开了百度搜索，输入“Android 动画”，打开前几个链接，小明恍然大悟，照着网上的例子把需求给实现了。后来导师告诉他：“学好Android，官方文档是必须看的，既全面又权威”。然后小明如获至宝，花了一年时间把上面的guide和training都看了一遍，并且他还动手抄了几个小例子。\r\n\r\n有一天，小明又需要做一个动画相关的需求，这可难不倒小明，它熟练地打开了www.baidu.com，输入“Android 动画”，突然他楞了一下：”总不能每次写动画都要百度一下吧！“，于是他在CSDN开了一个博客，把动画相关的知识点都写上去，为的是后面再写动画相关的代码就不用百度去搜了，事实如何呢？后面再写动画相关的代码，小明的确不用再去百度搜了，因为通过写一篇动画博客，他把动画相关的细节都已经记住了，这样他就可以不用再去参考任何文档了，后来小明还学会了把一些琐碎的不方便放在博客上的东西写到了印象笔记上面，什么时候忘了10秒钟以内都可以快速找回来，而不是花10分钟去再次搜索一遍。\r\n\r\n这里总结一下，Android入门的时候，需要有一本入门书，好好学习书中的内容，同时花一年时间把Android官方文档中的training和guide看一遍，同时通过写博客和记笔记的方式来做总结，建议让自己的每篇博客都有价值些。通过一年时间的学习，相信每个人都可以达到中级工程师的水平。\r\n\r\n技术要求： \r\n- 基本知识点 \r\n比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画等常见技术 \r\n- 书籍推荐 \r\n《第一行代码 Android》、《疯狂Android》\r\n\r\n小明经过一年的努力学习终于成为Android中级工程师了，月薪变成了17k。到了中级工程师，已经可以在公司里干很多体力活了，但是一些很重要的任务小明还不能一个人承担起来，这个时候小明需要学习的内容就很多了，如下所示： \r\n- AIDL：熟悉AIDL，理解其工作原理，懂transact和onTransact的区别； \r\n- Binder：从Java层大概理解Binder的工作原理，懂Parcel对象的使用； \r\n- 多进程：熟练掌握多进程的运行机制，懂Messenger、Socket等； \r\n- 事件分发：弹性滑动、滑动冲突等； \r\n- 玩转View：View的绘制原理、各种自定义View； \r\n- 动画系列：熟悉View动画和属性动画的不同点，懂属性动画的工作原理； \r\n- 懂性能优化、熟悉mat等工具 \r\n- 懂点常见的设计模式\r\n\r\n学习方法\r\n\r\n阅读进阶书籍，阅读Android源码，阅读官方文档并尝试自己写相关的技术文章，需要有一定技术深度和自我思考。在这个阶段的学习过程中，有2个点是比较困扰大家的，一个是阅读源码，另一个是自定义View以及滑动冲突。\r\n\r\n如何阅读源码呢？这是个头疼的问题，但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔，要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释，在看不懂源码时，源码中的注释可以帮你更好地了解源码中的工作原理，这个过程虽然艰苦，但是别无他法。\r\n\r\n如何玩转自定义View呢？我的建议是不要通过学习自定义view而学习自定义view。为什么这么说呢？因为自定义view的种类太多了，各式各样的绚丽的自定义效果，如何学的玩呢！我们要透过现象看本质，更多地去关注自定义view所需的知识点，这里做如下总结： \r\n- 搞懂view的滑动原理 \r\n- 搞懂如何实现弹性滑动 \r\n- 搞懂view的滑动冲突 \r\n- 搞懂view的measure、layout和draw \r\n- 然后再学习几个已有的自定义view的例子 \r\n- 最后就可以搞定自定义view了，所谓万变不离其宗\r\n\r\n大概再需要1-2年时间，即可达到高级工程师的技术水平。我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。注意，达到高级工程师的技术水平不代表就可以立刻成为高级工程师（受机遇、是否跳槽的影响），但是技术达到了，成为高级工程师只是很简单的事。\r\n\r\n技术要求： \r\n- 稍微深入的知识点 \r\nAIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等 \r\n- 书籍推荐 \r\n《Android开发艺术探索》、《Android群英传》\r\n\r\n高级工程师\r\n\r\n小明成为了梦寐以求的高级工程师，月薪达到了20k，还拿到了一丢丢股票。这个时候小明的Android水平已经不错了，但是小明的目标是资深工程师，小明听说资深工程师月薪可以达到30k+。\r\n\r\n为了成为Android资深工程师，需要学习的东西就更多了，并且有些并不是那么具体了，如下所示： \r\n- 继续加深理解”稍微深入的知识点“中所定义的内容 \r\n- 了解系统核心机制： \r\n1. 了解SystemServer的启动过程 \r\n2. 了解主线程的消息循环模型 \r\n3. 了解AMS和PMS的工作原理 \r\n4. 能够回答问题”一个应用存在多少个Window？“ \r\n5. 了解四大组件的大概工作流程 \r\n6. … \r\n- 基本知识点的细节 \r\n1. Activity的启动模式以及异常情况下不同Activity的表现 \r\n2. Service的onBind和onReBind的关联 \r\n3. onServiceDisconnected(ComponentName className)和binderDied()的区别 \r\n4. AsyncTask在不同版本上的表现细节 \r\n5. 线程池的细节和参数配置 \r\n6. … \r\n- 熟悉设计模式，有架构意识\r\n\r\n学习方法\r\n\r\n这个时候已经没有太具体的学习方法了，无非就是看书、看源码和做项目，平时多种总结，尽量将知识融会贯通从而形成一种体系化的感觉。同时这个阶段对架构是有一定要求的，架构是抽象的，但是设计模式是具体的，所以一定要加强下设计模式的学习。关于设计模式的学习，最近一本新书推荐给大家《Android 源码设计模式解析与实战》，既可以学习设计模式，又可能体会到Android源码中的设计思想，我最近也在阅读此书。\r\n\r\n技术要求： \r\n- 稍微深入的知识点 \r\n- 系统核心机制 \r\n- 基本知识点的细节 \r\n- 设计模式和架构 \r\n- 书籍推荐 \r\n《Android开发艺术探索》、《Android 源码设计模式解析与实战》、《Android内核剖析》\r\n\r\n资深工程师\r\n\r\n这个阶段的程序员也许并没有太具体的学习路线了。\r\n摘自 [Android学习路线指南](http://blog.csdn.net/singwhatiwanna/article/details/49560409)"}}