精华内容
下载资源
问答
  • 第一行代码Android

    2014-11-22 18:26:59
    第一行代码Android第一行代码Android,高清版
  • 第一行代码 android 第二版书中源代码,第一行代码 android 第二版书中源代码。
  • 第一行代码Android学习练习代码
  • 我的新书,《第一行代码 Android 第3版》已出版!

    万次阅读 多人点赞 2020-04-02 10:13:08
    第一行代码——Android》这本书自2014年出版以来,已经过了6个年头了。期间Android系统版本经历了4.0到10.0系统的巨大升级,开发技术也发生了翻天覆地的变化。在2016年的时候,我曾对书中的内容进行了大幅度的更新...

    《第一行代码——Android》这本书自2014年出版以来,已经过去了6个年头。期间Android系统版本经历了4.0到10.0系统的巨大升级,开发技术也发生了翻天覆地的变化。在2016年的时候,我曾对书中的内容进行了大幅度的更新,出版了这本书的第2版,也就是所谓的《第二行代码》。而如今,再隔4年之久之后,《第三行代码》终于要以全新的面貌跟大家见面了。

    创作

    不得不说,《第一行代码 第3版》这本书,在出版的过程中经历了太多坎坷,以至于到今天才能跟大家见面。这里先跟所有的读者朋友们说声:对不起,让你们久等了!

    早在2017年,Google在I/O大会上宣布Kotlin将成为Android系统的一级开发语言,从此与Java平起平坐。那时我就猜想到,在Android应用层的开发语言将掀起一场大淘汰式的替换。当时图灵出版社也看到了这个新闻,图灵的编辑很快就联系我,问我准不准备写一本Kotlin方面的书?

    我认为掌握一门语言是需要时间沉淀的,学语法可能两周就能搞定,但要想体会到精髓,则需要不断通过写代码去磨练和提升。那个时候我不认为我具有写好这样一本书的能力,所以也就没有答应。

    长期关注我的朋友应该知道,在这之后的一年多时间里,我把时间基本都放在了GifFun这个开源项目上面。这个项目一开始是使用Java来写的,中途被我切换成了Kotlin。因为我知道,要想熟练掌握一门语言,最好的方式就是不断用它来写代码。我也就借此机会,对Kotlin有了更加深刻的理解。

    到了2019年,我和出版社又重新进行了商讨,准备对《第一行代码》再度更新,推出第3版,这次会将全书的代码都改用Kotlin来实现。但问题在于,Kotlin作为一门新兴语言,程序员基数远不可能有Java那样庞大。如果换了语言之后导致大量读者看不懂怎么办?

    当时出版社提出了一个方案,让我单独再写一本专门讲解Kotlin语言的书,和《第一行代码》配套使用。不过我认为这个方案会提升《第一行代码 第3版》的阅读门槛,就没有答应。

    几经思考之后,我认为想出了一个最佳的写作方案:在一本书里面同时讲解Android和Kotlin这两门技术。这也将会是《第一行代码》中首次引入编程语言的讲解。

    但如何安排这两门技术之间的内容顺序是一件非常有挑战的事情。因为Kotlin是Android程序的开发语言,很显然需要先掌握语言才能开发Android程序。可是如果先花小半本书的篇幅讲解Kotlin,然后再开始学习Android开发,这种学习方式一定非常枯燥,因为学编程语言最怕的就是光学不练。

    为此,我决定采用一种或许别人从未尝试过的方式,将Kotlin和Android穿插在一起讲解。首先使用一个快速入门章节介绍Kotlin的基础知识,然后利用已掌握的知识开始学习Android开发,这样可以做到立刻上手实践。之后的每一章当中,都会结合相当章节的Android内容再学习一些Kotlin的进阶知识,等学完整本书之后,你就能同时熟练地掌握Android和Kotlin这两门技术了。

    这种穿插讲解的方式非常考验我的内容设计能力,因为每章的Android开发中用到的Kotlin知识不能过于超前,不然读者会出现看不懂的情况。同时每章讲解的Kotlin知识又要结合着相应章节的Android知识,这样才能更好地理解该知识点的用法与场景。它们之间的内容是相辅相成的。

    为此,在前期制订目录上面我就花了将近一个月的时间,之后编写Kotlin快速入门这一章又花了两个多月的时间。因为我以前从来没有写过编程语言类的书,为了把Kotlin重要的基础知识在这一章里面都体现出来,我花费了很多心思。在编写这一章的过程中,Google I/O 2019大会上正式宣布了Kotlin First的口号,Kotlin已经不再和Java是平起平坐,而是变成一等公民了。虽然这是我意料之中的事情,但是比我预期来得要早,也让我更加坚定了写好这本书的信心。

    《第一行代码 第2版》是2016年3月份开始动笔的,同年9月份完稿,12月份出版。《第一行代码 第3版》是2019年3月份开始动笔的,但是9月份却远远无法完稿,因为改动内容和新增内容要远比第2版时大得多。我几乎把所有的业余时间都放在了上面,最终在11月底才勉强全书完稿。

    本来是想着好事多磨,好书也不怕晚出版几个月,过完年应该就可以跟大家见面了。没想到,我们恰好碰上了一场从未遇到过的疫情灾难,包括17年前的SARS也没有今天的新冠疫情严重。

    这场疫情导致中国各方面都受到了极大的创伤,学校停课,企业停工,大家都只能呆在家里,不出门就是最安全的。而受疫情的影响,出版社、印刷厂都延迟上班,无法复工。我每天在公众号中都会被读者追问,新书到底什么时候可以出版?这个问题我当时真的无法回答,疫情所带来的影响要持续到何时真的没人知道。

    后来到了三月份,国内的疫情已经逐渐控制住,多数企业也在慢慢复工复产了,这本书才终于能够得以出版印刷。但是,虽然国内的疫情已经缓和,海外疫情却紧接着爆发了起来,截至到我写本篇文章时也没有任何缓和的迹象。现在仍然不知道这场疫情给全球带来的影响要持续到何时,我真心希望你在阅读这篇文章时,新冠已经成为了过去式,每个人都恢复到了正常的生活当中。

    经过了如此多磨难才诞生的这本书,希望能给大家送去更多的知识吧。

    变化

    我相信一定会有很多读者朋友都想问一个问题:《第一行代码 第3版》相比于《第一行代码 第2版》具体有哪些变化呢?在这里我就向大家详细地介绍一下主要的变化部分。

    首先是编程语言上的改变,本书前两版都是使用Java作为应用程序的编程语言,而第3版使用了Kotlin,这也是目前Google最推荐我们使用的编程语言。

    本书的前两版中也没有涉及过语言方面的讲解,默认读者是有Java语言基础的。而第3版中对Kotlin语言进行了非常全面的讲解,不需要读者有任何Kotlin语言的基础。

    另外你需要知道,《第一行代码 第3版》是一本升级版的书,而不是一本全新的书,因此书中整体的知识架构仍然和《第一行代码 第2版》是保持一致的。

    虽然整体知识架构不变,但还是涉及了一些章节上的变动。

    第3版中移除了之前第2版中的11、15两章内容。这两章内容分别讲解的是LBS开发、以及App上架。

    LBS开发其实主要讲解的都是百度地图SDK的用法,但是百度地图SDK很可能会频繁更新,而书中的内容却是不能随意改变的,所以我认为这部分内容更应该去百度地图的开发者官网进行学习。

    至于App上架主要讲解的是360应用商店的上架过程,由于现在国内的App上架已经变得非常复杂,个人开发者都需要专门去申请软件著作权才能将自己开发的App上架到应用商店,书中的内容已经不再适用,所以也进行了移除。

    而第3版中新增了三章内容,分别是第2章、第13章和第16章。

    第2章就是之前提到的Kotlin快速入门章节,这一章将会带你迅速上手Kotlin编程,讲解了如变量、函数、逻辑控制、面向对象编程、Lambda编程、空指针检查等Kotlin中最基础、同时也是最核心的知识点。学完了这一章内容之后,你就可以使用Kotlin来编写一些Android程序了。

    第13章是专门讲解Jetpack的一个章节。Jetpack是Google于近年推出的一个开发组件工具集,旨在帮助我们编写出更加符合高质量代码规范、更加具有架构设计的应用程序。是的,现在我们已经不能停留在实现功能就万事大吉的层面了,而是要在实现功能的同时,追求更高的代码质量和架构设计。第13章中讲解了ViewModel、Lifecycles、LiveData、Room、WorkManager等内容,基本涵盖了Jetpack架构模块当中最主要的一些组件。

    第16章是第3版中新补充的一个实战章节。本书的前两版中都只有一个实战章节,而第3版中会有两个实战章节。不同于过去的App开发实战,第16章会带你一起编写并发布一个开源库。因为我之前也写过几个比较知名的开源项目,并且我在公司的主要工作就是SDK方面的研发,所以其实我很擅长写这部分内容。还有什么事情是比在别人的项目中看到引用了自己的开源库更让人激动的呢?

    介绍完了整体章节上的变动,我们再来看一些具体内容上的变化。

    为了响应Google的Kotlin First号召,第3版中将全书所有的代码都改成了使用Kotlin语言来进行实现,Android的持续Kotlin化也是未来长期发展的必然趋势。不过,由于新增的第2章只是讲解了一些Kotlin的基础内容,为了能够让你更加全面地掌握Kotlin方方面面的知识,第3版几乎在每一章的最后都加入了一个Kotlin课堂的环节。全书一共有12节Kotlin课堂,全面涵盖了诸如常用技巧、高阶函数、泛型、协程、DSL等等语言层面的知识,绝对足以让你熟练掌握Kotlin这门语言了。

    除了在编程语言方面存在大量的变动之外,Android开发方面当然也不会一成不变。自《第一行代码 第2版》出版之后,Android又经历了8 9 10系统的快速迭代。每个新系统版本中都会增加一些崭新的特性,也都需要进行一些开发方面的适配,第3版将这些内容全部涵盖了进去。

    另外,近些年来追求架构设计的开发者越来越多,类似MVP、MVVM等架构的使用也越来越广泛,传统的MVC架构逐渐在被抛弃。第3版的第15章中对MVVM架构进行了非常详细的讲解,并且配合着Google提供的Jetpack组件,最终完成了一个MVVM架构的天气预报程序。虽然这个天气预报程序我已经写了3版了,但是这次将会是最具架构性,也最符合高质量编码规范的版本。相信会对你未来开发公司的实际项目带来很大的帮助。

    除了上述主要变化之外,还有许多小细节方面的变动这里就不一一列举了,等待你自己阅读的时候发现吧。

    设计

    虽说这是一本升级版的书,可我花费在上面的时间和精力丝毫不亚于写一本新书。所以,不管是在内容方面还是在设计方面,我都希望它和第2版能够有着更加明显的区别。因此,图灵的设计师们这次也辛苦了。

    首先是封面的设计,和第2版时一样,这次第3版的封面也是由图灵的设计师做出了几个版本,然后我在公众号上发起了一个投票,让广大读者朋友们共同选出最满意封面,投票结果如下:

    最后蓝色封面以压倒性的优势当选,《第一行代码》也终于把红绿蓝这三元色全部凑齐了。第3版的封面正式确定:

    然后是书签,第2版中首次在书里附赠了书签,那么第3版当然会把这个好传统继续坚持下去了。书签的设计应该尽可能地展现出一本书的特点,而我认为《第一行代码 第3版》最大的特点就是两部分:Android 10和Kotlin。所以我也让设计师专门为这两个主题设计了两种书签,我们来一起欣赏一下吧:

         

    每本书中都会赠送这两个书签,虽然一本书送两个书签可能有点多余,但我觉得这会给人一种更加完整的感觉。

    除此之外,第3版中还首次提供了全书知识架构的思维导图。这是我根据书中主要知识点进行整理,并由本书编辑张霞绘制出来的,共分为Android和Kotlin两张图。

    思维导图可以方便你纵览本书Android和Kotlin的宏观图景,帮助你梳理各章的知识要点。

    Android的思维导图如下:

    Kotlin的思维导图如下:

    这两张思维导图都会以彩页的形式装订在书中,方便你随时查看。

    最后是给高校老师们的福音,由于本书前两版被大量高校当作教材使用,这次为了便于高校老师和培训机构教学,第3版中专门配备了相应的PPT课件。在书中的前言部分附有所有随书资源的下载地址。

    定价

    我之前发现有部分读者朋友对书的定价方式是有误解的,所以这里先来科普一下。

    任何一本书,都是要以成本为依据来定价的,而不是内容。成本指的主要是这本书印刷所需花费的费用,所以页数多的书一定比页数少的书贵,彩色页的书一定比黑白页的书贵。

    在我之前的一篇文章中,有些读者留言,认为一本书应该是根据内容的好坏来定价,其实这是不可能的。也许会存在一些好书因为口碑特别好而提高定价,但一定不会存在一本差书因为自我感觉内容比较差而主动降低定价。

    由于《第一行代码 第3版》新增了许多Kotlin方面的知识讲解,书的总页数也从第2版时的500多页变成了现在的700多页,所以涨价是在所难免的事情。

    一开始本书编辑张霞建议将第3版售价定为99元,我觉得相比于第2版的79元涨幅有点高,问她可不可以降低到89元。她告诉我,700多页的书定价89元有很大概率会被出版社打回,但她仍然以这个价格上报了试试。果不其然,最终这个定价审核没有通过,因为市面上700多页的书定价都至少在100元以上。

    最终我也做出了让步,同意将第3版定价为99元,至少控制在了百元以内。不过这仅仅只是书的定价,而通常我们在网上买书都是有折扣的。具体折扣的多少由各网店自己决定,我参与不了,但一般也就是七八十块钱就能买到了。

    购买

    了解了这么多,不知道你有没有决定要买一本呢?目前《第一行代码 第3版》已经在京东、当当等网上书店开启预售了,限量签名版先到先得,有需要的小伙伴们请点击下面的链接。另外全书的完整目录,也可以到下面的链接页面进行查看。

    京东购买地址

    当当购买地址

    天猫购买地址


    关注我的技术公众号,每天都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • 第一行代码——Android》源代码,内容和书上一致,和书配套
  • hello-android 第一行代码 Android
  • 第一行代码Android学习练习代码
  • 第一行代码Android学习练习代码
  • 第一行代码Android学习练习代码3
  • 第一行代码Android学习练习代码12
  • 第一行代码Android学习练习代码11
  • 第一行代码Android学习练习代码8
  • 第一行代码Android学习练习代码7
  • 第一行代码Android学习练习代码6
  • 第一行代码Android学习练习代码5
  • 第一行代码Android学习练习代码4
  • 第一行代码Android学习练习代码2
  • 第一行代码 Android PDF文件大小为200M,分为了两个分卷,请全部下载后再解压。这是第一个分卷。
  • 第一行代码Android知识点总结.pdf
  • 第一行代码 Android PDF文件大小为200M,分为了两个分卷,请全部下载后再解压。这是第二个分卷。
  • Android第一代码行:《第一行代码Android(第二版)》部分代码,书本配套代码可见https:github.comguolindevbooksource
  • 第一行代码 Android读书笔记第一章 开始启程-你的第一行Android代码Android系统架构Android应用开发特色搭建开发环境创建第一个Android项目运行第一个Android项目 第一章 开始启程-你的第一行Android代码 Android...

    第一章 开始启程-你的第一行Android代码

    Android系统架构

    Android大致可以分为四层架构:Linux内核层、系统运行库层、应用框架层、应用层。
    1. Linux内核层
    Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理。
    2. 系统运行库层
    这一层通过一些c/c++库来为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES提供了3D绘图的支持,Webkit提供了浏览器内核的支持。
    在这一层还有Android运行时库,他主要提供了一些核心库,能够允许开发这使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的。它针对手机内存、CPU性能有限等情况做了优化处理。
    3. 应用框架层
    这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成,开发者也可以通过这些API来构建自己的应用程序
    4. 应用层
    所有安装在手机上的应用程序都是属于这一层的。

    Android应用开发特色

    1. 四大组件
    Android系统四大组件分别是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。其中活动是所有Android应用程序的门面,凡是在应用中你看得到的东西,都是放在活动中的。而服务就比较低调了,你无法看到它,但它会一直在后台默默地运行,即使用户退出了应用,服务仍然是可以继续运行的。广播接收器允许你的应用接收来自各处的广播消息,比如电话,短信等。当然你的应用也可以向外发出广播消息。内容提供器则为应用程序之间共享数据了可能,比如你想要读取系统电话本中的联系人,就需要通过内容提供器来实现。
    2. 丰富的系统控件
    Android系统为开发者提供了丰富的系统控件,使得我们可以很轻松地编写出漂亮的界面。也可以自己定制自己的控件。
    3.SQLite数据库
    Android系统还自带了这种轻量级、运算速度极快的嵌入式关系型数据库,不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作、让存储和读取数据变得非常方便。
    4. 强大的多媒体
    Android系统还提供了丰富的多媒体服务,如音乐、视频、录音、拍照等等。这些都可以在程序中通过代码进行控制。
    5. 地理位置定位
    Android手机都内置GPS。

    搭建开发环境

    1. 下载JDKJDK官网下载链接
    2. 下载IDEAIDEA下载链接
    3. 下载Android SDK,通过idea下载
      打开idea,新建一个项目,选择android,点击install SDK进行下载。在这里插入图片描述

    创建第一个Android项目

    在这里插入图片描述* name为软件名称,package name是项目的包名,Andriod系统是通过包名来区分不同的应用程序,所以要保证包名的唯一性。Minimum API Level为项目的最低兼容版本*
    在这里插入图片描述

    运行第一个Android项目

    1.点击菜单栏File下的project structure。配置Artifacts。artifact是一种用于装载项目资产以便于测试,部署,或者分布式软件的解决方案。
    在这里插入图片描述2. 选择运行设备
    在这里插入图片描述

    分析第一个Android项目

    1. 项目结构的分析
    在这里插入图片描述
    4. .gradle和.idea都是自动生成的一些文件,无需关心,也不需要编辑。
    5. app :项目中的代码、资源等内容几乎都是放置在这个目录下的。
    6. gradle:这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。
    7. .gitgnore:这个文件是用来将指定的目录或文件排除在版本控制之外的。
    8. build.gradle:项目全局的gradle构建脚本,通常这个文件的内容是不需要修改的。
    9. gradle.properties:全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
    10. gradlew和gradlew.bat:用来是命令行界面执行gradle命令,其中gradlew是在linux或mac系统中使用的,gradlew.bat是在windows系统中使用的。
    11. 项目名.iml:自动生成的文件,用于标识这是一个IntelliJ IDEA项目,不需要修改这个文件中的任何内容。
    12. local.properties:用于指定本机中的Android SDK路径,通常内容都是自动生成的,不需要修改。
    10.settings.gradle:这个文件用于指定项目中所有引入的模块。
    2. app目录的分析
    在这里插入图片描述
    1 build:主要包含了一些在编译时自动生成的文件,不需要过多关心。
    2 libs:在项目中使用的第三方jar包,放在这个目录下的jar包会自动添加到构建路径里去。
    3 androidTest:用来编写Android Test测试用例,可以对项目进行一些自动化测试。
    4 main下面的java:放置所有Java代码的地方。
    5 res:项目中使用到的所有图片、布局、字符串等资源需要存放在这个目录下。图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下。应用图标放在mipmap目录下。
    6 AndroidMainifest.xml:整个Android项目的配置文件,在程序中定义的所有四大组件都需要在这个文件里注册,还可以在这个文件中给应用程序添加权限声明。
    7 test:用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
    8 gitinore:这个文件用于将app模块内的指定的目录或文件排除在版本控制之外。
    9 app.iml:自动生成的文件,不需要关心。
    10 build.gradle:这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
    11 proguard-rules.pro:这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
    3. 分析项目如何运行
    1 打开AndroidMainifest.xml 在这里插入图片描述
    这段代码表示对活动进行注册,没有在AndroidMainifest.xml里注册的活动是不能使用的。
    2 分析活动代码
    在这里插入图片描述继承AppCompatActivity,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Andriod2.1系统。Activity是Andriod系统的一个活动基类,项目中所有活动都必须继承它或者它的子类才能拥有活动的特性。onCreate这个方法是一个活动被创建时必定要执行的方法。
    Android程序的设计讲究逻辑和视图分离,因此不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。
    3 如何引用res目录下的内容
    例如res/values/strings.xml。可以有两种方式进行引用。

    1. 在代码中通过R.string.name获得该字符串的引用
    2. 在xml中通过@string/name获得该字符串的引用。
      其中string部分是可以替换的,如果是引用的图片资源就可以换成drawable,如果引用的是应用图标就可以替换成mipmap,如果是引用的布局文件可以替换成layout
      4 详解build.gradle文件
      Gradle是一个非常先进的项目构建文件,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了传统基于XML(如Ant和Maven)的各种繁琐配置。
      最外层的build.gradle

    jcenter和google

    dependencies闭包中使用了classpath声明了一个Gradle插件。
    app目录下的build.gradle
    apply plugin应用了一个插件,一般有两种值可选:com.android.application,表示这是一个应用程序模块,com.android.library表示这是一个库文件。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
    compileSdkVersion用于指定项目的编译版本。buildToolsVersion用于指定项目构建工具的版本。
    defaultConfig闭包中可以对项目的更多细节进行配置。applicationId用于指定项目的包名。minSdkVersion用于指定项目最低兼容的Android系统版本。targetSdkVersion指定的值表示你在该目标版本上已经做过充分的测试。
    buildTypes闭包中用于指定生成完整文件的相关配置,通常会有两个子闭包,一个是debug,一个是release。debug闭包用于指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置。debug闭包是可以忽略不写的release闭包中minifyEnabled用于指定是否对项目的代码进行混淆,true代表混淆,false代表不混淆。proguardFiles用于指定混淆时使用的规则文件,这里指定了两个文件,第一个是proguard-android.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则。第二个是proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。

    掌握日志工具的使用

    Android中的日志工具是Log(android.util.Log),这个类提供了如下5个方法来供我们打印日志。

    1. Log.v()。用于打印那些最为繁琐的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
    2. Log.d()。用于打印一些调试信息,对应级别debug,比verbose高一级。
    3. Log.i()。用于打印一些比较重要的数据,可以分析用户行为数据,对应级别info,比debug高一级。
    4. Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比info高一级。
    5. Log.e()。用于打印程序中的错误信息,当有错误信息打印出来,代表程序出现了严重问题,必须尽快修复。对应级别error,比warn高一级。

    第二章 先从看得到的入手-探究活动

    活动是什么

    活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动。

    手动创建活动

    右键new -activity- empty activity。
    勾选Generate Layout File表示会自动创建一个对应的布局文件。
    勾选LauncherActivity表示会自动将新创建的活动设置为当前项目的主活动。

    创建和加载布局

    Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的。
    右击app/src/main/res目录->New->Directory,会弹出一个新建目录的窗口,起名为layout。右键->new ->Layout resources file,新建布局资源文件。
    在这里插入图片描述
    Design是当前的可视化布局编辑器 ,在这里不仅可以预览当前的布局,还可以通过托放的方式编辑布局。而Text则是通过XML文件的方式来编辑布局。

        <Button
                android:text=" Button 1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" 
                android:id="@+id/button_1"/>
    

    match_parent表示让当前元素和父元素一样宽,wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
    在活动里新增代码setContentView(R.layout.first_layout);setContentView()方法来给当前的活动加载一个布局。项目中添加的任何资源都会在R文件中生成一个相应的资源id。

    注册活动以及配置主活动

    所有的活动都要在AndroidManifest.xml中进行注册才能生效。Idea会自动帮忙注册。但是现在仍然不能运行程序,程序当前仍然没有配置主活动。
    配置主活动的方法
    在标签的内部加入

     <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    

    在活动中使用Toast

    Toast是Android系统提供的一种提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间内后自动消失,并且不会占用任何屏幕空间。

     Button button1=(Button) findViewById(R.id.button_1);
            button1.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    Toast.makeText(FirstActivity.this,"you clicked",
                            Toast.LENGTH_SHORT).show();
                }
            });
    

    findViewById()可以获取到在布局文件中定义的元素,返回的是一个View对象,需要向下转型成Button对象。setOnClickListener()为按钮注册一个监听器,点击按钮时就会执行监听器的onClick()方法。
    Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来就可以。makeText()需要传入3个参数,第一个参数时Context,也就是Toast要求的上下文。第二个参数时Toast显示的文本内容,第三个参数时Toast显示的时长。

    在活动中使用Menu

    在res目录下新建一个menu文件夹,右键文件夹->new ->Menu resource file。
    在新创建好的文件添加代码。

    <item android:id="@+id/add_item" android:title="Add"/>
    <item android:id="@+id/remove_item" android:title="Remove"/>
    

    标签用来创建具体的某一个菜单项。
    回到活动重写onCreateOptionsMenu()方法

      @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main,menu);
            return true;
        }
    

    getMenuInflater()方法可以获得MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单。inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单。第二个参数用于指定菜单项将添加到哪一个Menu对象当中。返回值true,表示允许创建的菜单显示出来,如果返回false,创建的菜单将无法显示。

    销毁活动

    使用代码的方式:finish(),在活动中调用一下这个方法就可以销毁当前活动了。

    使用Intent在活动之间穿梭

    前提:
    需要创建多个活动,以及布局。
    什么是Intent
    Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动活动、启动服务以及发送广播。
    Intent大致可以分为两种:显式Intent和隐式Intent。
    显示Intent的用法
    Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?> cls)。第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的。

    Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);
    

    隐式Intent的用法
    它并不明确的指出要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统分析Intent,找出合适的活动。
    AndroidManifest.xml当中为要跳转的页面添加代码

      <activity android:name=".SecondActivity">
                <intent-filter>
                    <action android:name="com.example.activityTest.ACTION_START"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
            </activity>
    

    只有和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。
    此处没有指定category的原因在于android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法时会自动将这个category添加到Intent中。
    每个Intent中只能确定一个action,但却能指定多个category。
    指定category的方法

    Intent intent=new Intent("com.example.activityTest.ACTION_START");
    intent.addCategory("com.example.activitytest.My");
    startActivity(intent);
    

    更多隐式Intent的用法

    使用隐式Intent,不仅可以启动自己程序内的活动,还可以启动其他程序的活动,这使得Android多个应用程序之间的功能共享成为了可能。

    Intent intent=new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("https://www.baidu.com/"));
    startActivity(intent);
    

    在标签中可以再配置一个标签,用于更精准的指定当前活动能够响应什么类型的数据。

    • android:scheme。用于指定数据的协议部分。如http,geo地理位置,tel表示被打电话。
    • android:host。用于指定数据的主机名部分。
    • android:port。用于指定数据的端口部分。
    • android:path。用于指定主机名和端口之后的部分。
    • android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
      只有标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能响应该Intent。
     Intent intent=new Intent(Intent.ACTION_DIAL);
     intent.setData(Uri.parse("tel:10086"));
    startActivity(intent);
    

    向活动传递数据

    向下一个活动传递数据
    在启动活动时传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。
    在跳转前的活动页面当中

     String data="Hello !";
     Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
     intent.putExtra("data",data);
    

    putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是真正要传递的数据。
    在跳转后的页面当中

      Intent intent=getIntent();
      String data=intent.getStringExtra("data");
      Log.d("SecondActivity",data);
    

    如果传递的是整型数据,则使用getIntExtra()方法,如果传递的是布尔型数据,则使用getBooleanExtra()方法
    向上一个活动传递数据
    Activity中还有一个startActivityForResult()方法也是用于启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
    第一个活动的代码如下

    Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
    startActivityForResult(intent,1);
    

    startActivityForResult()方法接收两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
    第二个代码如下

    @Override
        public void onBackPressed() {
            Intent intent=new Intent();
            intent.putExtra("data_return","he");
            setResult(RESULT_OK,intent);
            finish();
        }
    

    当用户按下Back键,就会去执行onBackPressed()方法中的代码。setResult()是专门用于向上一个活动返回数据的。第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则把带有数据的Intent
    在第一个活动当中添加

      @Override
        protected void onActivityResult(int requestCode, int resultCode,  Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case 1:
                    if (resultCode == RESULT_OK) {
                        String returnedData = data.getStringExtra("data_return");
                        Log.d("FirstActivity", returnedData);
                    }
                    break;
                default:
            }
        }
    

    由于是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法。

    活动的生命周期

    返回栈
    Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈。在默认的情况下,每当新启动了一个活动,它就会在返回栈中入栈,并处于栈顶的位置。而每当按下Back键或调用finish()方法来销毁一个活动时,处于栈顶的活动会出栈。系统总是会显示处于栈顶的活动给用户。
    活动状态
    每个活动在其生命周期中最多会有4种状态。

    1. 运行状态
      当一个活动位于返回栈的栈顶时,这时活动处于运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
    2. 暂停状态
      当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。并不是每一个活动都会占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间的部分区域。处于暂停状态的活动仍然时存活的,系统也不愿意去回收这种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只有在内存极低的情况下,系统才会去考虑回收这种活动
    3. 停止状态
      当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态,系统仍然会为这种状态保存相应的状态和成员变量,但是这并不是完全可靠的,当有其他地方需要内存时,处于停止状态的活动有可能会被系统回收。
    4. 销毁状态
      当一个活动从返回栈移除后就变成了销毁状态,系统会最倾向于回收处于这种状态的活动,从而保证手机的内存充足。
      ** 活动的生存期**
      Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节。
    • onCreate()。它会在活动第一次被创建的时候调用,在这个方法中完成活动的初始化操作,比如说加载布局,绑定事件等。
    • onStart()。这个方法在活动由不可见变为可见的时候调用。
    • onResume()。这个方法在活动准备好和用户进行交互时使用。此时的活动一定位于返回栈的栈顶。并且处于运行状态。
    • onPause()。这个方法在系统准备去启动或者恢复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据。但这个方法所谓执行速度一定要块,不然会影响到新的栈顶活动的使用。
    • onStop()。这个方法会在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框的式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。
    • onDestory()。这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
    • onRestart()。这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
      可以将活动分为3种生存期。
      1 完整生存期。活动在onCreate()方法和onDestory()方法之间所经历的,就是完整生存期。一般情况下一个活动会在onCreate()方法中完成各种初始化操作,而在onDestory方法中完成释放内存的操作。
      2 可见生存期。活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互,仍然可以通过这两个方法,合理地管理对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
      3 前台生存期。活动onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的。

    活动被回收了怎么办

    Activity中还提供了一个onSaveInstanceState()回调方法,这个方法可以保证在活动被回收之前一定会被调用。可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。

     @Override
        protected void onSaveInstanceState(@NonNull Bundle outState) {
            super.onSaveInstanceState(outState);
            String tempData="Something you just typed";
            outState.putString("data_key",tempData);
        }
    

    onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串。
    如何恢复保存下来的数据
    onCreate()方法其实也有一个Bundle类型的参数,这个参数一般情况下都是null,但是如果在活动被系统回收之前有通过onSaveInstanceState()方法来保存数据的话,这个参数就会带有之前所保存的全部数据。

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if(savedInstanceState!=null)
            {
                String tempData=savedInstanceState.getString("data_key");
                Log.d("tag",tempData);
            }
        }
    

    Intent可以结合Bundle一起用于传递数据,可以把需要传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里。到了目标活动之后再从Intent中取出Bundle。

    活动的启动模式

    活动的启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。
    standard
    standard是活动默认的启动模式,在不进行显式指定的情况下,所有的活动都会自动使用这种启动模式。在standard模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
    singleTop
    当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会在创建新的活动实例。但当活动并未处于栈顶位置时,这时再启动活动,还是会创建新的实例的。
    singleTask
    当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
    singleInstance
    singleInstance模式的活动会启用一个新的返回栈来管理这个活动。程序中有一个活动是允许其他程序调用的,想实现其他程序和我们的程序可以共享这个活动的实例,可以使用singleInstance模式进行解决,这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
    在这里插入图片描述

    活动的最佳实践

    知晓当前是在哪一个活动
    新增一个基础类,该类是简单的java class而不是新增空白活动,代码如下。

    
    public class BaseActivity extends AppCompatActivity {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d("BaseActivity",getClass().getSimpleName());
    
        }
    }
    
    

    更改之前的activity的继承体系,改为继承BasicActivity。这样每当进入一个活动的界面,该活动的类名就会被打印出来。
    随时随地退出程序
    如果一个程序已经打开了许多活动,此时退出程序是非常不方便的,需要连按许多次Back,按Home只是把程序挂起,并没有退出程序。
    需要一个专门的集合类对所有的活动进行管理。

    public class ActivityCollector {
        public static List<Activity> activities =new ArrayList<>();
        public static void addActivity(Activity activity){
            activities.add(activity);
        }
        public static void removeActivity(Activity activity){
            activities.remove(activity);
        }
        public static void finishAll(){
            for(Activity activity:activities){
                if(!activity.isFinishing())
                    activity.finish();
            }
        }
    }
    

    onCreate创建活动时使用addActivity方法,当onDestory销毁活动时调用removeActivity方法。当想强制退出时调用finishAll方法。
    还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出。
    android.os.Process.killProcess(android.os.Process.myPid())
    killProcess()方法用于杀掉一个进程,它接收一个进程id参数,myPid()方法用于获得当前程序的进程id。killProcess()方法只能用于杀掉当前程序的进程,不能使用这个方法去杀掉其他程序。
    启动活动的最佳写法

      public static void actionStart(Context context,String data1,String data2){
            Intent intent=new Intent(context,SecondActivity.class);
            intent.putExtra("param1",data1);
            intent.putExtra("param2",data2);
            context.startActivity(intent);
        }
    

    通过调用函数,能够较为直观的得知传递了什么参数。

    展开全文
  • 第一行代码 android学习笔记 修改完整版
  • 第一行代码Android(word+pdf全书) 包含: 第一行代码——Android(全书).doc 第一行代码——Android(全书).pdf
  • 第一行代码-Android 源代码压缩包
  • 第一行代码 Android

    2020-05-08 21:37:58
    新建个新项目: 在res目录下,新建个menu 文件夹 在new -- > Menu resource file , 取名 main <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add...

    新建一个新项目:

    在res目录下,新建一个menu 文件夹
    在new  -- > Menu resource file , 取名 main
     

    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/add_item"
            android:title="Add"/>
        <item
            android:id="@+id/remove_item"
            android:title="Remove"/>
    </menu>

    重写onCreateOptionsMenu 方法, 把main.xml 加载进入
    然后在重写onOptionsItemSelected 方法 ,选中哪一项



    展开全文
  • 第一行代码 Android 思维导图  

    第一行代码 Android  思维导图

     

    展开全文
  • 其实我当初决定开始写博客的想法挺简单的,觉得自己搞技术这么多年...更令我没想到的事,在我开始写博客不久之后,人民邮电出版社图灵公司的副总编辑陈冰老师就联系上了我,希望我可以写本关于Android开发技术的书籍
  • Android第一行代码

    2015-12-07 12:05:28
    Android第一行代码 Android的最基础的书籍
  • 本文内容借鉴《第一行代码Android》本文将对《第一行代码Android》中的知识点进行整理并且对代码进行实现。目录1.创建Hello world项目2.在真机上运行1.创建hello world项目 在Android studio的欢迎页面点击 Start a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,340
精华内容 2,536
关键字:

第一行代码android