精华内容
下载资源
问答
  • Android学习路线指南

    万次阅读 多人点赞 2015-11-01 23:34:56
    前言 看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了,但是中高级的Android技术人才仍然稀缺“,...这是一个问题,我不好回答,但是我想写一篇文章来描述下Android学习路线,期望可以帮助更多的...

    前言

    看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了,但是中高级的Android技术人才仍然稀缺“,这的确不假,从我在百度所进行的一些面试来看,找一个适合的高级Android工程师的确不容易,一般需要进行大量的面试才能挑选出一个比较满意的。为什么中高级Android程序员不多呢?这是一个问题,我不好回答,但是我想写一篇文章来描述下Android的学习路线,期望可以帮助更多的Android程序员提升自己。由于我也是从一个菜鸟过来的,所以我会结合我的个人经历以及我对Android学习过程的认识来写这篇文章,这会让这篇文章更加真实,而并非纸上谈兵。

    我的工作经历

    前面说到,我也是从一个Android菜鸟过来的。其实这句话放在任何人的身上都是适用的,即大家都是一步步过来的,因此作为初学者也不必因为技术差而郁闷,同理,高手也不要看不起一些所谓的菜鸟,因为这不公平,技术只有在同等的工作年限上才具有一定的可比性,也许你眼中的菜鸟只是个工作半年的新手,而你已经工作5年,可想而知,这根本不具有可比性,搞不好别人5年后可以达到比你更高的技术高度。

    我有若干个技术QQ群,群里(481798332)的小伙伴对我的工作经历比较感兴趣,刚好在这里我就做下介绍。我是硕士研究生毕业,我已经工作3年零3个月了,职位上从最开始的腾讯初级工程师变成了现在的百度Android资深工程师。最开始我并不是做Android的,先是做了半年的C++,接着做了3个月的Web前端,然后公司内部转岗做Android到至今,纯Android工作年限的话其实是2.5年。但是我认为我的Android工作经验(注:工作年限不等同于工作经验)不止2.5年,我投入大量的业余时间在Android开发上,并且我习惯去思考问题、总结问题并将其融会贯通,因此我的Android技术在短时间内有了很大的提升。

    在Android学习过程中,初学者踩过的坑我也都踩过,我也深深地知道大家在学习过程中最棘手的问题是什么。举个例子,在3年前,我想在SlidingMenu中放入一个ListView,发现二者总是不能很好地一起工作,这肯定是由于滑动冲突的问题,我也知道,但是不知道怎么解决。我就去学校图书馆翻遍了所有的Android书籍,无果。大家肯定都知道原因,为什么我无法从书中查找到问题的答案,因为入门书不讲滑动冲突,所谓的高级编程书也不讲。还有一个问题,我曾经以为view.post(runnable)可以让runnable的run方法在线程中执行,所以我就在run方法里面去做耗时的操作,现在想想我当时是多菜啊,因此我曾经也是菜鸟。

    直到若干年后的某一天,我终于琢磨透了滑动冲突的事,然后我就把解决问题的思想写在了CSDN博客上,但是好像看得人并不多,很多人并不能体会我的用心,后来我博客的访问量越来越大,这才慢慢地得到了一些人的关注。后来有一天我有了写书的契机,我想到了我最开始学习Android时所踩过的坑,想到滑动冲突对我的困扰,为了更好地传播我的技术经验,为了让更多的人少踩一些坑,为了让更多地人成为Android高级工程师,我毅然决定将Android开发中最重要的、最疑难的、最容易困扰大家的、成为高级工程师所必备的知识点和盘托出,这就是《Android开发艺术探索》存在的原因以及意义。书的反响怎么样呢?从目前读者的评价来看,内容基本无差评,我收到了很多读者的肯定以及感谢,这说明很多人能够理解我的用心。

    说了那么多,言归正传,下面说下Android学习路线的话题,本文打算从4个阶段来对Android的学习过程做一个全面的分析,分别为Android初级、中级、高级以及资深工程师,具体请看下面的分析。同理,本篇学习路线仍然只针对Android应用开发,不针对Rom开发和逆向工程等。这里虚拟一位“小明”的角色,在这里小明就是Android初学者的代表。

    初级工程师

    小明之前完全没接触过Android开发,是个应届生,他的待遇是13k,然后小明以校招的身份进入了百度,然后小明需要怎么学习才能成为初级工程师呢?这个时候,小明对编程基础、数据结构、C语言都有一定基础,Java语法什么的也都掌握的比较好,Android才有java语言,无奈的是小明并不会搞Android。

    小明首先需要购买一本Android入门的书籍,为了更快地学习Android,小明业余时间也都用来一边看书一边照着书中的例子敲代码,结果2周时间小明就把这本书学了一遍。看完这本书后,小明对Android的历史、结构、代码规范等都有了一个大概的了解,并且,小明已经可以写出一些简单的Activity了。这个时候在小明眼里,Android开发很简单很好玩,通过在xml中摆放一些按钮文本框什么的就可以做一些界面了。

    小明开始跟着他的技术导师做需求,一些简单的小需求小明自然是不在话下了。突然有一天来了一个需求,该需求要求小明在Activity中为一个button加一个动画效果,小明慌了:“完全没接触过,书上也没有讲,怎么办呢?”小明冷静了下,打开了百度搜索,输入“Android 动画”,打开前几个链接,小明恍然大悟,照着网上的例子把需求给实现了。后来导师告诉他:“学好Android,官方文档是必须看的,既全面又权威”。然后小明如获至宝,花了一年时间把上面的guide和training都看了一遍,并且他还动手抄了几个小例子。

    有一天,小明又需要做一个动画相关的需求,这可难不倒小明,它熟练地打开了www.baidu.com,输入“Android 动画”,突然他楞了一下:”总不能每次写动画都要百度一下吧!“,于是他在CSDN开了一个博客,把动画相关的知识点都写上去,为的是后面再写动画相关的代码就不用百度去搜了,事实如何呢?后面再写动画相关的代码,小明的确不用再去百度搜了,因为通过写一篇动画博客,他把动画相关的细节都已经记住了,这样他就可以不用再去参考任何文档了,后来小明还学会了把一些琐碎的不方便放在博客上的东西写到了印象笔记上面,什么时候忘了10秒钟以内都可以快速找回来,而不是花10分钟去再次搜索一遍。

    这里总结一下,Android入门的时候,需要有一本入门书,好好学习书中的内容,同时花一年时间把Android官方文档中的training和guide看一遍,同时通过写博客和记笔记的方式来做总结,建议让自己的每篇博客都有价值些。通过一年时间的学习,相信每个人都可以达到中级工程师的水平。

    技术要求:
    - 基本知识点
    比如四大组件如何使用、如何创建Service、如何进行布局、简单的自定义View、动画等常见技术
    - 书籍推荐
    《第一行代码 Android》、《疯狂Android》

    中级工程师

    小明经过一年的努力学习终于成为Android中级工程师了,月薪变成了17k。到了中级工程师,已经可以在公司里干很多体力活了,但是一些很重要的任务小明还不能一个人承担起来,这个时候小明需要学习的内容就很多了,如下所示:
    - AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的区别;
    - Binder:从Java层大概理解Binder的工作原理,懂Parcel对象的使用;
    - 多进程:熟练掌握多进程的运行机制,懂Messenger、Socket等;
    - 事件分发:弹性滑动、滑动冲突等;
    - 玩转View:View的绘制原理、各种自定义View;
    - 动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理;
    - 懂性能优化、熟悉mat等工具
    - 懂点常见的设计模式

    学习方法

    阅读进阶书籍,阅读Android源码,阅读官方文档并尝试自己写相关的技术文章,需要有一定技术深度和自我思考。在这个阶段的学习过程中,有2个点是比较困扰大家的,一个是阅读源码,另一个是自定义View以及滑动冲突。

    如何阅读源码呢?这是个头疼的问题,但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释可以帮你更好地了解源码中的工作原理,这个过程虽然艰苦,但是别无他法。

    如何玩转自定义View呢?我的建议是不要通过学习自定义view而学习自定义view。为什么这么说呢?因为自定义view的种类太多了,各式各样的绚丽的自定义效果,如何学的玩呢!我们要透过现象看本质,更多地去关注自定义view所需的知识点,这里做如下总结:
    - 搞懂view的滑动原理
    - 搞懂如何实现弹性滑动
    - 搞懂view的滑动冲突
    - 搞懂view的measure、layout和draw
    - 然后再学习几个已有的自定义view的例子
    - 最后就可以搞定自定义view了,所谓万变不离其宗

    大概再需要1-2年时间,即可达到高级工程师的技术水平。我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。注意,达到高级工程师的技术水平不代表就可以立刻成为高级工程师(受机遇、是否跳槽的影响),但是技术达到了,成为高级工程师只是很简单的事。

    技术要求:
    - 稍微深入的知识点
    AIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等
    - 书籍推荐
    《Android开发艺术探索》、《Android群英传》

    高级工程师

    小明成为了梦寐以求的高级工程师,月薪达到了20k,还拿到了一丢丢股票。这个时候小明的Android水平已经不错了,但是小明的目标是资深工程师,小明听说资深工程师月薪可以达到30k+。

    为了成为Android资深工程师,需要学习的东西就更多了,并且有些并不是那么具体了,如下所示:
    - 继续加深理解”稍微深入的知识点“中所定义的内容
    - 了解系统核心机制:
    1. 了解SystemServer的启动过程
    2. 了解主线程的消息循环模型
    3. 了解AMS和PMS的工作原理
    4. 能够回答问题”一个应用存在多少个Window?“
    5. 了解四大组件的大概工作流程
    6. …
    - 基本知识点的细节
    1. Activity的启动模式以及异常情况下不同Activity的表现
    2. Service的onBind和onReBind的关联
    3. onServiceDisconnected(ComponentName className)和binderDied()的区别
    4. AsyncTask在不同版本上的表现细节
    5. 线程池的细节和参数配置
    6. …
    - 熟悉设计模式,有架构意识

    学习方法

    这个时候已经没有太具体的学习方法了,无非就是看书、看源码和做项目,平时多种总结,尽量将知识融会贯通从而形成一种体系化的感觉。同时这个阶段对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习。关于设计模式的学习,最近一本新书推荐给大家《Android 源码设计模式解析与实战》,既可以学习设计模式,又可能体会到Android源码中的设计思想,我最近也在阅读此书。

    技术要求:
    - 稍微深入的知识点
    - 系统核心机制
    - 基本知识点的细节
    - 设计模式和架构
    - 书籍推荐
    《Android开发艺术探索》、《Android 源码设计模式解析与实战》、《Android内核剖析》

    资深工程师

    这个阶段的程序员也许并没有太具体的学习路线了。

    交流方式

    • QQ交流群:635778578
    • 欢迎关注我的公众号,会持续更新Android干货
      cover
    • 欢迎加入我的知识星球,一起学习交流
      cover
    展开全文
  • Android学习指南

    千次阅读 2019-08-14 22:16:39
    下面,我将带着上述几个问题,详细讲解自身学习Android的方法和Android学习路径。最后,还会结合前面内容,给出综合的具体执行学习Android的建议。 1、学什么 面向Android初、中级开发者,对于要学习的Android理论...

    核心分析内容

    对于怎么学习Android,主要解决的是3个问题:学什么怎么学 & 怎么用

    具体如下:
    在这里插入图片描述
    下面,我将带着上述几个问题,详细讲解自身学习Android的方法和Android学习路径。最后,还会结合前面内容,给出综合的具体执行学习Android的建议。

    1、学什么

    面向Android初、中级开发者,对于要学习的Android理论知识,我认为主要包括:

    • Android基础 & 常用
    • Android进阶
    • 与时俱进、热门技术
    • 编程语言
    • 计算机基础

    具体介绍如下:

    1.1、Android基础 & 常用

    针对Android基础&常用知识,按照优先级最主要的知识点主要包括:四大组件布局使用多线程 & 动画

    具体介绍如下:

    类型简介具体内容
    四大组件Android最基础、最常用的四个组件• 活动(Activity)
    • 广播(Broadcast)
    • 内容提供者(ContentProvider)
    • 服务(Service)
    布局使用常用UI布局组件• 框架布局(FrameLayout)
    • 线性布局(LinearLayout)
    • 绝对布局(AbsoluteLayout)
    • 相对布局(RelativeLayout)
    • 表格布局(TableLayout)
    • 约束布局(ConstraintLayout)
    多线程多线程操作、异步通信• Thread、Runnable
    • Handler
    • AsyncTask
    • IntentService
    • HandlerThread
    动画实现UI中的动画效果• 补间动画
    • 属性动画
    • 帧动画
    • 差值器 & 估值器

    1.2、Android进阶

    针对Android进阶知识,按照优先级最主要的知识点主要包括:自定义View性能优化

    具体介绍如下:

    类型简介具体内容
    自定义View自定义试图组件 & 动画• 自定义View流程(measure、layout、draw)
    • 时间分发机制
    • 自定义动画 & 组件
    性能优化性能优化的目的是为了让应用程序App更快、更稳定 & 更省电• 内存优化
    • 内存泄漏
    • 绘制优化
    • 布局优化

    1.3、与时俱进、热门技术

    除了基础日常使用的Android知识,我们还需时刻关注行业动态,与时俱进的学习新技术,如近些年来较为热门的Android新兴技术包括:Flutter热修复插件化 等;

    同时,了解 & 学习常用的开源库也十分重要,常用的开源库主要包括 图片加载网络请求异步处理 的开源库。

    具体类型如下:

    类型简介具体内容
    图片加载加载显示图片• glide
    • fresco
    • picasso
    • Android-Universal-Image-Loader
    网络请求与服务器快速实现网络请求• Retrofit
    • okhttp
    • volley
    异步处理快速实现异步通信、响应式编程• RxJava
    • RxAndroid
    • RxBinding
    • EventBus

    1.4、编程语言:Java与Java虚拟机

    Android是基于Java的,所以学习Java和Java虚拟机(JVM)十分重要。

    学习Java不需要类似后端那么深入,我认为作为Android开发者,学习的内容包括:语言特性基础使用集合类机制

    具体介绍如下:

    类型简介具体内容
    语言特性Java特有的语法特性• 面向对象的3个特征与含义
    • 多态的实现原理
    • 基本数据类型、相关操作和封装类
    • 4种引用:强、软、弱、虚 & 应用场景
    基础使用Java常见的使用类/方法• 基本数据类型、相关操作和封装类
    • Object类、String类、抽象类(Abstract)
    • Static关键字
    • 接口(Interface)
    集合类Java中与集合相关的类 & 使用• Collection类、Arrays类
    • List、Set、Queue、Stack、Map的特点与用法
    • Vector、ArrayList、LinkedList的存储特性 & 区别
    • Map相关:HashMap、LinkedHashMap、TreeMap、HashTable、ConcurrentHashMap
    机制Java特定机制的使用• 多线程:Thread与Runnable、ThreadLocal、线程池ThreadPool
    • 线程同步:sychronized、同步锁(sychronized)
    • 反射
    • JNI
    • IO与NIO
    • 泛型

    对于Java虚拟机(JVM),属于底层 & 原理性的内容,具体介绍 & 学习的内容包括:
    在这里插入图片描述

    1.5、计算机基础

    除了学习Android特定技术外,对于程序员来说,最基本的计算机基础素养也十分重要的,主要包括 数据结构算法计算机网络

    具体介绍如下:

    类型简介具体内容
    数据结构相互之间存在一种或多种关系的数据元素的集合• 线性表&特殊线性表(栈和队列)
    • 树、二叉树
    • 串、字符串
    • 图
    • 查找
    • 排序
    算法解决特定问题的求解步骤对应每种数据结构的多种常见算法
    计算机网络网络通信相关• 计算机网络体系结构(5层 & 7层)
    • TCP / IP协议、UDP协议
    • HTTP协议
    • Socket

    1.6、总结

    至此,关于入门Andriod需学习的内容讲解完毕,总结如下:

    在这里插入图片描述

    2、怎么学

    对于怎么学习Android知识,此处分为3个子问题:

    • 学习路径:如何循序渐进、阶段性的学习Android的理论知识?
    • 获取途径:有哪些高效的方式获取Android理论知识?
    • 学习方式:用什么方式记录?怎么样去记录?

    下面将具体介绍:

    2.1、学习路径:如何循序渐进、阶段性的学习Android的理论知识?

    • 既然已经知道要学习哪些内容了,下面,该解决的是:学习路径,即什么阶段该学习什么内容
    • 对于Android知识学习阶段,我认为是和Android开发水平相结合的,只要掌握了哪部分知识,就代表你处于Android开发的哪个阶段。
    • 我将Android开发水平分为:初、中、高 & 高级以上

    具体对应的知识内容如下:

    类型定义知识 & 能力范畴特点具体内容
    初级最基础的Android知识• 定性认识:知识的了解
    • 定量使用:知识的实际使用
    • 基础
    • 广度
    • Android基础使用(如四大组件)
    • Android常见机制(如多线程、动画等)
    • Java
    • 编程通用:数据结构、算法、网络
    中级基础学习中更深一步的探索• 高级应用
    • 源码分析
    • 新技术的使用
    • 深度
    • 与时俱进
    • 底层工作机制的原理
    • 自定义View
    • 性能优化
    • 热定技术:开源库、热修复、插件化
    高级专注于某一垂直领域(如音视频、性能优化)特定领域的知识深入• 某一垂直领域
    • 机具深度 & 门槛
    专注解决特定领域的技术问题
    高级以上技术专家继续深入研究特定领域更加深入某一垂直领域• 专注解决特定领域的技术问题
    • 会产出 & 开源库 & 组件
    高级以上架构师在更高的层面解决项目难点 / 业务问题专注于整体技术架构• 技术架构设计
    • 具体业务的解决方案
    高级以上管理层面向团队、业务 & 产品具备管理团队、统筹产品方向的属性• 管理能力
    • 业务能力
    • 产品能力

    2.2、获取途径:有哪些高效的方式获取Android理论知识?

    既然已经知道要学习哪些内容了,下面,我将列举一些学习这些理论知识的有效途径。

    对于获取Android知识,我认为最有效的途径是:书籍 > 视频 > 技术博客 > 公众号

    具体介绍如下:

    类型特点应用场景推荐
    书籍具备完整知识体系、讲解全面的获取知识途径成知识体系、循序渐进的学习• Android:《第二行代码》、《Android开发艺术探索》
    • Java:《Java编程思想》
    • JVM:《深入理解Java虚拟机》
    • 数据结构:《大话数据结构》
    • 算法:《剑指Offer》、Leetcode网站刷题
    • 计算机网络:《计算机网络》(第五版)
    视频• 更加生动、清晰的讲解知识 & 实践
    • 较大的缺点:耗费时间较长
    学习难度较高的知识在线学习网站对应的Android学习课程(极客学院 & 慕课网)
    技术博客针对某个知识点进行讲解目的性搜索、深入学习• 技术社区:CSDN、稀土掘金、简书
    公众号针对某个知识点进行讲解(由于镶嵌在微信,所以容易链接到外部更多的渠道)适合碎片化学习Android公众号

    关于通过公众号的学习,本人的微信公众号:carson带你解析Android,希望能让大家系统的学习上述说的Android理论知识。

    2.3、学习方式:用什么方式记录?

    很多人看完书籍看完博客后当时很理解,但过一段时间就十分容易忘记。

    所谓“好记性不如烂笔头”,我认为,最好的记录方式就是将学习到的知识记录下来,我强烈推荐:撰写技术博客。

    对于技术博客的介绍如下:
    在这里插入图片描述
    撰写技术博客好处多多,主要包括:

    好处具体描述
    提高开发效率• 复杂使用的流程化:记录下繁杂的使用流程,下次再次使用时按部就班直接复用即可,常见的有:开源库的使用、某类需求的具体实现过程
    • Bug的快速解决:记录下问题发生的场景 & 解决方案,不仅能避免重复采坑,就算采坑了也能快速解决
    保证真正的掌握知识• 只有做到以下3步我才认为是真正掌握了知识:敲代码实现、清晰表达 & 让别人听懂
    • 但大部分开发者都停留在第一步(敲代码实现),你得清楚明白:敲代码实现 & 用语言表达出来是两码事
    • 所以在整个过程中是非常能锻炼自己的思维能力 & 表达能力
    加深对知识的思考• 在写作过程中,你会不断思考知识的各个方面
    为什么?因为如果思考的广度 & 深度不够,文章是没法继续写下去的
    • 这大概也是很多人没法坚持下来的原因:因为牵一发而动全身,知识总是从1个点扩散到整个面的,最终需完成的文章内容远远超出你的想象
    保证知识的正确性• 自己的认知能力有限,所以对知识的理解总有偏差
    • 当分享出来博客后,良好的Android技术社区氛围能及时纠正你错误的理解,保证你的认知是正确的

    当然,还有一些其他福利,如:

    好处具体描述
    提供影响力当大量产出优质文章后,在Android领域的知名度 & 影响力就会提高、对自己在职场上的地位会有所帮助,这是一种莫大的荣誉感
    结识人脉相对其他职业来说,程序猿较为封闭,即对电脑多、面向人较少;通过博客、Github等这些公开渠道,能结识更多的开发者
    知识共享Android与IOS其中一个较大区别 = 开源,作为一名Android开发者,应秉着谷歌、Android开源的精神,将有用的知识分享给大家、帮助更多的Android开发者 & 共同学习,推进整个Android技术圈的进步

    2.4、总结

    在这里插入图片描述

    3、怎么应用Android知识?

    • 理论结合实践、学以致用才能更好地获取知识,对于深入理解Android,最好的实践就是 将理论知识运用到Android项目中
    • 所以,此处可以转化成两个问题:
      • 该如何寻找项目?
      • 如何将理论知识运用到项目中 & 提高项目的质量

    下面我将详细回答这两个问题

    3.1、该如何寻找项目?

    此处我给出3个方向:

    • 学校:课程设计、社团组织
    • 公司:实习、正职、创业
    • 技术社区:开源项目
    方向具体
    学校• 课程设计:请认真对待大学专业对于你职业相关课程的大作业(如Java、Android、数据结构),因为它可能会成为你一个不可多得的项目经验
    • 社团组织:多参与校内官方组织 & 社团组织,注重寻找具备校内影响力较大的产品的所属组织,因为在那里你能找到一个具备落地实践的开发经历 & 一群靠谱、能在职场上给予你很多帮助的开发团队
    公司• 实习:如果你还是在校大学生,请安排好自己的大学上课时间,尝试出去公司参与拥有大量用户、真正的项目,特别是知名公司,对于在校大学生来说,这部分项目经历是含金量的提高。
    • 正职:如果你已经是正职员工,那么做好手头上的项目是你实践最好的方式。
    • 创业:这是能最大程度锻炼你全方面的能力,含:技术专业能力 & 基础能力;但这是一个可遇不可求的机会:找到靠谱的团队 & 有前景的方向,若有这样的机会,个人非常建议去尝试;假设最后能拿到投资,含金量是非常非常高、最能锻炼人的。
    技术社区• 来源:自己的项目、当前技术热点/开源库、仿照主流的app;
    • 内容:完整App、某个功能模块、UI组件等;
    • 开源处:主流技术社区 = Github、CSDN、稀土掘金、简书

    3.2、如何将理论知识运用到项目中 & 提高项目的质量

    我认为,**项目中的所有功能 & 业务实现都是基于上述说的Android知识的,关键是在于:**是否能选择对的知识点 & 组合实现思路。

    提高项目质量,即提高项目含金量、增加技术含量 & 亮点,下面主要是从项目**本身的意义实现方式性能优化** & 影响力 4个方面

    类型具体备注
    意义尽可能的让自己的项目使用的技术往学习到的知识点靠拢
    实现方式• 具备一定的技术难点 & 技术技巧,而不是简单实现
    • 如:使用了某种新技术、新的开源库
    若无难点,要学会自己去制造难点
    性能优化对项目在性能上提出要求 & 提出解决方案与同类项目、一般要求的区别开来
    影响力尽可能让项目可落地 & 具备一定的用户基数;
    • 具备一定的影响力 & 知名度

    具体执行建议

    个人认为最高效的执行方式是:以做项目为主知识体系学习为辅将技术博客作为一种学习的方式

    具体理解的是:
    在这里插入图片描述

    总结

    至此,关于我对Android学习内容、方向 & 具体实践方式 讲解到这里,此处作个简单总结:
    在这里插入图片描述
    凭借这样的学习方式,有幸获得腾讯、阿里巴巴、今日头条等Android客户端offer,所以,我将自己的一套Android学习方式总结出来分享给大家,希望各位也能获得心仪的offer!

    展开全文
  • Android学习总结

    千次阅读 2018-08-31 16:56:41
    Android学习总结 activity是Android SDK中Activity的一个实例,负责控制各组件与用户的交互 布局定义了一系列组件,包括Button、TextView、 RecyclerView。布局和组件之间的关系可用下图表示: 常用组件和布局...

    Android学习总结

    1. activity是Android SDK中Activity的一个实例,负责控制各组件与用户的交互

    2. 布局定义了一系列组件,包括Button、TextView、 RecyclerView。布局和组件之间的关系可用下图表示:

    这里写图片描述

    常用组件和布局的继承关系如下图:
    这里写图片描述
    3. 项目的app/res/values目录下保存了一系列的资源,包括字符串资源,图片资源等,包括布局也是资源的一种。它们都通过资源ID被引用。如果控件也需要被引用,则在xml文件中定义它们时,可以加上android:id属性,为其设置ID。
    4. xml布局是如何转换为视图对象的呢?activity子类被创建后,onCreate(Bundle)方法会被调用,它再调用

    public void setContentView(int layoutRestId)

    根据传入的布局资源ID,使用LayoutInflater类实例化该布局中定义的每一个View。activity子类都需要声明在AndroidManifest.xml配置文件中,在该文件中会设置一个launcher activity,app启动时会创建该activity。
    5. MVC设计模式。MVC即模型,视图,控制,activity或者fragment(service还未学习)可以作为控制器,它们将视图即View实例对象显示在屏幕,将模型(实例类)中的数据显示更新在屏幕上。GeoQuiz项目的MVC示意图如下:
    这里写图片描述
    6. activity的生命周期。
    这里写图片描述
    在activity的各个阶段,Android系统会自动调用相应的方法。重载这些方法,添加log,切换手机横竖屏,可以通过logcat看到activity的生命周期中相应方法的调用。
    7. 保存数据以应对设备旋转。

    protected void onSaveInstanceState(Bundle outstate)

    该方法通常在onStop()方法前被调用,除非用户按了后退键。该方法的默认实现把所有activity视图状态保存在Bundle中,Bundle是一种存储键-值对的一种结构。可以通过覆盖onSaveInstanceState()方法,将一些信息保存在Bundle中:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Log.i(TAG, "onSaveInstanceState");
        savedInstanceState.putInt(KEY_INDEX, mCurrentIndex);
        savedInstanceState.putBoolean(KEY_IS_CHEATER, mIsCheater);
    }

    在onCreate()方法中获取信息:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate(Bundle) called");
        setContentView(R.layout.activity_quiz);
    
        if (savedInstanceState != null) {
            mCurrentIndex = savedInstanceState.getInt(KEY_INDEX);
            mIsCheater = savedInstanceState.getBoolean(KEY_IS_CHEATER);
        }
        ...
    }

    还可以存BooleanArray。操作系统会将Bundle对象放入activity记录中,可以理解为暂存。覆盖onSaveInstanceState()保存当前activity的小的或状态的数据;覆盖onStop()方法,保存永久性数据,如用户编辑的文字等。(?如何理解?)
    8. tools命名空间。使用该命名空间,可以覆盖某个组件的任意属性,改属性仅在预览中生效。
    9. 启动activity并互相传递数据。一个activity启动另一个activity最简单的方式是用startActivity方法:

    public void startActivity(Intent intent)

    activity调用该方法后,调用请求发给了操作系统的ActivityManager。ActivityManager启动哪个activity呢?答案在传入的参数intent。intent有很多构造方法,其中一种为:

    public Intent(Context packageContext, Class<?> cls)

    传入的Class类型参数告诉ActivityManager要启动的activity,Context类型参数告诉ActivityManager在哪里可以找到它(?不是在manifest配置文件中声明了吗?)。可以在startActivity(Intent intent)的intent上附加上extra信息,传递给启动的activity。如同在Bundle中保存信息一样,extra信息也是一种键值对,在子activity中提供一个借口,父activity把信息通过借口传过来即可,无需关心“键”是什么样的:

    //子activity
    public static Intent newIntent(Context packageContext, boolean answerIsTrue) {
         Intent intent = new Intent(packageContext, CheatActivity.class);
         intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
         return intent;
    }
    //父activity
    mCheatButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //start cheatactivity
            boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();
            Intent intent = CheatActivity.newIntent(QuizActivity.this, answerIsTrue);
            startActivity(intent);
        }
    });

    子activity在onCreate方法中就可以获取该extra信息:

    mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);

    可以用intent传递更多的信息,使用多参数版本的intent构造函数即可(还未实践)。

    以上是父activity传递信息给子activity,要获取子activity的信息,可以修改startActivity方法:

    startActivityForResult(intent, REQUEST_CODE_CHEAT);

    子activity可以调用:

    public final void setResult(int resultCode)
    public final void setResult(int resultCode, Intent intent)

    如果子activity没有调用setResult,而父activity又是调用startActivityForResult启动子activity的,父activity会收到Activity.RESULT_CANCELLED。在项目实践中,子activity的Button监听回调被调用后,它设置了返回结果:

    private void setAnswerShownResult(boolean isAnswerShown) {
        Intent intent = new Intent();
        intent.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
        setResult(RESULT_OK, intent);
    }
    
    public static boolean wasAnswerShown(Intent result) {
        return result.getBooleanExtra(EXTRA_ANSWER_SHOWN, false);
    }

    父activity要重载onActivityResult()方法:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
    
        if (requestCode == REQUEST_CODE_CHEAT) {
            if (data == null) {
                return;
            }
            mIsCheater = CheatActivity.wasAnswerShown(data);
        }
    }

    这里,解析信息放在了子activity定义的一个接口中,因为“键”存在子activity中,最终的还是通过intent来解析到的。
    10. Fragment。fragment与activity很类似,它也是负责创建并管理用户界面,与模型对象进行交互。fragment的生命周期与activity类似,但是fragment的生命周期方法由它的托管activity而不是操作系统调用。fragment并没有像activity一样在onCreate方法中完成布局和组件view的实例化,而是在onCreateView方法中完成的,如下:

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_crime, container, false);
    
        mTitleField = v.findViewById(R.id.crime_title);
        ...
    
        mDateButton = v.findViewById(R.id.crime_date);
        ...
    
        mSolvedCheckBox = v.findViewById(R.id.crime_solved);
        ...
    
        return v;
    }

    第二个参数是视图的父视图。以上fragment类中完成了主要的工作,但它的视图显然还无法显示出来,它需要托管给activity。Activity类中添加了FragmentManager类,它负责管理fragment并将它们的视图添加到activity的视图层级结构中。具体做法:

    public class CrimeActivity extends SingleFragmentActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fragment);
    
            FragmentManager fm = getSupportFragmentManager();
            Fragment fragment = fm.findFragmentById(R.id.fragment_container);
    
            if (fragment == null) {
                fragment = new createFragment();
                fm.beginTransaction()
                        .add(R.id.fragment_container, fragment)
                        .commit();
            }
        }
    }

    fragment事务的add接口,第一个参数为容器视图资源ID,第二个参数是要加入的Fragment。二者视图关系可用下图表示,fragment视图要放置在activity的视图层级结构中:
    这里写图片描述
    11. RecyclerView。RecyclerView是ViewGroup的子类,每一个列表项是作为View子对象来显示的。它们的显示依赖于两个类:ViewHolder和Adapter。在控制器中重载这两个类。实践项目中RecyclerView作为fragment布局的一个组件,在onCreateView方法中要先调用:

    mCrimeRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    接下来,控制器把要显示的模型对象(一般是ArrayList对象?)作为参数构造了一个Adapter,然后调用:

    mCrimeRecyclerView.setAdapter(mAdapter);

    接着,Adapter调用getItemCount()方法获取要显示的列表项的个数,根据该个数,循环调用onCreateViewHolder( ViewGroup viewGroup, int i)和onBindViewHolder(CrimeHolder crimeHolder, int i)。ViewHolder的任务是什么呢?它首先会把列表项布局实例化,然后再通过各组件的ID,找到它们的引用。在onBindViewHolder,Adapter会把要显示的模型参数传递给ViewHolder,它通过组件显示在屏幕上。项目实践中相关代码示例:

    private class CrimeHolder extends RecyclerView.ViewHolder
                implements View.OnClickListener {
        ......
        public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.list_item_crime, parent, false));
    
            itemView.setOnClickListener(this);
            mTitleTextView = itemView.findViewById(R.id.crime_title);
            mDateTextView = itemView.findViewById(R.id.crime_date);
            mSolvedImageView = itemView.findViewById(R.id.crime_solved);
        }
        public void bind(Crime crime) {
            mCrime = crime;
            mTitleTextView.setText(mCrime.getTitle());
            mDateTextView.setText(mCrime.getDate().toString());
            mSolvedImageView.setVisibility(mCrime.isSolved() ? View.VISIBLE : View.GONE);
        }
        ......
    }
    
    
    @Override
    private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder> {
        ......
        public CrimeHolder onCreateViewHolder( ViewGroup viewGroup, int i) {
            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    
            return new CrimeHolder(layoutInflater, viewGroup);
        }
    
        @Override
        public void onBindViewHolder(CrimeHolder crimeHolder, int i) {
            Crime crime = mCrimes.get(i);
            crimeHolder.bind(crime);
        }
        ......
    }
    展开全文
  • Android学习路线(适合学生)

    千次阅读 多人点赞 2019-08-06 18:53:06
    写在前面:首先我是一名科班大学生,这是我个人觉得较好的学习路线,适合基础也适合进阶,如果您不喜欢直接关闭即可,欢迎指出其中的错误和给我提供一些建议。 文中书籍资源有些可以在 计算机书籍控 中找到 先...

    写在前面:首先我是一名科班大学生,这是我个人觉得较好的学习路线,适合基础也适合进阶,如果您不喜欢直接关闭即可,欢迎指出其中的错误和给我提供一些建议,很希望大家可以一起学习进步。

     

    文中书籍资源有些可以在  计算机书籍控  中找到

     大家先问个问题,现在Android前景怎么样?-----------  但行好事莫问前程。

    一、java(kotlin)+Android基础

    首先,你需要java基础,虽然2019年 google I/O 大会Kotlin成为了Android首选语言但是现在一些老的项目上java偏多一点,你可以先学习java,到时候根据需要学习kotlin。

    学习资源:首先推荐大家去访问官网,看相关文档进行学习(个人觉得这是学习一门新语言最好的资料)

                      书籍推荐 《Java核心技术·卷1》  《Kotlin核心编程》

                      网课 尚硅谷-java基础核心30天 ,尚硅谷的视频确实不错,而且B站学习资源也很多大家可以自行选择

    有了java基础我们就可以打开Android世界的大门了

    学习资源:书籍 《第一行代码Android》(多读几遍你会收获很多,今年上线第三版,和第二版的内容差不多,但是用kotlin编写的,还引入了jetpack)

                       网课  Android核心技术 (觉得书本枯燥可以搭配着看)

    二、进阶

      git的使用 (学完第一行代码你可能掌握基本的用法了,但是我觉得多学点还是有帮助的)

    《JVM虚拟机》  (因为java和kotlin最终都是编译成字节码,所以学习JVM是很必要的)有时间和经历也可以拜读《深入理解Android Java虚拟机ART》

    《Android开发艺术探索》 (里面大部分都是分析源码和过程,可以多读几遍)

    《Android进阶之光》《Android进阶解密》《Android进阶指北》(刘望舒的三部曲,能完全学下来真的很强)

    配套视频:http://www.atguigu.com/android_video.shtml#and_aj(有小demo和大的项目,可以配套看,主要是对项目的架构有一定的了解并增加一些项目经验)  

    还可以看google官方的demo

    补充:

    不得不说Android的知识结构还是很广泛的,而且移动端的发展也太快了

    在最近的工作中我又发现了自己的不足,跟着项目去学习了  Gradle 和 Jetpack

    然后又接触到了Flutter,个人感觉目前的生态还很一般,有很多坑需要去趟,可以作为自己的兴趣去学习,快速写一个项目

    三、算法与数据结构

    https://www.bilibili.com/video/av54029771 B站

    还推荐 极客时间 的王争大佬的专栏 设计模式还有算法(超赞)

    c语言版的数据结构,java版的算法与数据结构,算法,LeetCode,ACM

    四、计算机网络

    《计算机网络:自顶向下方法》(看起来可能很无聊,可以配合哈工大的视频,虽然视频也很无聊)

    《图解HTTP》

    《图解TCP/IP》

    五、操作系统

    鸟哥的Linux私房菜  (linux系统真的很强,Android内核就是linux)

    六、设计模式

    大话设计模式  (大话系列,通俗易懂)

    Head First设计模式  (同学买过说还可以)

    极客时间专栏  《设计模式之美》(力推  利用碎片的时间就可以看一篇)

    七、Android底层源码和框架源码最新动态

    Androdi开发者网站 (这已经是中文文档了,看不懂再用google翻译一下...)

    github 框架直接star然后看就完了,这里列出一些框架:

    OkHttp  Retrofit  (emmm,我觉得大家到这个层次应该就知道学什么框架了,这里我就不班门弄斧了......)

    八、注意身体健康...

    附录:Android校招面试相关

    Android校招面试指南    一个学姐整理的 https://www.jianshu.com/u/203b606b956c

    写在最后:等你哪天真的明白你写的代码和os怎么交互, 和板子怎么通信, 这才是一个靠谱的东西, 而不是 垒砖一样的垒代码。

    展开全文
  • Android 学习之路

    千次阅读 2018-07-15 20:07:59
    从事 Android 开发一周年了,作为一个非科班出身的程序员,一路走来其实挺不容易的。...主要原因是前几年移动互联网高速发展,Android 开发需求量特大,很多人都去学习 Android。到目前这个阶段,...
  • Android学习路线:如何成长为高级工程师

    万次阅读 多人点赞 2015-01-03 00:08:49
    点击给我投票前言之所以写这篇文章,是因为最近博客和我的开发群( 215680213 )中,不少小伙伴都让我讲讲android学习路线,所以我决定写一篇博客,来说明这个问题。既然有不少小伙伴来咨询这个问题,说明大家都...
  • Android 学习路线

    千次阅读 2018-09-11 16:07:10
    Android源码中最重要的三个类:ActivityManagerService/PackageManagerService/View,推荐大家周末的时候可以去阅读下这部分的源码,阅读源码能提高我们今后设计架构自己代码的能力,同时也能从底层了解整个...
  • 本文内容源自CSDN知识库专家,中科院NIPC国家重点实验室Android工程师,微信公众号“IT面试题汇”作者,刘朋,4月14日在CSDN Android学习群中的分享。以下为内容摘录。
  • Android学习路线总结,绝对干货

    万次阅读 多人点赞 2016-04-26 18:13:52
    最近看到很多Android新手问Android学习路线,学习方法啊,如何入门啊,所以我从网上找了一些资料,然后以我的工作经验给大家总结一下,让你们少走弯路,提取一些工作中经常用到的技术。二、学习知识汇总1、
  • Android学习路线图

    千次阅读 2016-12-04 21:22:25
    前言工作快一年,Android完全靠自学,看着那些基础教程一步步去做,写过简单的功能app,也一步步走的现在,却总发现缺点什么。和科班出身的Android程序猿不知道区别在哪里,所以就想找个时间梳理梳理,看看自己哪...
  • 所以,今天,我将献上一份《Android学习指南》,以自身的经验 & 所见所闻,旨在告诉大家,针对要学习的Android知识,该如何进行理论学习 & 实践,希望你们会喜欢。 请先阅读文章:Android知识图谱:我们.....
  • 黑马66期最新Android视频教程开始更新【全套不加密】 链接:http://pan.baidu.com/s/1jGtQsAE 密码:e6ec 更多IT教学视频请关注微信号:JCKFZ_LM 实时更新最新的开发视频教程和项目资源
  • Pro Android学习:传感器

    热门讨论 2015-02-06 11:43:14
    Pro Android学习系列中的传感器小例子。具体见http://blog.csdn.net/flowingflying/article/details/6212512
  • 原网址:http://www.cnblogs.com/wjdawx/p/3512493.html 先来看下效果图   1.首先是布局文件XML文件,不解释... 1 RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android
  • Android学习记录(一)

    千次阅读 2021-01-08 10:52:59
    Android学习记录(1) 本次文章记录了我第一次开始学习安卓所做出的一些界面,由于是第一次做得到十分美观的结果,但是也获得了一些有效的成果。 Android的相关介绍 在进行新的学习内容之前,我们需要了解该门课程的...
  • 关于Android学习的三个终极问题

    千次阅读 多人点赞 2019-05-06 17:05:33
    我在学习,他也在学习。我想,大家每天都一起上课,记笔记,上自习,完成作业,智商也差不多,为何考试的时候有时候差距会很大呢?这个问题我直到今天也没有答案,这几天和朋友闲聊说到这个事情。他们有得说是智商有...
  • Pro Android学习:Fragment

    热门讨论 2013-10-25 15:05:35
    这是Pro Android学习Fragment部分的例子源代码。
  • Android源码学习

    千次阅读 2018-09-08 16:54:53
    进阶学习的阶段,需要我们保持一颗好奇的心,深入阅读Android源码,学习优秀的代码风格和设计思想,知其然并且知其所以然。 引用Google的一张框架图: Applications层,和用户直接交互的就是这些应用程序,它们...
  • 基于Android课堂学习系统的文献综述

    千次阅读 2019-04-12 09:33:19
    基于Android课堂学习系统的文献综述
  • Android学习--Interpolator(插值器)

    万次阅读 多人点赞 2014-09-21 14:07:54
    AccelerateDecelerateInterpolator开始与结束的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator开始的地方速率改变比较慢,然后开始加速 AnticipateInterpolator开始的时候向后然后向前甩 ...
  • Android学习资料整理

    千次阅读 2016-02-28 12:23:51
    Android学习资料整理,希望对你有用! 1.书籍(只罗列了我自己买的并且是比较好的书)  (1).第一行代码(适合初级人员,入门级) 作者郭霖,江湖人称郭神,csdn博客大牛。  (2).Android 群英传 (适合初级人员,入门...
  • 以自身的经验 & 所见所闻,旨在告诉大家,针对Android,需要学习什么知识、怎么学习 & 怎么应用到实际项目中,希望你们会喜欢。
  • 本课程主要讲述Android开发Java的基础到核心的学习,包括:变量、操作符和表达式、语句、数组、类的方法、访问控制与封装、继承、常见工具类、链表、实际操作综合示例。课程由浅到深,实用性强。
  • 一个老鸟发的公司内部整理的 Android 学习路线图

    万次阅读 多人点赞 2017-09-12 17:13:27
    Android 开发学习路线图。可惜不是MarkDown格式的,所以jixiaohua直接上传的截图,在jixiaohua的呼吁下,我花了些时间,把这篇大牛的推荐清单编辑成了Markdown格式,方便大家浏览,学习。 有一些链接可能还不是...
  • Pro Android学习:ActionBar小例子

    热门讨论 2013-11-07 09:36:03
    Pro Android学习系列中的action bar小例子。
  • AbnerAndroid小程序这个就不多说了,是小编自己写的一个服务于Android开发者的一个微信小程序,从小白到大牛,从技术博文到每日资讯,从每日开源项目到每日推荐,Android,Kotlin,反正包罗万物,小编能想到的都在...
  • Android学习启动篇

    万次阅读 多人点赞 2011-06-21 00:32:00
    近年来,手机移动平台...目前,手机平台如日中天的要数是iOS和Android了,尤其是iOS,Symbian已没落,WP7在挣扎。iOS一如既往地走Apple特色的封闭道路,然而它的强大在于能够建立一个完整的生态系统,乔布斯确实是天之
  • Android学习指南》目录

    千次阅读 2011-11-28 20:29:10
    Android学习指南的内容分类: 分类 描述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不要先看Android的课程,这样会很累。 1.Android学习指南基础篇 对于有Java基础...
  • stormzhang Android 学习之路

    千次阅读 2016-03-01 20:50:53
    这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android...收到一些朋友的微博私信,说能不能给Android新手们一些指导,我只能说指导谈不上,毕竟我也很多东西正在学习中,与此同时一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 468,555
精华内容 187,422
关键字:

android学习