郭霖 订阅
郭霖,亦名景祥,字泽五。湖北当阳人。早年毕业于国立唐山工学院(现西南交通大学)。 [1] 展开全文
郭霖,亦名景祥,字泽五。湖北当阳人。早年毕业于国立唐山工学院(现西南交通大学)。 [1]
信息
出生地
湖北当阳
职    称
教授
别    名
名景祥,字泽五
中文名
郭霖
毕业院校
唐山工学院(现西南交通大学)
软件设计师相关考试
18岁那年,郭霖走出大山,到县城新制高级小学读了一年半后考入湖北省立第三师范学校,每科成绩都是名列前茅。23岁考入国立唐山工学院(即西南交通大学的前身)。在学校读书时历经那场中国人民彻底反对帝国主义、封建主义的“五四”运动的冼礼,也进一步加深了郭霖的爱国主义思想,他立志工业救国。 [1-2]  1921年赴英国格拉斯哥大学习机械造船,1924年获海军建筑学士学位,后入该校研究院任潜艇研究员。1926年任英国维克斯造船公司工程师。1927年回国,在马尾造船厂和上海江南造船厂任工程师。1929年8月至1942年2月,一直任国立武汉大学工学院教授。 [3] 
收起全文
精华内容
下载资源
问答
  • 郭霖第一行代码源码

    2016-03-14 19:02:43
    郭霖全套源码
  • 郭霖博客学习

    千次阅读 2018-03-18 22:42:16
    标题郭霖 CSDN 小目标:每周3篇,18年看完104篇。怎么才能知道自己手机屏幕的密度呢?你可以使用如下方法先获取到屏幕的dpi值: float xdpi = getResources().getDisplayMetrics().xdpi; float ydpi = ...

    标题

    郭霖 CSDN
    小目标:每周3篇,18年看完104篇。

    怎么才能知道自己手机屏幕的密度呢?你可以使用如下方法先获取到屏幕的dpi值:
    float xdpi = getResources().getDisplayMetrics().xdpi;
    float ydpi = getResources().getDisplayMetrics().ydpi;

    标题

    项目结构分析
    dpi详解:
    mipmap文件夹只是用来放置应用程序的icon的,仅此而已。那么在此之前,我们都是把应用程序的icon图标和普通的图片资源一起放到drawable文件夹下的。将icon放置在mipmap文件夹还可以让我们程序的launcher图标自动拥有跨设备密度展示的能力

    当引用一张图片时,Android会先去本机对应的hdpi下去找,找到引用,不会缩放该图。如果没找到,会优先去高密度下去找,到最高密度下仍没有,就从最适合分辨率往低找。以xxhdpi举例:
    drawable-xxhdpi -> drawable-xxxhdpi -> drawable-nodpi -> drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。
    最终,如果是从更高密度下引用来的图片,会进行缩小操作(直接加载会出现密度过高);从低密度下引用来的图片,会进行放大操作。drawable-nodpi文件夹,这个文件夹是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放。至于具体的缩放数据:每一种密度的dpi范围都有一个最大值,这个最大值之间的比例就是图片会被系统自动放大的比例。(郭神测算,未有文档支持。大致是很精确的)

    一张原图片被缩小了之后显示其实并没有什么副作用,但是一张原图片被放大了之后显示就意味着要占用更多的内存了。一个xxhdpi设备,从mdpi加载图片,会进行放大操作,放大就会占用更多内存。找到当前主流机型的分辨率,就是当前最佳的分辨率级别。

    Getting Your Apps Ready for Nexus 6 and Nexus 9

    交互式控件
    AlertDialog,会打断用户当前的操作,谨慎一点好。尽量使用appcompat-v7库中也提供了一个AlertDialog类,获得6.0之前的较好体验。

    Toast, 建议封装,避免长时间弹。复用一个Toast。传当前Activity的context会内存泄露,传Application的。

    SnackBar,体验更好。国内很少用。传View时,传根View。

    View rootView = ((ViewGroup) (activity.findViewById(android.R.id.content))).getChildAt(0);make的时候填这个view就可以了

    适配

    1. 合理布局。多使用wrap、match,dp;
    2. 巧用RelativeLayout,ConstraintLayout;
    3. 使用布局限定符,配合布局别名结合多布局;
    4. 根据分辨率,使用多套图。
    5. 使用AutoLayout。

    优化
    1启动页优化
    styles.xml中主题相关的代码

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ......
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>

    让程序在初始化的时候窗口是透明的,初始化结束后程序主界面才会显示出来,从而也就完全看不到白屏界面了。

    记录

    03

    展开全文
  • 郭霖CSDN Blog文章汇总chm,更新至20171227 guolin anaroid文章
  • Android第二版 作者:郭霖笔记
  • 郭霖老师直播授课视频源码
  • 郭霖的专栏

    2015-10-11 08:34:00
    http://blog.csdn.net/guolin_blog 郭霖的专栏,《第一行代码》作者,Android开发文章写得相当深入,精辟

    http://blog.csdn.net/guolin_blog

    郭霖的专栏,《第一行代码》作者,Android开发文章写得相当深入,精辟

    展开全文
  • 第一行代码pdf及源码 郭霖,推荐初学者的书及源码
  • Android第二行代码(郭霖全书源代码)
  • 第一行代码—Android_郭霖 高清pdf版 android最佳入门书籍
  • 专访郭霖:成长无止境

    千次阅读 2020-10-27 18:18:00
    留意文末赠书活动嘉宾 | 郭霖文| 张霞郭霖,Android开发工程师,Android GDE(Google认证开发者专家)。从事Android开发工作9年,有着丰富的项目实战经验,负...


    留意文末赠书活动

    嘉宾 | 郭霖

    文 | 张霞

    郭霖,Android开发工程师,Android GDE(Google认证开发者专家)。从事Android开发工作9年,有着丰富的项目实战经验,负责及参与开发过多款移动应用与游戏,开发了 LitePal、giffun、coolweather、PermissionX 等多个开源项目,对 Android 系统架构及应用层开发有着深入的理解。

    在 CSDN发表 Android 技术文章百余篇,博客访问量超过1000万次,荣获 CSDN 认证专家,并连续多年被评选为 CSDN 年度博客之星。个人技术类公众号“郭霖”,订阅数超9万人,每个工作日都与读者朋友们分享最新的Android知识。

    2014年,创作了《第一行代码——Android》,2016年和2020年出版了第2版和第3版。此书至今累计销售29万册,获得了读者的广泛认可和好评,被誉为「Android 开发第一书」。

    本期图灵访谈旨在与读者朋友们分享郭霖的技术成长之路,包括如何提升专业技能,如何提高学习能力、如何不断实现自我成长,如何跟上技术发展的趋势。

    1. 请问你最早接触编程是在什么时候,是如何对编程产生兴趣的?你通过编程做过哪些有意思的事?

    准确来讲,我最早接触编程就是在上大学的时候。虽然在高中时,我凭借兴趣爱好有自学过一些网页制作方面的知识,但是现在回头来看,那个时候学到的一点皮毛还不算是接触编程。

    我印象中大一刚开学的时候有一堂课,老师问了我们一个问题:有没有同学在之前接触过C语言?台下两个班一共90多名学生,没有一位举手的。说明提前接触编程知识的人毕竟还是少数,至少在我们那个年代是这样的。

    而现在,我的好多大学同学都从事了IT行业的工作,由此可见,大学确实是大多数人未来职业的摇篮。

    至于我是如何对编程产生兴趣的,不如问我是如果对计算机产生兴趣的。我上中学的时候,计算机还不算非常普及,学校每周会开一节信息技术课程,学生能上机操作。

    每到那一节课,大家都非常开心,因为可以放下书本玩电脑了。现在看起来好像再正常不过的上网、打游戏,那个时候还是件奢侈的事情,我可能也就是在这样的环境下对计算机产生了浓厚的兴趣,然后不知不觉中走上了这条道路吧。

    而通过编程做过哪些有意思的事情,这个就真的太多了。自从在大学里接触了编程,学生时代的自己就觉得无所不能了一样。

    我写过内网的聊天软件在学校内使用,还在宿舍搭建过服务器,上机考试时用来传递答案(还好我已经毕业了),其他学院的老师还邀请过我帮忙去做他们学院的网站,等等。其中很多事情现在看上去好像挺幼稚的,但当时觉得挺有意思的。

    2. 请问你大学学的是什么专业?最初的职业规划是怎样的?后来是如何走上Android开发之路的?

    我在大学学习的是网络工程专业,是计算机学院的一个专业。不过我最后并没有从事网络工程方面的工作,而是步入了软件开发行业,可能我还是对编程更感兴趣吧。

    我最初的职业规划是做Java服务器开发,那个时候真的学习了很多Java服务器方面的知识,对Java语言和SSH框架可以说是用得滚瓜烂熟了。但是最终毕业面试的时候却没能面上服务器开发的工作,所以最后也就和这个方向失之交臂了。现在想想倒未必是件坏事,不然Android行业里可能也就不会有我了。

    至于我走上Android开发之路算是一种机缘巧合吧。2010年夏天,我在闲逛电驴时发现一位老师上传了一份Android开发视频教程,那是我第一次听说Android操作系统,并且了解到Android也是使用Java开发的,所以就产生了浓厚的兴趣。在之后的几年里,移动互联网以极快的速度蓬勃发展,我算是借着这股浪潮走上了Android开发之路吧。

    3. 在读大学期间,你觉得在校所学的哪些课程、掌握的哪些技能是对你后来的技术发展帮助最大的?哪些知识是一定需要尽早学习,打好基础的?相信对这个问题的回答对于在校学生会有很好的参考价值。

    我现在作为一个过来人的身份,可以更好地回答这个问题了,可惜当初上学时的我还不懂。

    在读大学期间,你可能会觉得有很多课程枯燥乏味,甚至觉得学了完全没有用处。当然,有很多课程确实如此。但是,算法和数据结构这门课程,会对你未来的发展产生巨大的影响,所以至少这门课程你必须好好学。

    我当初不明白这个道理,那个时候更看重的是实践能力,觉得做出一个App比解出一道算法题要厉害多了。殊不知算法考验的是编程的思维和底蕴,而App考验的只是业务逻辑能力。这么多年过去了,当初我写App用到的技术现在早已过时,而算法永远都不会过时。

    毕业多年之后,我才慢慢懂得了这个道理,后来我花了大量的时间在算法和数据结构方面进行补课,也算是为自己当年的无知买单吧。希望现在的学生能好好重视这门课程,不要像我当初一样。

    另外,这几年人工智能技术非常火热,而这个行业的前面树立着高高的数学城墙。所以,大学时的高等数学和线性代数这两门课程就非常重要了。

    很可惜,这又是我当初没能学好的两门课程。总之,感觉自己还是有很多遗憾的,希望现在的学生能更加意识到一些大学课程的重要性。

    4. 你在学习和研究Android技术的过程中,有哪些重大的转折点或者让你印象深刻的经历?

    我在学习Android技术过程中的重大转折点,我认为是在2013年的时候,我做出了开始写技术博客这个决定。没有这个决定,就不会有后来的《第一行代码》。所以我一直都认为这是我人生的一个重要转折点。

    我在上大学的时候是学校里公认的编程高手,但是我却不知道自己有写技术文章的能力。这个事情很奇怪,我那时没有写过博客,没有这方面的经验,只是抱着记录自己的学习过程这样的心态去写的,但是看过我文章的朋友都说我写的文章最容易理解。

    陈冰老师更是在我仅仅写了四篇文章的情况下,就邀请我去编写《第一行代码》这本书,当时我还担心自己是不是遇到骗子了。要知道,那个时候我才刚刚毕业不到一年时间,直到现在想想仍然还是觉得挺不可思议的。

    5. 从2013年到现在,你坚持写作技术博客快8年了,这需要惊人的毅力和难以想象的付出。我们很多读者朋友都是通过阅读你的博客成长起来的,优质的内容让他们受益良多。那么坚持写作这件事对你自身而言,有哪些帮助或者好的影响?

    我只能说,写技术博客对我自身的帮助和影响实在是太大了。前面已经说了,决定开始写博客对我来说是一个重要的转折点,没有这个决定也就不会有后来的《第一行代码》。

    至于为什么可以坚持写了这么多年,其实并不是因为什么责任扛肩上。原因很简单,写博客对于我来说是一个自我学习的过程。技术变化日新月异,移动开发并不是一个学会了就可以一劳永逸吃一辈子的行业,你必须保持不断学习。

    我在学习各种新技术的时候,为了更好地记录和整理,会将它们写成博客。我相信很多人在学习的时候都有做笔记的习惯,我只是把这个笔记写得更加详细和清晰,让这些笔记不光我自己能看得懂,别人也可以看得懂。

    6. 你写作一篇技术博客平均要花多长时间?平时工作很忙,你是如何保持如此高产的?

    正所谓慢工出细活,我写文章的速度其实很慢的,平均大概要一周才能写出一篇技术博客,直到现在这个速度也并没有提升多少。

    我写文章会经历几个固定阶段,包括构思内容,勾画大体知识框架,编写Demo,写成文章,检查语病和错别字,最后才会发布出来。很多读者觉得我的文章疏漏很少,因为我在发布之前会做比较严格的检查。

    至于问我如何保持如此高产,这明显不是一个事实。因为我写文章的速度是比较固定的,所以空闲时间多的时候我就能高产一些,而工作繁忙的时候,我就很难抽出时间写文章。

    从CSDN的年度文章统计其实就可以看出,2013年我一共编写了45篇技术博客,而2018年一共只写了7篇。不过好在今年我的产能还算不错,目前已经写了17篇,平均每个月两篇左右,希望可以继承保持下去吧。

    7. 你的博客写得通俗易懂,你的文字就像具有魔法一样,无论多么复杂的内容,你都能讲得清晰透彻,请问你有哪些写作经验和写作技巧?

    这个问题还真有不少朋友问过我,但实际上,我也不知道该如何回答。

    刚才说了,我其实自己都不知道自己竟然有写技术文章的能力,我之前没有做过这方面的练习,也没有学过任何写文章方面的资料,就只是凭着感觉去写,没想到竟然能够得到那么多人的认可。

    上次和一位朋友聊天时,他就问了我同样的问题,我知道他是希望我能给出一个总结好的固定的套路和流程,然后按着这套流程就能写出一篇好文章。但是我自己的脑海里从来没有固定的写作框架。

    我在写文章时,最多只是会列举一下这篇文章大体要写哪些知识点,把它们列成目录,然后就是想到哪儿写到哪儿了,我也总结不出更多的东西。所以最后反倒是他帮我总结出了一个结论,说我在这方面是有天赋的。

    不过在写文章的时候,我有时会对一句话反复读来读去,感觉不够通顺或者表达不是很准确的时候,我就会尝试换一种表达方式,以保证整篇文章读下来的感觉都是通畅的,或许这也是我文章写得慢的其中一个原因吧。

    8. 现在新技术的发展日新月异,开发者要提升自己的学习能力,不断掌握新知识,扩展知识领域,才能及时跟上时代的步伐。你的学习能力非常强,学习效率也很高,请你分享一下你的学习经验和建议。

    这个就有点不太好意思了,我并不认为我的学习能力很强,只是学习方法比较正确而已。

    想要持续跟上各种新技术日新月异的发展,首先要明确学习的方向才行。那么要怎样明确学习的方向呢?我个人的方式是始终跟着Google的节奏走。

    我每年都会看Google的IO大会,在这些大会上,Google每年都会推出各种新技术,而这些新技术通常就预示着下一代的开发潮流,那么就可以成为你的学习方向。

    有了学习方向之后,接下来就是要怎样去学习的问题了,我通常会利用Google搜索引擎来查找好的学习资料。这个很简单,输入你想要学习的某个技术的关键字,一般搜索结果比较靠前的就是最佳的学习资料了。

    我拥有的一个优势是,我阅读英文技术资料的能力还不错,通常学到的技术内容可能就超前一点。所以,把英语学好,对于你做软件开发这个行业,会有比较大的帮助。 

    另外,我一直热衷于参加Google的各种线下技术活动,之前都是作为观众参与,今年首次在GDG上进行了技术演讲。受疫情的影响,今年线下活动的人数受到了严格的限制,但即使是这样,我也感受到了非常浓厚的技术氛围。

    有许多开发者与我进行了技术讨论,他们咨询了我很多问题,同时也发表了他们自己的观点,我也从中学到了很多。如果以后有机会,我还会去参加更多的线下技术交流活动,这是一个非常棒的体验。

    9. 今年你申请了Android GDE(Google认证开发者专家),并且顺利通过,恭喜你!这一认证对于一位Android开发者而言,是非常有意义的。能否请你为大家分享一下申请的宝贵经验呢,比如需要具备哪些条件,申请流程是什么,面试流程是怎样的。

    谢谢,能够成为Android GDE我也感到非常荣幸。其实,一开始收到Google邀请的时候,我还是有点犹豫的,因为GDE申请的流程非常复杂,而且还要用英文进行面试,我对此并不是非常有信心。

    但是感觉如果拒绝Google的邀请又有点不太礼貌,所以我就抱着试一试的态度去申请了。结果我的运气非常好,成功地成为了一名GDE,对此我也感到非常开心。

    这一认证对我而言是非常有意义的。现在我和Google建立了直接的联系,有技术问题也可以直接向Google进行咨询,所以对于我自身的学习帮助是非常大的。

    至于申请GDE的流程,Google对申请人的技术能力以及技术影响力有比较高的要求,会对你的申请资料进行严格的审查,以评估是否满足GDE的资格,接下来还要通过两轮面试,才能正式成为一名GDE。

    我在博客中写了一篇非常详细的文章来介绍整个申请过程,感兴趣的朋友可以到我的博客《分享我成为GDE(Google开发者专家)的经历》中去了解。

    10. 除了研究Android技术和工作之外,你还抽时间开发了LitePal、giffun、PermissionX等多个开源项目。这些项目都是兴趣所致,但都受到了Android开发者的关注和喜爱,那么你开发这些项目的契机分别是什么

    其实对于任何一个开发者而言,如果你写的开源项目能够被很多其他开发者使用,这都是一件很酷的事情。所以我相信每个开发者都是愿意去写开源项目的,只是可能还没有找到一个好的契机或切入点而已。

    而我写的这些开源项目,切入点都是那些我认为开发中存在的痛点。以前工作时需要频繁和数据库打交道,SQL语句写到想吐,所以我就写了LitePal这个开源库,来简化Android上的数据库操作。

    另外,Android提供的权限申请API非常不友好,每次编写申请权限的代码,对我来说都是一个痛苦的过程,所以我一直希望能编写一个开源库来让权限申请变得简单,于是就有了PermissionX。

    值得一提的是,PermissionX的第一个版本其实来自于《第一行代码——Android(第3版)》,本来主要是为了教读者朋友们如何开发一个开源库的,后来我发现这个项目的意义不仅限于教学目的,而是真的可以投入实际的项目中使用,所以后期又对它做了很多的功能增强,才变成了现在的PermissionX。

    11. Google非常重视Kotlin,将Kotlin作为了Android开发第一语言。你也一直比较看好Kotlin,将《第一行代码——Android》(第3版)使用了Kotlin语言进行重写。但是与国外相比,Kotlin在国内的热度目前似乎不是特别高,你觉得真实情况是怎样的,背后的原因是什么?

    使用Kotlin语言的原因很简单,因为这就是未来。我觉得作为Android开发者,需要做的是去适应技术趋势,而不是去对抗它。

    每年Android的开发技术都会发生很多变化,而近几年最大的变化莫过于编程语言的改变。

    Google在2019年的IO大会上明确宣布了Kotlin First,所以Kotlin目前是Android开发的第一语言。作为Android开发者,我们必须去适应Google的技术趋势。

    目前Kotlin在国内的热度还不算高,我认为主要是因为Google的新技术在国内有一定的滞后性,普及还需要一定的时间,但是毫无疑问,Kotlin是Android开发的未来。

    Google现在主推的许多新技术都是基于Kotlin的,比如说协程。已推出的各种库也在用Kotlin重写,比如Room、Paging3等。未来即将推出的新技术也会基于Kotlin,比如Jetpack Compose。

    也就是说,如果不学习Kotlin,可能将会完全跟不上以后的Android技术开发趋势。所以,我相信Kotlin在国内终将会普及,只是时间的问题。这也是《第一行代码——Android》(第3版)使用Kotlin进行重写的原因。

    12. 《第一行代码》(第3版)的阅读门槛是什么?读者需要掌握哪些基础知识才会更容易读懂和上手?认真读完这本书并跟着书动手实践之后,读者基本可以达到哪种水平?对于希望得到进一步提升的读者,你有哪些学习建议?

    虽然这本书全书用Kotlin进行了重写,但是加入了大量Kotlin语言的知识讲解,所以读者并不需要有任何Kotlin的基础就可以阅读这本书,并且读完之后,读者将可以很好地掌握Kotlin这门语言。

    但是如果读者之前完全没有接触过编程,我认为读起来还是稍微有点困难的。因为这本书是以读者有一定编程基础(最好是只有Java基础)为前提的,书中有一些地方会对Kotlin和Java进行对比,所以如果读者有Java基础的话,将会更好地理解这本书。当然,即使没有Java基础,但有其他编程语言的基础,也是可以的,因为编程语言在很多思路上都是相通的。

    第3版除了加入了Kotlin语言的讲解之外,还基于Android 10系统进行了最新的升级,加入了Jetpack中重要组件的讲解,并综合运用这些知识在全书的最后开发了一个MVVM架构的项目。

    所以,全书学习完之后,读者能够具备比较系统的Android开发知识,并且将会拥有独立开发Android App的能力。

    如果阅读完这本书之后,读者希望进一步提升自身的能力,那么关注我的公众号和博客就是一个不错的方式。毕竟书中的内容是不会变化的,而我会在公众号和博客中持续更新技术文章,帮助读者学习更多的知识。

    畅销书《第一行代码》的最新版

    本书被Android开发者广为推荐。全书系统全面、循序渐进地介绍了Android软件开发的必备知识、经验和技巧。

    第3版基于Android 10.0对第2版进行了全面更新,不仅将所有知识点都在Android 10.0系统上进行了重新适配,同时加入Kotlin语言的全面讲解,使用Kotlin对全书代码进行重写,而且还介绍了最新系统特性以及Jetpack架构组件的使用,使本书更加实用。

    本书内容通俗易懂,由浅入深,既是Android初学者的入门必备,也是Android开发者的进阶首选。

    京东领劵价格更低

    留言活动 

    说说你在学习 Android 的过程中

    遇到的困难或疑惑

    我们将挑选 3 名精彩留言的读者,每人将获得一本《第一行代码 Android 第3版》

    统计截止时间:10月30月 12:00 


    展开全文
  • 郭霖第二行代码---源代码.rar,,,,,,,,,,,,,,
  • 郭霖大神分享的鸿蒙初体验

    千次阅读 2020-09-21 22:32:33
    今天我正在debug,突然发现郭霖更新了(于是就开始快乐摸鱼),哈哈哈。不知道大家看见没有。下面分享一下,希望对大家的工作和学习有些帮助。 / 今日科技快讯 / 近日,字节跳动回应:由美国CFIUS调查及“总统令”...

    今天我正在debug,突然发现郭霖更新了(于是就开始快乐摸鱼),哈哈哈。不知道大家看见没有。下面分享一下,希望对大家的工作和学习有些帮助。

    / 今日科技快讯 /

    近日,字节跳动回应:由美国CFIUS调查及“总统令”引发对TikTok的大量关注与报道,其中有很多猜测和不实信息。真实情况是, 我们确实在与一些公司探讨合作方案,以解决美国政府与公众对于美国用户数据安全的顾虑,上述方案不涉及业务和技术出售,也尚未签署最终协议。最终协议的签署,还需依据法律获得中国和美国相关部门的批准。

    / 作者简介 /

    明天就是周末,大家注意好好休息哦~

    本篇文章来自伤心的猪大肠的投稿,和大家分享了他对华为鸿蒙系统使用的一些内容整理,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章!

    伤心的猪大肠的博客地址:

    https://juejin.im/user/4441682709326958

    / 前言 /

    2020年9月10号,鸿蒙2.0(HarmonyOS 2.0)系统正式发布,鸿蒙2.0面向应用开发者发布Beta版本,在2020年9月10发布大屏,手表,车机版鸿蒙,2020年12月发布手机版鸿蒙。在2020年9月10日,鸿蒙开源路标面向内存128KB-128MB终端设备;2021年10月,将面向4GB以上所有设备。

    / 背景 /

    作为一个安卓开发者,能够看到国产的操作系统的发布确实很兴奋,兴奋之余,更想要看看具体是怎么一回事,首先打开官网,看看官网该系统的定义:HarmonyOS是一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统。在传统的单设备系统能力的基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持多种终端设备。

    对应用开发者而言,HarmonyOS采用了多种分布式技术,使得应用程序的开发实现与不同终端设备的形态差异无关,降低了开发难度和成本。这能够让开发者聚焦上层业务逻辑,更加便捷、高效地开发应用。该优点在5G这个万物互联的时代具有着巨大的优势。

    / 安装DevEco Studio /

    接下来下载DevEco Studio(IDE/开发工具)来进行体验一下软件的开发,在这里可以看到目前的IDE只有Windows系统的(windows 10 64位),安装过程可能中会出现gradle的安装失败,记得添加代理,在用户目录(打开“此电脑”,在文件夹地址栏中输入%userprofile%,进入个人数据界面。)下创建gradle.properties文件,文件中添加,端口是代理的端口。

    systemProp.https.proxyPort=63729
    systemProp.http.proxyHost=127.0.0.1
    systemProp.https.proxyHost=127.0.0.1
    systemProp.http.proxyPort=63729
    

    gradle安装成功,但在编译过程中可能出现build失败,错误如下:

    ERROR: Cause: mirrors.huaweicloud.com:443 failed to respond
    

    解决方式就是把所有的代理先关掉,然后你就会发现如丝般顺滑。安装完DevEco Studio后,打开后可以看到界面和Android Studio非常相似。

    布局开发

    一切看起来非常的熟悉,可以使用Java或JS等语言进行开发,布局可以通过XML创建,size单位是vp。

    <?xml version="1.0" encoding="utf-8"?>
    <DirectionalLayout
        xmlns:ohos="http://schemas.huawei.com/res/ohos"
        ohos:width="match_parent"
        ohos:height="match_parent"
        ohos:orientation="vertical"
        ohos:padding="32">
        <Text
            ohos:id="$+id:text"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:layout_alignment="horizontal_center"
            ohos:text="My name is Jackie."
            ohos:text_size="25vp"/>
        <Button
            ohos:id="$+id:button"
            ohos:width="match_content"
            ohos:height="match_content"
            ohos:layout_alignment="horizontal_center"
            ohos:text="My name is Jackie."
            ohos:text_size="50"/>
    </DirectionalLayout>
    

    也可以通过Java代码直接创建,点击事件都是如此的亲切。

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        // 步骤1 声明布局
        DirectionalLayout directionalLayout = new DirectionalLayout(context);
        // 步骤2 设置布局大小
        directionalLayout.setWidth(ComponentContainer.LayoutConfig.MATCH_PARENT);
        directionalLayout.setHeight(ComponentContainer.LayoutConfig.MATCH_PARENT);
        // 步骤3 设置布局属性及ID(ID视需要设置即可)
        directionalLayout.setOrientation(Component.VERTICAL);
        directionalLayout.setPadding(32, 32, 32, 32);
    
        Text text = new Text(context);
        text.setText("My name is Text.");
        text.setTextSize(50);
        text.setId(100);
        // 步骤4.1 为组件添加对应布局的布局属性
        DirectionalLayout.LayoutConfig layoutConfig = new DirectionalLayout.LayoutConfig(LayoutConfig.MATCH_CONTENT,
            LayoutConfig.MATCH_CONTENT);
        layoutConfig.alignment = LayoutAlignment.HORIZONTAL_CENTER;
        text.setLayoutConfig(layoutConfig);
    
        // 步骤4.2 将Text添加到布局中
        directionalLayout.addComponent(text);
    
        // 类似的添加一个Button
        Button button = new Button(context);
        layoutConfig.setMargins(0, 50, 0, 0);
        button.setLayoutConfig(layoutConfig);
        button.setText("My name is Jackie.");
        button.setTextSize(50);
        button.setId(100);
        ShapeElement background = new ShapeElement();
        background.setRgbColor(new RgbColor(0, 125, 255));
        background.setCornerRadius(25);
        button.setBackground(background);
        button.setPadding(10, 10, 10, 10);
        button.setClickedListener(new Component.ClickedListener() {
            @Override
            // 在组件中增加对点击事件的检测
            public void onClick(Component Component) {
                // 此处添加按钮被点击需要执行的操作
            }
        });
        directionalLayout.addComponent(button);
    
        // 步骤5 将布局作为根布局添加到视图树中
        super.setUIContent(directionalLayout);
    }
    

    首页的布局如下,通过Java代码创建。

        @Override
        public void onStart(Intent intent) {
            super.onStart(intent);
            System.out.println("onStart");
            LayoutConfig config = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT);
            myLayout.setLayoutConfig(config);
            ShapeElement element = new ShapeElement();
            element.setRgbColor(new RgbColor(255, 255, 255));
            myLayout.setBackground(element);
    
            Text text = new Text(this);
            text.setLayoutConfig(config);
            text.setText("CT Jackie");
            text.setTextColor(new Color(0xFF000000));
            text.setTextSize(50);
            text.setTextAlignment(TextAlignment.CENTER);
            myLayout.addComponent(text);
            super.setUIContent(myLayout);
        }
    

    效果如下

    [图片上传失败…(image-b04f4e-1600698132343)]

    生命周期

    下面再来看看主界面的生命周期,实现了ILifecycle接口,生命周期状态一共有七种。

    public static enum Event {
            UNDEFINED,
            ON_START,
            ON_INACTIVE,
            ON_ACTIVE,
            ON_BACKGROUND,
            ON_FOREGROUND,
            ON_STOP;
            private Event() {
            }
        }
    

    界面启动时调用onStart()和onActive()。

    2020-09-13 21:42:10.266 25547-25547[表情] I/System.out: onStart
    2020-09-13 21:42:10.284 25547-25547[表情] I/System.out: onActive
    

    点击返回键时调用。

    2020-09-13 21:42:35.847 25547-25547/com.example.helloworld I/System.out: onInactive
    2020-09-13 21:42:35.917 25547-25547/com.example.helloworld I/System.out: onBackground
    2020-09-13 21:42:35.920 25547-25547/com.example.helloworld I/System.out: onStop
    

    至于UNDEFINED和ON_FOREGROUND暂时还不了解。

    Gradle任务(Task)

    甚至连gradle的Task都非常类似,打包命令是assembleDebug/Release。

    > Task :entry:preBuild
    > Task :entry:compileDebugNativeWithCmake
    > Task :entry:collectDebugDependencies
    > Task :entry:mergeDebugResources
    > Task :entry:mergeDebugProfile
    > Task :entry:compileDebugResources
    > Task :entry:compileDebugIdl
    > Task :entry:compileDebugRFile
    > Task :entry:processDebugJavaResource
    > Task :entry:compileDebugJavaWithJavac
    > Task :entry:mergeDebugJavaResource
    > Task :entry:generateDebugClassesJar
    > Task :entry:mergeDebugProjectDex
    > Task :entry:generateDebugShell
    > Task :entry:processDebugShellManifest
    > Task :entry:compileDebugShellResources
    > Task :entry:linkDebugShellResources
    > Task :entry:compileDebugShellJavaWithJavac
    > Task :entry:mergeDebugShellDex
    > Task :entry:packageDebugShell
    > Task :entry:packageDebugSimplifyShell
    > Task :entry:validateDebugSigning
    > Task :entry:signDebugShell
    > Task :entry:packageDebugHap
    > Task :entry:signDebugHap
    > Task :entry:assembleDebug
    

    配置文件

    配置文件是一个命名为config.json的文件,配置应用的一些信息。

    {
      "app": {
        "bundleName": "com.example.helloworld",
        "vendor": "example",
        "version": {
          "code": 1,
          "name": "1.0"
        },
        "apiVersion": {
          "compatible": 3,
          "target": 3
        }
      },
      "deviceConfig": {
        "default": {
    
        }
      },
      "module": {
        "package": "com.example.helloworld",
        "name": ".HelloWorld",
        "reqCapabilities": [
          "video_support"
        ],
        "deviceType": [
          "wearable"
        ],
        "distro": {
          "deliveryWithInstall": true,
          "moduleName": "entry",
          "moduleType": "entry"
        },
        "abilities": [
          {
            "skills": [
              {
                "entities": [
                  "entity.system.home"
                ],
                "actions": [
                  "action.system.home"
                ]
              }
            ],
            "orientation": "landscape",
            "formEnabled": false,
            "name": "com.example.helloworld.MainAbility",
            "icon": "$media:icon",
            "description": "$string:mainability_description",
            "label": "HelloWorld",
            "type": "page",
            "launchType": "standard"
          }
        ]
      }
    }
    

    仔细看这个文件会越来越觉得这就是AndroidManifest.xml的json翻译版。

    / 反编译角度看鸿蒙 /

    既然看起来这么像安卓,我看来看看它编译后的产物是什么,是不是也能像android一样反编译得到dex文件?

    编译后得到的是一个xxx.hap文件。

    image

    修改它的后缀名为.zip,解压后可以看到里面有熟悉的assets,dex,apk文件等,把这个apk文件安装后发现并不能使用。

    [图片上传失败…(image-ec3f51-1600698132343)]

    下面我们先反编译这个classes.dex文件第一个dex反编译后出现错误。

    ~/Desktop/fanbianyi/dex2jar-2.0 » sh d2j-dex2jar.sh classes3.dex
    dex2jar classes3.dex -> ./classes3-dex2jar.jar
    com.googlecode.d2j.DexException: not support version.
        at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:151)
        at com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:211)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:104)
        at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)
    

    原因是我们的工具版本太低了,解决方案就是升级,升级版本后反编译成功后为classes3-dex2jar.jar,打开可以看到:

    这里多了个ResourceTable文件,就是我们的资源id表。这里的dex文件包含的是我们开发的代码。

    下面我们来反编译apk文件,解压后可以看到,里面是我们熟悉的内容:

    AndroidManifest.xml文件如下:

    反编译该dex文件可以看到,MainAbilityShellActivity最终是继承了AbilityShellActivity:

    ShellHelloWorld其实一个Application。

    至此感觉.hap文件像是对apk的一个包装,最终的逻辑看起来好像还是android那套,或者说android开发人员上手会非常快,可能也是为将来兼容android系统做准备。

    / 分布式,跨设备迁移 /

    跨设备迁移

    下面来看看该系统的一些亮点,比如跨设备迁移,听起来是个很牛逼炫酷的功能,比如把你的手机屏幕直接迁移到电脑或者pad上面以及进行一些操作等等。

    跨设备迁移(下文简称“迁移”)支持将Page在同一用户的不同设备间迁移,以便支持用户无缝切换的诉求。以Page从设备A迁移到设备B为例,迁移动作主要步骤如下:

    1. 设备A上的Page请求迁移。
    2. HarmonyOS处理迁移任务,并回调设备A上Page的保存数据方法,用于保存迁移必须的数据。
    3. HarmonyOS在设备B上启动同一个Page,并回调其恢复数据方法。

    开发者可以参考以下详细步骤开发具有迁移功能的Page。

    分布式任务调度

    在HarmonyOS中,分布式任务调度平台对搭载HarmonyOS的多设备构筑的“超级虚拟终端”提供统一的组件管理能力,为应用定义统一的能力基线、接口形式、数据结构、服务描述语言,屏蔽硬件差异;支持远程启动、远程调用、业务无缝迁移等分布式任务。

    分布式任务调度平台在底层实现Ability。

    • 启动和关闭:向开发者提供管理远程Ability的能力,即支持启动Page模板的Ability,以及启动、关闭Service和Data模板的Ability。
    • 连接和断开连接:向开发者提供跨设备控制服务(Service和Data模板的Ability)的能力,开发者可以通过与远程服务连接及断开连接实现获取或注销跨设备管理服务的对象,达到和本地一致的服务调度。
    • 迁移能力:向开发者提供跨设备业务的无缝迁移能力,开发者可以通过调用Page模板Ability的迁移接口,将本地业务无缝迁移到指定设备中,打通设备间壁垒。

    / 总结 /

    个人感觉鸿蒙的开发是很接近Android开发者的习惯,对于Android开发人员来说极易上手,但是Android现有的多设备协同支持做的很差,鸿蒙做了一些封装和扩展屏蔽掉底层的差异,在多设备,万物互联的时代具有很大的优势,越是多设备协同,鸿蒙越具有优势。

    开源项目地址https://github.com/xieyuliang/Note-Android ,里面有很多有用的技术文,还有很多Android高级架构师进阶学习资料,有需要的朋友自取。

    原文地址:鸿蒙开发初体验

    进取不止,代码之外,再无世界!Android开发者们,你我共勉!

    展开全文
  • 根据网上整理的郭霖的“第一行代码”android随书代码(eclipse版的)
  • 《第一行代码》作者郭霖大神安卓问题解答

    千次阅读 多人点赞 2016-06-14 19:24:36
    列举了几个郭霖大神解答的问题
  • CoolWeatherApp CoolWeatherApp is the android application, 学自 郭霖老师的《第一行代码》 当前状态: 实现了从weather.com.cn 上抓取数据 实现了单个县的天气展示
  • 郭霖大神的Volley教程

    千次阅读 2016-08-25 08:55:42
    来自郭霖大神的Volley教程 由于CSDN不支持一键转载,这里只给出原博客的地址,便于查看。 Android Volley完全解析(一),初识Volley的基本用法 ...Android Volley完全解析(二),使用Volley加载网络
  • 本项目主要以郭霖先生的 这一系列的 Glide 文章为基础的Demo Glide官方中文文档: 辅助文章: 辅助源码文章: 辅助源码文章: 项目亮点 玩转开源库 Glide 学一点架构封装 简单爬取必应图片 项目截图 App体验地址: 如果...
  • 郭霖所写的关于ActionBar解析和实战博客中的源码
  • 郭霖LitePal

    千次阅读 2018-04-25 16:47:06
    //由郭霖开源的 Android 数据库框架 此处用于sqlite compile 'org.litepal.android:core:1.6.1' compile files('libs/SQLiteStudioRemote.jar') 添加 assests 文件夹并且新建 litepal.xml 文件 <!--修改存储...
  • 一款汇总了郭霖,鸿洋,以及自己平时收集的自定义控件的集合库。主旨帮助大家学习自定义控件中的一些技巧,分析问题解决问题的一种思路。
  • 来自郭霖大神的Volley教程

    千次阅读 2016-04-09 22:35:04
    适合高并发网络访问的工具Volley教程,来自郭霖大神.
  • CoolWeather 实践的小项目,基于郭霖《第一行代码Android》中的第14章,酷欧天气的开发
  • 郭霖老师androidpn教学视频笔记

    千次阅读 2016-01-18 00:32:27
    学习郭霖老师的“见证android消息推送时刻”的学习笔记。 ServiceManager 属性: 无 方法: startService():启动服务NotificationService stopService():停止服务NotificationService setAlias(String alias):...
  • 简介:一款汇总了郭霖,鸿洋,以及自己平时收集的自定义控件集合库 更多:作者 提 Bug  标签:     一款汇总了郭霖,鸿洋,以及自己平时收集的自定义控件的集合库。主旨帮助大家学习自定义控件中的一些技巧...
  • http://www.jianshu.com/p/6f114a7523b9 http://www.jianshu.com/p/6f114a7523b9 ... Runtime Permissions(郭霖CSDN公开课) 运行时权限 Api23开始,Android权限机制更
  • 微信公众号「郭霖」「鸿洋」「玉刚说」「谷歌开发者」历史文章的索引 概述 本仓库搜集了上述三个公众号绝大部分历史文章的链接地址,然后建立相关索引。 目的仅仅是为了方便自己在电脑上阅读、检索和学习,如有侵权...
  • 郭霖LRU

    千次阅读 2014-10-10 09:17:12
    转载地址:http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg
  • 转自郭霖大神的混淆代码

    千次阅读 2016-07-05 11:30:11
    本来想自己写一篇反编译的,但是偶然的机会看到郭霖大神写的反编译,感觉要比自己想到的要全面多好多,不愧是大神,干脆把博文拉过来,好好研究下 混淆 本篇文章中介绍的混淆技术都是基于Android Studio的,...
  • 文章来自郭霖老师公众号推文《Jetpack新成员,一篇文章带你玩转Hilt和依赖注入》,也是 DevFest 2020 Android 分会场 codelab 环节的详细总结与扩展,感兴趣的小伙伴往下看吧! 以下文章来源于郭霖 ,作者郭霖 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,736
精华内容 1,094
关键字:

郭霖