"浅谈Android"第一篇:Android系统简介

 近来,看了一本书,名字叫做《第一行代码》,是CSDN一名博主写的,一本Android入门级的书,比较适合新手。看了书之后,有感而发,想来进行Android开发已经有一年多了,但欠缺系统化的学习,知识杂乱无章,没有条理和总结。因此,想想我是否可以尝试的写些文章,来对自己之前学过的知识和工作经验进行归纳和整理,整理出自己的知识体系呢。所以,就有这篇文章的诞生,如果其中理解不到位的地方,望园里的兄弟姐妹给予指出错误,我们共同讨论,一起进步。我一直相信一句话,好东西要分享,不断地分享,直至温暖整个世界。
 目前安排是一周一篇文章,因为从前期每篇文章主题的思考,素材收集,代码验证,思维导图设计,是很耗时间的,如果碰到问题没解决的话,就顺延到下一周,宁愿速度慢点,但要保证写出来的东西是原创的,对人有帮助才行。
 这篇的主题是”什么是Android“,关于Android的内容,从以下几点来介绍:
  • Android系统架构
  • Andorid已发布的版本
  • Android应用特色
  • Android开发环境
  • Android程序结构
  • Logcat工具
  • Hello World

1,Android系统架构

  有图有真相:
  
 这是Android系统架构图,够一目了然了吧,Android大致可以分为四层架构,五块区域。
  • Linux内核层(Linux Kernel)
  • 系统运行层
  • 应用框架层(Application Framework)
  • 应用层(Applications)
  1.1,Linux内核层
  Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、WiFi驱动、电源管理等。
 
  1.2,系统运行层
    这一层通过一些C/C++库来为Android系统提供了主要的特性支持,比如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,Webkit库提供浏览器内核的支持等。同时,在这一层还有Android运行时库,它提供了一些核心库,能允许开发者使用Java来编写Android应用。其中,关键是Dalvik虚拟机,它使得我们每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例,相比Java虚拟机(JVM),Dalvik是专门为移动设备定制的,它对手机内存、CPU性能有限等情况做了优化处理。
 
  1.3,应用框架层
    这一层主要提供了构建应用时可能用到的API,Android自带的一些核心应用程序就是使用这些API完成的,开发者可以通过使用这些API构建自己的应用程序。比如有活动管理器、View系统。内容提供器、通知管理器等。
 
  1.4,应用层
    所有安装在手机上的应用程序都是属于这一层的,比如系统自带的联系人、短信等程序,或者我们从Google Play上下载的程序,包括我们自己开发的应用程序。

2,Android已发布的版本

  有图有真相:
 
 
 从图中我们能看到,Android最新版已经5.0了,名叫Android 5.0 Lollipop,中文简称为”棒棒糖“。自从2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本,随后的几年,谷歌以惊人的速度不断更新发布Android系统,2.1、2.2、2.3系统推出使Android占据了大量的市场。2011年2月,谷歌发布了Android 3.0系统,这个系统版本是专门为平板电脑设计的,但也是Android为数不多比较失败的版本,推出之后一直不见什么起色,市场份额也少的可怜。不过很快,在同年10月,谷歌又发布了Android 4.0系统,这个系统版本不再对手机和平板进行差异化区分,既可以应用在手机上也可以应用在平板上,除此之外,还引入了不少特性。
 那么Android目前市场使用情况如何呢?如图所示:
  
  图片来源自维基百科
  自2009年12月起的Android用户版本分析。直至2014年5月,Android的Jelly Bean为最被广泛使用的版本,在所有用户中佔了61%。

 3,Android应用特色

  Android主要有什么特色呢,有以下几个方面来体现:

  • 四大组件
  • 丰富的系统控件
  • SQLite数据库等持久化技术
  • 地理位置定位
  • 强大的多媒体
  • 传感器
  3.1,四大组件
    什么是四大组件?分别是活动(Activity)、服务(Service)、广播接收器(BroadCast Receiver)和内容提供器(Content Provider)。其中活动(Activity)就是Android应用程序中看得东西,也是用户打开一个应用程序的门面,并且与用户交互的界面,比较高调。服务(Service),则比较低调了,一直在后台默默的付出,即使用户退出了,服务仍然是可以继续运行的。广播接收器(BroadCast Receiver),则允许你的应用接收来自各处的广播消息,比如电话、短信等,可以根据广播名称不同,做相应的操作处理,当然了, 除了可以接受别人发来的广播消息,自身也可以向外发出广播消息,自产自销。内容提供器(Content Provider),则为应用程序之间共享数据提供了可能,比如你想要读取系统电话本中的联系人,就需要通过内容提供器来实现。
 
    3.2,丰富的系统控件
    Android系统为开发者提供了丰富的系统控件,我们可以编写漂亮的界面,也可以通过扩展系统控件,自定义控件来满足自我的需求,常见控件有:TextView、Buttion、EditText、一些布局控件等。
 
    3.3,持久化技术
    Android系统还自带了SQLite数据库,SQLite数据库是一种轻量级、运算速度极快的嵌入式关系型数据库。它不仅支持标准的SQL语法,还可以通过Android封装好的API进行操作,让存储和读取数据变得非常方便。
 
    3.4,地理位置定位
    移动设备和PC相比,地理位置定位是一大亮点,现在基本Android手机都内置了GPS,我们可以通过GPS,结合我们的创意,打造一款基于LBS的产品,是不是很酷的事情啊,再说,目前火热的LBS应用也不是空穴来风的,不过在天朝,因为可恶的GFW,只能用些本土化的地图API,比如百度地图、高德地图。要是哪天能用上大谷歌的地图,那才是高大上啊。
 
    3.5,强大的多媒体
    Android系统提供了丰富的多媒体服务,比如音乐、视频、录音、拍照、闹铃等,这一切都可以在程序中通过代码来进行控制,让你的应用变得更加丰富多彩。
 
    3.6,传感器
    Android手机中内置了多种传感器,比如加速传感器、方向传感器,这是移动设备的一大特点,我们可以灵活地使用这些传感器,可以做出很多在PC上无法实现的应用。比如“微信摇一摇"_你懂得,“搜歌摇一摇”等功能。

