一个Android技术专家,至少有2~3个专业领域。
作者
VasiliyZukanov,已获翻译授权
译者
罗昭成,Android开发者
责编
唐小引
许多Android开发者经常会问我,要学会哪些东西才能成为一个优秀的Android工程师?对于这个问题,他们的描述或多或少都有些差异,但是,总体来说,我们都需要学习一系列的技能,才能成为一个优秀的Android工程师。
在我看来,存在这样的困惑是正常的。Android是一个巨大并且动态的生态系统,你可能需要花好几周时间去了解并学习它相关的一些工具和概念,但是最后你会发现,它们有好多都不是很重要,或者说并不是非常有用。因此,在本文中,我将分享我在Android开发中所使用到的重要技能,希望能够帮到你,让你把你的精力集中到重要的事情上。
当然,如果你是一个经验丰富的Android开发者,这些知识可能你都知道。有很多技能和观点都需要很多基础知识的沉淀,当你没有足够的经验的时候,很难看到这些技能点。文中,我不可能列出所有Android开发者都需要的技能。所以,我根据不同的经验,将这些知识点进行了粗略分组。请注意,这只是一个粗略的分组,并不一定是很精确的。
写在前面
如果你只是一个想成为Android开发者的人,并且还没有写过任何应用,那么这篇文章对你来说,还有点太早。本文主要是为了帮助开发者成为一个更专业的人。
本文,我会给你很多建议,不会让你空手而归。文章中列出了如何在短时间成为一个专业的开发者。读完文章,需要你自己去练习,并时常回来看看这些技能。
在本文开始之前,我就当你已经在GooglePlay发布过Android应用并且使用GitHub来进行源码管理。
0-2年开发经验
Android是一个非常复杂的框架,它拥有陡峭的学习曲线。有一些复杂的概念的确是Native的Android开发者需要学习的,但另一部分却是由于Android的原因,造成了它的复杂度。
当你向专业进*时,除了你的软件开发工作以外,你应该学习Android框架,忘记语言、架构、流行的开源库,专注于核心概念,并进行深入的研究。
具体来说,我建议你更多的了解以下内容:
Android内存管理和进程调度当面临「LowMemoryKiller」的时候,如何保证你的应用程序稳定可靠的运行?这是一件很复杂的事情。长话短说,当用户切换到其它应用时,你应用的生命周期就会被打乱,但是当用户过一会儿重新切换回来的时候,用户却希望你的应用程序像任何事情都没有发生过一样,正常运行。
在本文中,我并不会介绍内存管理的任何细节,如果你想了解它们,可以看看这篇文章。
生命周期如果有人要我说出Android应用程序中的复杂度和Bug的主要来源,我会立马大声告诉他是“生命周期”(然后捂住脸哭)。
Application、Activity、Fragment、Service、BroadcastReceiver、ContentProvider和一些Android框架的核心组件,都拥有复杂的生命周期,并且它们的生命周期还不一样。如果你觉得这还不够多,Google也一直在推出新的库和框架,这些库都有自己的复杂性和独立的生命周期。Loader,ViewModel和LiveData都是为了解决这些问题而推出的。
有件有意思的事情,我从来没有看到过任何有关“生命周期“的定义。我们一直在使用它,但是它到底是什么意思呢?据我所知,在某种程度上,你只是把一些节点串联在一起,构建出一个生命周期的图。我对生命周期有过很多的思考,在这里,我将尝试对它进行定义。
组件的生命周期是一个抽象的状态机。这里的抽象的意思是指,这些状态机的状态是预先定义好的,它们之间的转换条件也是定义好的。但是这些定义是不完整的。你需要去实现缺少的部分,使他们可以正常工作。这些缺少的部分是这些组件方法的子集,我们称其为“生命周期回调”,除了状态机本身之外,这些生命周期回调中,也有很多隐式的限制和约束。这些限制有些写在了文档中,而有些却并没有记录。
生命周期到底有多复杂?我们先来看一下这张图(它有点不完整,还有点过时)。这张图,看起来有点可怕。不过,你也不要慌,大多数Andorid开发者都搞不明白这个图。事实上,即使Google的Android开发者也搞不明白生命周期的问题。Google在发布Lifecycle组件的时候,里面引入了一些有关Fragment的bug,直到后续的新版本发布了才得以修复。
虽然现在你不需要完全掌握Android的生命周期,但是你必须要知道一些重要的细节。否则,你的代码会变得混乱不堪,并且容易出现一系列难以解决的问题。我写了两篇文章Activity生命周期与Fragment生命周期,描述了生命周期的细节。当你不知道如何使用onStart和onResume时,你可以去看看这两篇文章。
当你掌握了生命周期的基础知识,你可以去看看GaborVaradi写的Android开发的十宗罪,这篇文章,列举出了大多数开发者都会犯的错误。这些错误大多数都与生命周期有关。
顺便说一下,在面试中,生命周期相关的问题也会被经常问到。这也是你必须好好学习生命周期的原因。
Context在每一个Android应用程序中,都有一个或多个上下文对象。
和生命周期一样,它也很难被解释。它就像是一个“上帝类“一样,它有非常多的能力。我们很难用一两句话就把它描述清楚。尽管如此,理解Context职责和不同Context之前的区别也是非常重要的。
本文中,没有更多关于Context的内容,我建议你去读一下StackOverflow中关于《WhatisContextonAndroid?》的回答和这个回答的内容.
UI线程每一个Android应用程序都有一个特殊的线程——UI线程。这一个线程在屏幕上绘制出UI页面。如果你让UI线程超负荷运行,你的应用程序将会变得卡顿,不响应。在极端情况下,UI线程中的错误会导致整个应用程序出错(至少看起来像是出错了)。
如果你想详细了解线程背后的机制原理,你可以去看这个视频,视频中详细解释了Android中的多线程,包含UI线程的相关细节和可能存在的问题。
逻辑拆分从整体上说,Android框架的代码很不“整洁”。它包含着很多的上帝类,这些类中,每一个有数千行代码,并且我们还必须去扩展这些类,才能让我们的应用程序运行起来。在多数情况下,不管是Application,Activity,Fragments还是Service,我们都是在一个很大的类中,做很多的事情。
虽然在Andorid开发中,这是一个常见的做法,但这样子做并不利于长期维护我们的代码逻辑。因此我建议,要尽可能的注意这个问题,多找机会去重构代码,将逻辑拆分到独立的类中去。
说实话,我现在并不认为,一个初级开发者可以对架构和设计做出太多的改善工作。正确的封装代码逻辑,提取出有意义的类,都需要一些开发经验。当然,我也不希望你不去思考代码拆分,你可以做一些力所能及的事情,避免出现不可控的情况(例如,一个Activity中写了超过行代码)。
刚开始,你可以尝试拆分这篇文章中描述的与Context有关的逻辑。
2-4年开发经验
当你在你的职业生涯中工作几年,你变成经验丰富的Android开发者,通过研究和学习,你可以很轻松的实现一些非专业化的功能。那下一步,你该做什么?
我认为,在这个时候,你已经很熟悉Android框架的基础知识了,可以尝试去学习更高层次的技能。这些技能不局限于Android,它们是一些通用的软件开发的技能。具体来说,你可以研究以下主题:
依赖注入依赖注入是一个