因为是学习心得, 免不了很多理解错误, 欢迎指教和抬杠!
手机系统是超交互的计算机系统, 比台式机系统拥有更多更灵活的的人机交互途径. 触摸屏, 摄像头, 传感器, 指纹识别, 络连接, 多媒体收放等等方便人们生活的硬件设备全都集成在手机这个小小的设备中. Android作为这样一个复杂硬件体系的功能集成者, 同时又要承担和用户交互的责任, 所以在美观, 易用性, 可扩展性, 可定制性这些方面都有极高的要求.
这就是手机开发的基本前提, 要在这些基本条件上达成目标, Android系统就必须为程序开发人员提供一个即强大又易用的体系结构. 整个行业在软件工程方面多年的经验积累, 要求这个体系结构既能把前后台开发分隔开来, 又能易于定制扩展, 既能便于开发测试, 又能做充分的抽象, 既能管理好全部资源, 又能具有充分的安全性, 等等.
这些苛刻复杂的要求全部集中在同一个体系结构中要如何实现呢们就试着在学习Android应用开发的过程中逐渐揭开它的神秘面纱.
作为任何一个操作系统, 首先要管理硬件, Android也不例外. Android官 上有一个图清晰的展现了它关于硬件体系的管理逻辑. 引用如下:
Android体系结构