4,Android开发环境

  开发环境搭建所需要的软件,配置等攻略,相信大家网上搜一搜,这类文章太多了。这里只强调重要几个工具:Android SDK、Eclipse、ADT。

  4.1,Android SDK
    Android SDK谷歌提供的Android开发工具包,在开发Android程序时,我们需要引用该工具包,里面包含了开发Android应用程序的API。
 
    4.2,Eclipse
    开发Java应用程序的神器,最好用IDE工具之一,特点是开源、超强的插件功能、可支持多种语言开发。当然除此之外,谷歌也推出了Android Studio,专门针对Android程序定制的,但因为Android Studio才刚推出不久,不太稳定,毕竟新工具问题还是比较多的,Eclipse被应用已经很成熟了,网上各种关于Eclipse疑难杂症的解决方案很多,相比Android Studio就比较少了。
 
    4.3,ADT
    ADT全称叫做"Android  Development Tools",是谷歌提供的一个Eclipse插件,用于在Eclipse提供一个强大的、集成的Android开发环境。

5,Android程序结构

  有图有真相:

  

 从图中看是不是一目了然,那么接下来就一一讲解吧。

   5.1,src
   毫无疑问,src目录是放置我们所有Java代码的地方,它在这里的含义和普通Java项目下的src目录是完全一样的。
 
   5.2,gen
   这个目录里的内容都是自动生成的,主要有一个R.Java文件,你在项目中添加任何资源都会在其中生成一个相应的资源ID,这个文件永远不要手动去修改它。
 
   5.3,assets
   这个目录里主要可以存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容。另外,如果你的程序中使用到了WebView加载本地网页的功能,所有网页相关的文件也都存放在这个目录下。
 
   5.4,bin
   这个目录页不需要过多的关注,它主要包含了一些在编译时自动产生的文件。当然,会包括一个编译好的安装包,后缀为.apk的文件。
 
   5.5,libs
   如果你的项目中使用到了第三方的jar包,就需要把这些jar包放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
 
   5.6,res
   这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.Java中的内容也是根据这个目录下的文件自动生成的。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下。
 
   5.7,AndroidManifest.xml
   这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件中注册。另外还可以在这个文件给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。
 
   5.8,proguard-project.txt
   在发布你的程序时候,有些apk文件容易被人反编译,所以此时这个文件就发挥作用了,用来混淆你的程序代码,让别人不那么容易看到源代码。
 
   5.9,project.properties
   指定了编译程序时候所用的SDK版本

6,Logcat工具

  有图有真相:

  

    日志在任何项目的开发过程中都会起到非常重要的作用,在Android项目中如果你想要查看日志则必须要使用Logcat工具。
    Android提供了一个日志工具类是Log,总共有个等级,级级递增。

     6.1,Log.v()
     这个方法用于打印那些最为琐碎的,意义最小的日志信息。对应级别 verbose,是Android 日志里面级别最低的一种。

    6.2,Log.d()
    这个方法用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别 debug,比 verbose 高一级。
   
    6.3,Log.i()
    这个方法用于打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮你分析用户行为的那种。对应级别 info,比 debug 高一级。

    6.4,Log.w()
    这个方法用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别 warn,比 info 高一级。
        
    6.5,Log.e()
    这个方法用于打印程序中的错误信息,比如程序进入到了 catch 语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别 error,比 warn 高一级。
 
    小提醒:定制自己的日志工具

     比如,你正在编写一个比较庞大的项目,期间为了方便调试,在代码的很多地方都打印了大量的日志。最近项目已经基本完成了,但是却有一个非常让人头疼的问题,之前用于调试的那些日志,在项目正式上线之后仍然会照常打印,这样不仅会降低程序的运行效率,还有可能将一些机密性的数据泄露出去。
    那该怎么办呢,难道要一行一行把所有打印日志的代码都删掉?显然这不是什么好点子,不仅费时费力,而且以后你继续维护这个项目的时候可能还会需要这些日志。因此,最理想的情况是能够自由地控制日志的打印,当程序处于开发阶段就让日志打印出来,当程序上线了之后就把日志屏蔽掉。

    那么我们可以自定义一个日志工具类,对Android原生的工具类封装下。
