Android学习之路——简易版微信为例(一)
这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的)。这里主要是和广大园友们聊聊一个非Java程序员对Android操作系统的理解以及一个Android工程的目录结构,为进一步学习做准备。
1 缘起
智能手机的出现与普及为人们的生活、工作带来了极大的便利,我们可以用手机随时随地、随心所欲地购物、玩游戏、聊天、听音乐等等。一个个精心设计、体验良好的移动客户端应用,让用户们爱不释手,人们现在已经越来越离不开智能手机了。这或许是广大程序员学习移动应用开发的一个重要原因吧,这也是我学习Android开发的原因之一。
下面来说说为什么想写一个关于Android开发的系列博文。博主目前是做PC端软件的开发,主要做的是使用C++编写图像处理与显示的逻辑,软件的前端界面采用的是WPF。去年下半年,公司鼓励前端(WPF)转后端(C++)和后端转前端,作为一个有上进心的程序员,当然要响应领导的号召了^_^。之后就开始WPF学习之旅了,学了一段时间之后,算是有些入门,至少能用WPF做一些简单的功能了。也是在那个时候开始博主开始接触Android,毕竟还是希望在工作之余能够提升一下自己,于是就看了一些博文和相关的书籍。断断续续学了半年,虽然感觉在某些方面与WPF很像,但对Android的理解还是不深刻。于是博主开始思考,怎样才能更好地理解掌握Android呢?对于一个计算机(或工科)专业出身的人来说,所能想到的最好的学习方法便是实践——选择一个不是太复杂的项目,把它一步步做出来,一点点完善它。基于此,决定写一个系列博客,记录自己的学习之路和项目开发之路。微信应用是我们日常使用最频繁的APK了,简易版的微信实现起来应该不会太复杂,所以博主就准备开发一个简易版的微信作为自己Android项目的实践之旅。
2 一个程序员眼中的Android
关于Android的介绍、发展历程、目前使用情况以及未来趋势,在这里就不做赘述了,这些对广大程序员朋友来说肯定都有所了解。本节主要是讲讲自己以从程序员的角度对Android的一点浅薄的理解,当然,一千个读者心里有一千个哈姆雷特,每个人对Android的理解都会不一样,这里介绍的仅是本人的个人见解。
Android是一个基于Linux内核改造而来的、面向手机端(当然现在Android已经是发展到各个硬件平台上了,包括Android TV、Android Wear等等)的操作系统。Android系统本质上和普通的Linux桌面PC发行版没什么区别,Android可以视为手机端Linux的发行版,只不过Google做了完善的封装,以至于我们几乎感觉不到Linux的存在。这里所讲的封装有两层含义:
(1)对普通用户而言,Android变得更亲民,更大众化,不像Linux那么高冷,需要良好的计算机底子的童鞋才能较好地使用;
(2)对应用开发者而言,不需要接触底层的C代码和系统库函数了,我们面对的是一些用Java写的类库,其中包括著名的Android四大组件(后续我们详细阐述)、一套较完备的UI控件和一些辅助的工具类库。
Android操作系统是分层实现的,其层次结构图如下图所示:
这幅框架结构图,对于一个久经沙场的老兵来说,理解起来也许并不是太困难;但对于一个初入职场不久的小白来说,可能一下子还看的不是很明白。不过没关系,对于像我们这样的小菜来说,完全没必要把所有层次、所有组件都弄清楚:比如Linux Kernel(内核)你有必要一开始就去学习吗?—— 一开始去就去看这些不就是在自讨苦吃么^_^!?在内核层之上那一层,什么SQLite、OpenGL|ES、SGL、libc、WebKit等等都是一些著名的开源项目,大多是用C语言写的,对开发上层应用的我们来说,也压根没必要一开始就去学习。最后看最上面一层——Application层,Home、Contacts、Phone……这些其实是系统内置的一些应用,和我们开发的应用没什么区别,所以也没必要花太多时间去了解。对开发应用的我们而言,学好下面两层就好了:
第一层:Application Framework层,也就是应用框架层。我们编写应用时所用的大部分组件都来自这里,最主要的包括:
View System,即视图系统,定义了一套UI库,包括布局类和控件类,用它们就可以定义应用程序的界面了,这个库很庞大,也是我们学习Android开发的一个难点;
Activity Manager,即活动管理器,活动(Activity)是Android四大组件之一,它管理着和用户界面显示有关的逻辑和生命周期回调;
Content Provider,即内容提供者,同样是Android的四大组件之一。数据是应用程序的核心,使用内容提供者就可以实现跨进程/应用的数据共享了。
Notification Manager,通知管理器,用于手机顶部状态栏显示系统通知,它也是Android的四大组件之一。
Resource Manager,资源管理器,顾名思义,即管理应用程序资源的,如图标、背景图片、常量字符串。
图中还有一些其他组件,如Package Manager(包管理器)、Location Manager(位置管理器)等,这里就不具体介绍了,初学时接触的不多。
第二层:Android Runtime层,也就是安卓运行时层,其实就是一个Java虚拟机——Dalvik虚拟机和一个核心类库。这部分和普通的Java虚拟机在使用方面都是一样的,所以这一层虽然在开发中会接触到,但只要学过Java的,应该都懂。
所以,到此为止,我们应该清楚了学习Android开发要学一些什么了,其实就是在学习Application Framework层,其他的看看就好,如果想进一步深入的话,等到把基础的学扎实了再说吧!
3 Android项目的目录结构
Android开发使用的IDE,主要有Eclipse + Android SDK(Software Develement Kit,软件开发工具包)、Visual Studio + Xamarin(用C#语言开发Android程序)和Android Studio三种可供选择,博主采用的是Android Studio 2.0,下载解压无需安装,直接就可以使用。关于Android Studio的JDK的配置,请度娘参考相关博客,在此就不做赘述了。
有了IDE,我们就可以很方便地创建一个Android工程了(关于工程创建,直接点击下一步下一步即可,在此不再赘述)。下面就让我们在写代码前来认识一下一个新建的Android工程的目录结构,如下图:
目录结构一目了然,我们分别学习一下各级目录结构及其作用。
3.1 清单文件
清单文件即AndroidManifest.xml文件,此文件是Android工程中非常重要的配置文件,用XML来书写。学习过Java Web的童鞋一定知道,在SSH框架中就有许许多多的XML配置文件。Android中的配置文件和SSH框架中的配置文件功能上有些类似,即为框架运行提供必要的数据,新创建工程的AndroidManifest.xml的代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.doll.firstapplicationdemo" > 4 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:supportsRtl="true" 10 android:theme="@style/AppTheme" > 11 <activity android:name=".MainActivity" > 12 <intent-filter> 13 <action android:name="android.intent.action.MAIN" /> 14 15 <category android:name="android.intent.category.LAUNCHER" /> 16 </intent-filter> 17 </activity> 18 </application> 19 20 </manifest>
简单解释一下:首先manifest根节点,定义了命名空间和包名;接下来是application结点,代表一个应用程序,其中配置应用程序的标签、名称、主题等等;在application结点里面定义了主Activity(有点类似于Web开发中的首页),属性中定义了类名以及意图过滤器(这里就不详细展开了,在后面详细讲解activity时会介绍)。这样,运行程序时,Android框架就可以帮我们建立必要的对象实例,让我们的应用程序运行起来了。其实,博主觉得这个配置文件和Spring框架中的ApplicationContext.xml配置文件的功能很类似。当然,这个配置文件不是一成不变的,和SSH框架的配置文件一样,随着项目的不断完善,我们会向其中写入各种配置信息。
3.2 代码文件夹
代码文件夹包括Java源代码子文件夹和测试代码子文件夹,展开后如下:
1,源代码文件夹
目前该文件夹下,定义一个Activity——MainActivity,这个类在之前介绍的清单配置文件中已经提及;以后我们所编写的程序逻辑类一般都放在这个文件夹下。
2,测试代码文件夹I(androidTest)
在这个文件夹下放置需要使用Android SDK编写的测试代码。当然,一般我们的测试代码都会用到Android SDK,所以大部分的Android测试代码都放在这一目录下。
3,测试代码文件夹II(test)
在这个文件夹下放置不需要使用Android SDK编写的测试代码。
3.3 资源文件夹
资源相当于我们在程序运行之前定义好的数据,也是应用程序的重要组成部分,为此Android Studio专门使用一个文件夹来管理应用程序中使用的资源,其具体目录结构如下:
一个应用程序通常有很多类型的资源,比如:
drawable:可绘制的资源,如背景图片、背景选择器等;
layout:UI布局资源,用于定义用户界面;
mipmap:图片资源,从上图可以看到,分为hdpi(高分辨率)、mdpi(中等分辨率)、xhdpi/xxhdpi/xxxhdpi(超高分辨率…………)的资源,Android框架会根据手机的分辨率自动选择合适的图片用于绘制。
values:在这个文件夹下主要放置一些常量资源,比如:颜色常量、维度(尺寸)常量、字符串常量以及样式常量(定义控件的显示样式,类似CSS)等等。
除了上面介绍的这些资源外,Android还支持其他资源,如动画资源、颜色选择器资源、菜单资源等,这些在以后博文中都会具体阐述。关于以上这些资源如何定义以及如何在其他资源文件或程序代码中引用,也将在之后的博文中做进一步介绍。
4 总结
最后来总结一下,本文介绍了学习Android的缘由、个人对Android操作系统的理解以及目前Android工程的目录结构,其中目录结构相对比较重要。下一篇博文将正式开启我们的APP开发之旅——实现简易版微信的登陆、注册界面的编写与简单交互。