这是我参与「第四届青训营 」笔记创作活动的第一天,主要对前两次课程的内容加以总结及自己的思考。 前两次课程分别讲述了客户端是什么,安卓系统的主要组件。我也会按这样的顺序谈谈自己的想法。 首先,客户端是什么?客户端(Client)或称为用户端,是指与服务器相对应,为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外,一般安装在普通的客户机上,需要与服务端互相配合运行。这是百度百科的官方解释,语言比较简练,总结起来就是和服务端配合为客户提供本地服务的程序。目前通用的分类有DNS客户端,Web客户端,游戏客户端,移动客户端四种,但无论怎么分类,客户端的作用都不会变,为客户提供服务。伴随着通信技术升级及移动设备的更新换代,越来越多的应用场景被激发,用户的需求也更加多元化,客户端所要实现的功能也越来越多。 对于客户端的开发者要求也水涨船高,毕竟表面看似是人与机器的交互,其实还是人与人的联系。国内客户端的赛道繁多,比如短视频,社交,资讯,长视频,游戏,购物,阅读,生活等,不同的赛道代表着用户的不同需求,自然也要有对用户不同的思考。 客户端对于研发人员的大致需求模型应该是这样:
对外是满足用户的需求,为用户创造价值,对于公司而言是经营成本,只有对外成功才能获得收益,对自身而言,则是技术品牌。三者的反馈的都来自于对用户的交付。根据交付的内容不同,也可以分为三层。最基础也是最直观的交付就是页面+逻辑+数据,产品带给用户的视觉感觉是最有冲击力的,业务符合逻辑才能获得用户的流量,数据的正确处理才能得到信任,这些看似简单的必须的交付离不开大量的知识储备,操作系统的知识,UI界面的知识,网络通信,数据存储的知识,操作逻辑也是研发人员自身逻辑思维的体现。再深层次就是要满足用户的需求,静态的视觉呈现已经需要大量的知识了,移动网络的快速发展带来的动态需求也需求不断地学习新知识,如下所示:
普通的数据处理已经满足不了这些需求,需要我们使用流处理,批处理,甚至去优化编解码方式。
当用户的体感需求得到满足,身心需求也会变得愈发重要,这就是第三层交付,体验+质量+安全+个性,功能虽然很强大,但是运行起来内存就会占满,手机就会卡顿,这样的功能始终只能是鸡肋,这就需要再进一步,了解性能优化,用户的隐私,软件的质量和安全重要性也不言而喻,不同的场景,不同的需求如何精细化处理,这些都需要不断学习新的技术。
对内则是需要减少公司的成本,就需要提高单人效能,技术图谱如下:
同样要加强团队合作,提高团队的合作。
最后对自己而言就是对技术品牌的的打造完成自身的交付,首先是基本功能:
接着是提高自己的技术高度:
最后则是一些看似虚无但往往起点睛作用的综合素养:
谈了这么多虚无的东西,终于要步入正题了,首先要认识一下客户端的运行环境:
我们所开发的APP和系统自带的APP都在系统应用层;JAVA API层是Android Framework提供给开发者的接口,我们依托这些接口去实现对外的第一层交付;原生C/C++层和Android Runtime(ART)是系统核心服务和组件的提供者,可通过Android NDK访问,如音视频解码,安全等;硬件抽象层则提供硬件组建的封装,相机,传感器,蓝牙等,框架API访问时,Android系统为其加载库模块;Linux内核是ART执行底层功能的依靠。
手机上的安卓程序是以APK形式运行的,这个APK中包括AndroidMainifest.xml(声明app中四大组件及权限),class.dex(编写的java,kotlin代码),res文件夹(图片,颜色,字符串及xml布局文件),lib文件夹(C/C++编译成的so文件),META_INF文件夹(存放签名和证书,用于校验和安全)
接着就是程序运行所必需的组件,首先是界面组件activity,也就是我们人眼能直接看到的界面容器,activity是用户使用服务的程序入口,为用户提供交互行为,同时是我们向用户展示的内容布局容器,通过在Mainifest.xml文件中注册,在res中的xml文件中实现,在相关的类文件中完成绑定,就可以用activity实现一些需求,但是如果一个一直出现在屏幕上,或者一个页面想使用时却调不出来就很不舒服,那些这些是怎么控制的呢? 就牵扯到生命周期的概念,activity的生命周期如图
但是要实现复杂多样的界面,只有activity远远不够,如何在不同的设备完美地展示也需要一定的适配,于是还有fragment,主要优点就是快,基本用法和activity基本类似,需要先创建布局文件,然后是子类,加载布局文件,activity加载fragment,可在布局中绑定静态加载,也可以使用fragmentmanager动态加载,生命周期如下:
接着是service服务组件,在某个页面退出后,他所在页面的功能还能继续执行,这就需要依靠service实现
用法和activity一致,注册实现绑定,生命周期如下所示:
与activity的交互如图:
再接着是broadcast,我们有时会遇到闪退,关机这种现象,如何通知全局的应用去配合呢,就需要使用broadcast组件,而broadcast又分为两种,静态广播的使用方法为注册创建接收发送,动态的需要注册上下文接收者。
然后是contenprovider组件,在每个页面获取的数据如何在不同的页面间传递就需要contentProvider来实现,,它的使用必须满足一定的条件,处理不当就会造成信息泄露,一般采用生产者消费者模型,生产者需要先注册相关的属性,然会创建相关的实体类实现方法,消费者则需要生命相应的权限,然后实现相关的方法。
最后是intent组件,单一的组件不能并不能满足我们的需求,因此需要将多个组件结合,如何实现就需要intent来实现绑定,将有关联的组件绑定,同样分为两种,显式(制定具体的类)和隐式绑定(action,category,data,extra,flag,type,component等)
总的就是下图:
今天的介绍就到这里,剩下的内容和下次课程一起整理吧