public class LogUtil {

    public static final int VERBOSE=1;
    public static final int DEBUG=2;
    public static final int INFO=3;
    public static final int WARN=4;
    public static final int ERROR=5;
    public static final int NOTHING=6;
    
    public static final int LEVEL=VERBOSE;            //发布新版本时候 等级为6
    
    public static void v(String tag,String msg){
        if(LEVEL <=VERBOSE){
            Log.v(tag, msg);
        }
    }
    
    public static void d(String tag,String msg){
        if(LEVEL <=DEBUG){
            Log.d(tag, msg);
        }
    }
    
    public static void i(String tag,String msg){
        if(LEVEL <=INFO){
            Log.i(tag, msg);
        }
    }
    
    public static void w(String tag,String msg){
        if(LEVEL <=WARN){
            Log.w(tag, msg);
        }
    }
    
    public static void e(String tag,String msg){
        if(LEVEL <=ERROR){
            Log.e(tag, msg);
        }
    }
}

    可以看到,我们在 LogUtil 中先是定义了 VERBOSE、 DEBUG、 INFO、 WARN、 ERROR、NOTHING 这六个整型常量,并且它们对应的值都是递增的。然后又定义了一个 LEVEL 常
量,可以将它的值指定为上面六个常量中的任意一个。接下来我们提供了 v()、 d()、 i()、 w()、 e()这五个自定义的日志方法,在其内部分别调用了 Log.v()、 Log.d()、 Log.i()、 Log.w()、 Log.e()这五个方法来打印日志,只不过在这些自定义的方法中我们都加入了一个 if判断,只有当 LEVEL 常量的值小于或等于对应日志级别值的时候,才会将日志打印出来。

    这样就把一个自定义的日志工具创建好了,之后在项目里我们可以像使用普通的日志工具一样使用 LogUtil,
    比如打印一行 DEBUG 级别的日 志就可以这样写:LogUtil.d("TAG", "debug log");
    打印一行 WARN 级别的日志就可以这样写:LogUtil. w("TAG", "warn log");
    然后我们只需要修改 LEVEL 常量的值,就可以自由地控制日志的打印行为了。比如让LEVEL 等于 VERBOSE 就可以把所有的日志都打印出来,让 LEVEL 等于 WARN 就可以只打印警告以上级别的日志,让 LEVEL 等于 NOTHING 就可以把所有日志都屏蔽掉。使用了这种方法之后,刚才所说的那个问题就不复存在了,你只需要在开发阶段将LEVEL 指定成 VERBOSE,当项目正式上线的时候将 LEVEL 指定成 NOTHING 就可以了。

7,Hello World

    好了,说了这么多,这些只是一些理论的东西,要想更深入的理解,必须要自己动手做Demo,我们可以去创建一个Hello World程序试试,用Eclipse+ADT帮我们创建的默认项目就是Hello World.
 

阅读扩展

源于对掌握的Android开发基础点进行整理,罗列下已经总结的文章,从中可以看到技术积累的过程。
1,Android系统简介
2, ProGuard代码混淆
3, 讲讲Handler+Looper+MessageQueue关系
4, Android图片加载库理解
5, 谈谈Android运行时权限理解
6, EventBus初理解
7, Android 常见工具类
8, 对于Fragment的一些理解
9, Android 四大组件之 " Activity "
10, Android 四大组件之" Service "
11, Android 四大组件之“ BroadcastReceiver "
11, Android 四大组件之" ContentProvider "
13, 讲讲 Android 事件拦截机制
14, Android 动画的理解
15, Android 生命周期和启动模式
16, Android IPC 机制
17, View 的事件体系
18, View 的工作原理
19, 理解 Window 和 WindowManager
20, Activity 启动过程分析
21, Service 启动过程分析
22, Android 性能优化
23, Android 消息机制
24, Android Bitmap相关
25, Android 线程和线程池
26, Android 中的 Drawable 和动画
27, RecylerView 中的装饰者模式
28, Android 触摸事件机制
29, Android 事件机制应用
30, Cordova 框架的一些理解
31, 有关 Android 插件化思考 
32, 开发人员必备技能——单元测试

转载于:https://www.cnblogs.com/cr330326/p/4229026.html

你可能感兴趣的:("浅谈Android"第一篇:Android系统简介)