从图中我们可以了解到Android把自己建立在Linux内核之上, 把硬件管理的任务交给Linux系统负责, 而自己则把主要注意力放在硬件驱动程序以上的抽象层, 负责统一各级应用对硬件的调用接口, 以及手机应用程序基本框架的提供上. 如此, 凡是使用Android平台的应用程序就可以使用共同的基准并生存在同一个生态环境中了.
我们开发的应用程序主要集中在最上面的应用程序层.
在应用程序层生存的软件系统, 依赖于全部下面平台提供的服务, 同时应用程序之间也有沟通交互的需求.
应用程序在系统的眼中都是一样的, 他们会遵循同样的初始化过程, 同样的资源申请过程, 同样的界面生成过程, 同样的执行过程, 以及同样的销毁过程. 因此, 在开发过程中, 我们首先要理解系统对于应用程序的这组基本控制逻辑. 实际上, 不仅在Android开发, 在其他的所有软件应用开发中都遵循同样的道理.
那么Android系统是如何既分开了前后台程序又管理好了程序的生死过程呢strong>
让我们以最简单的HelloWorld做例子来了解一下吧!
下面三个是”Hello World”应用程序的主要程序文件
MainActivity.java
activity_main.xml
AndroidManifest.xml
我们知道, Java是Android应用开发所采用的官方语言, Java程序是以Class为单位, 通过调用Main.main()作为入口启动的, main()就是Java应用生的起点.
Android手机应用本质上逃不开这个基本要求, 但这个main()函数却不是由程序员负责调用的, 而是由Android系统平台负责. 为什么呢为平台开启了应用程序的生命周期后, 需要为你的应用程序准备很多运行条件, 像依赖程序加载, 窗口管理器, 活动管理器, 后台监听程序等等, 这些都准备好了以后, 才开始实例化一个名叫MainActivity的类, 并按顺序发送onCreate->onStart->onResume->onPause->onStop->onDestroy事件并回调相对应的方法.
自此, 我们开发的应用的生命周期才算进入到程序员能够控制的范围内. 当应用程序的生命周期开启后, 我们应该做点什么呢然是把页面显示出来, 否则, 我们的程序就没有和用户交互的能力了. 所以我们可以在MainActivity.onCreate()这个方法中看到这样一行代码:
这行代码无论如何看起来也不像是能够创建出页面并显示这行字的啊! 你可能会这样想, 没错, 一开始我也这么想.
问题在于, 要想显示页面就必须生成类HTML代码, 并把代码传送到前台解释器中, 即使Android不采用HTML解释器, 那至少也得写个字符串才行是不strong>这行代码能做成这么多事的原因在于Android平台提供了视图系统, 它把用户界面的生成和管理都接管了, 程序员需要做的事情就是把自己对界面的设计定义在layout这个资源目录下的 .xml 文件中. 我们的HelloWorld页面就定义在 activity_main.xml 这个文件中了, 而上面这行代码的用处就是要求Android平台加载名为 activity_main.xml 定义的页面. 然后, 平台就加载了我们定义的页面, 然后就OK了. 省事不觉得还挺省事的.
聪明的你可能会有疑问, 为什么入口程序非要叫MainActivity外, 还有一个名叫AndroidManifest.xml的是什么鬼是一个好问题! 因为这两个问题指向了同一个答案.
如果你和我一样使用AndroidStudio的话, 编译器生成的应用程序框架默认会把入口起名叫MainActivity, 并在 AndroidManifest.xml 把这个类注册成为整个应用程序的入口.
代码如下:
其中的和就是入口程序的身份ID, 凡是有这个令牌的, 就是入口, 仅此一家, 不可复制. 要是有两个人拿了入口程序令牌, 那一定有一个是李鬼, 系统是绝不会认可这种情况的, 所以我们开发的时候要保证入口的唯一性.
看到了这个配置方式, 入口程序起什么名字就已经并不重要了, 并不是非不可, 叫也可以, 你高兴就好.
看到这里你是不是已经跃跃欲试了而如果你现在就觉得高兴, 那确实是高兴的太早了. 因为还有一座大山拦在面前, 不翻过这座大山, 一切都是白搭.
不过, 好消息是, 我们至少已经在心里建立了Android应用程序的生死过程, 这还是很令人欣慰的. 什么还没讲怎么销毁毁不需要管理, 用户不停的点击后退, 就会退出程序, Android平台负责回收资源, 这实在是没什么好讲的嘛!
我们还是讲讲让我们程序能够运行起来的最后一座大山吧!
Gradle编译工具.
Gradle是个很强大的编译辅助工具, 可以帮助你的项目进行非常复杂的编译工作, 正因为它很强大, 也导致了它很复杂, 所以才是一座大山.
Gradle的问题在于很多资源需要联 下载, 但由于众所周知的原因, 我们国内的 络无法访问Guugle的资源, 这导致Gradle一直卡在那里等待资源, 无法前进, 怎么解决这个问题我也没有很好的方法, 只能说这个东西的下载时断时续, 大家遇到 络好的时候趁机下载回来就好了. [手动汗]
Gradle的版本太多太复杂, 也为使用增加了难度. 但有几个基本信息我们需要知道, 能为我们节省很多解决问题的时间:
-
AndroidStudio里面集成了一个Gradle的插件, 它有自己独立的版本 , 配置在应用程序根目录下的build.gradle中, 代码如下:
这个集成的Gradle插件存放在Android Studiogradlem2repositorycomandroidtoolsbuildgradle中
-
还有一个Gradle作为编译时需要下载的工具, 它也有自己独立的版本 , 配置在 gradlewrappergradle-wrapper.properties中, 代码如下:
有观点认为可以把这句话改写成
就能引入本地文件, 解决下载不了资源的问题, 本人亲测有时好用有时不好用, 抓不住规律, 所以暂且提供出来, 有缘者得之.
下载后的Gradle存放在C:UsersAdministrator.gradlewrapperdists中 -
下载的Gradle版本 一定不能小于集成的Gradle插件
还有一个build.gradle存放在应用程序根目录下的/app目录中, 为应用程序的编译定义专有信息, 包括兼容的SDK版本 , 和应用的依赖软件包等等.
代码如下:
这是基于Android 9.0 Pie版本的设定, 这里不详细解释, 看个大概就可以. Android Studio为这个文件提供了图形化配置工具, 右键点击项目工程选择Open Module Settings (F4)就可以进行配置了.
需要注意的是, 应用程序中需要引用的所有外部应用软件包(jar以及其他所有类型)都需要在这里进行引入, 或叫依赖(dependency), 否则, 编译器大人会降下制裁, 别怪我没提醒你. [手动邪恶]
如果你有幸跨越了这座Gradle大山, 那么恭喜你, 你的第一个应用程序终于可以在自己的环境中经历生死轮回了!
等等! 什么你的电脑配置不足以建立手机虚拟机想连自己的手机进行测试p>
别急, 如果你的Android Studio发现不了已经连接到电脑上的手机, 那只能说明一个问题, 你的电脑上没安装好手机驱动程序, 只要去找个xx手机助手安装一下, 然后打开手机上的USB开发模式开关就可以了. 记得安装好以后要重新连接一下哦!
总结一下, Android应用程序的生死过程是由平台管理的, 开始于用户点击程序图标, 结束于用户点击返回退出程序, 这些动作的管理由Android平台负责, 程序开发能够施展拳脚的地方从MainActivity开始, 在这个java类中, 我们要负责创建页面, 建立交互, 存取数据, 指导页面跳转等等, 这些就是后面我们要继续说的内容了.
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!