Android起源与发展:

  Android操作系统最初在2003年的时候由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。

Android的系统架构:

  主要分为四层架构和五个部分

  Linux内核层:该层主要为Android系统硬件提供了底层驱动。如显示驱动、音频驱动、照相驱动、蓝牙驱动、wifi驱动、电源管理等等。

  系统运行库层:这一层通过C/C++来提供一些特性支持。如SQLite提供数据库的支持,OpenGL|EL提供了3D绘图的支持,Webkit库提供了浏览器内核的支持等等。

  应用框架层:这一层主要提供了开发者在开发应用程序的时候可能用到的API支持。Android自带的一些核心应用也是使用这些API完成的。

  应用层:几乎所有安装在手机上的程序都属于这一层。包括手机上自带的短信、联系人功能,已经在应用商店下载的程序以及自己开发的程序。

Android的四大组件:

  Activity:所有应用程序的门面,凡是在应用中看得到的东西,都是存储在Activity中的

Service:不可见,可以在后台默默运行。即使应用程序退出,仍然可以运行。

BroadCast Receiver: 运行应用接收来自各个地方的消息(比如电话、短信)。也可以通过该组件向其他地方发送消息。

Content Provider: 为应用程序之间共享数据提供了可能。

Hello World:

  下面就开始Android之路的第一个Hello World程序。

  环境搭建的步骤大致包括下面三步:

  1. 安装jdk

·    2. 去Android开发者官网下载绑定eclipse、SDK、SDT的开发工具。

  3. 解压完2中下载的文件之后需要点击里面的SDK Manager管理工具,进行相关其他版本的Android SDK的下载,下载的文件会自动放入SDK文件夹。

以上三步全部弄完之后打开eclipse,会发现eclipse的工具栏中增加了Android相关的图标:

  

   图片从左到右依次是SDK Manager 和 启动Android 模拟器的图标。我们点击第二个图标创建一个android模拟器并启动,启动之后效果如图:

  这时可以在eclipse里面打开device窗口,就可以看到正在运行的设备情况,当然也可以切换到DDMS视图,能够清楚的看到设备相关更详细的情况。

 说了这么多开始进行第一个Hello World的程序开发:

  直接new android application 然后一路next,到需要选择Activity类型的时候选择Blank  Activity:

  

其实Hello World已经大功告成了。运行Android Application然后选择刚刚创建的Android模拟器作为运行设备,最终出现的运行结果界面如下:

  

感觉有点酷!下面我们就来分析代码的构成:

  

可以看到里面有很多目录,瞬间觉得傻眼。不过不要急,其实我们需要关注的目录就那么几个:

  首先bin、lib目录可以直接跳过,这里面一般是存放jar包的。一般来说bin目录是程序在编译时自动生成的文件以及当前程序编译好可直接安装的apk包,lib目录下一般存放引入的第三方包。

  src目录下一般使我们的源代码

  gen目录下主要有一个R.java 文件,这里面我们在项目中添加的所有资源都能在这里找到对应的ID。建议千万不要手动去修改该文件。

  assets目录,这个目录用的不多,一般用来存放需要随程序打包的文件,在程序中可以动态读取这里面的内容。如果程序中使用WebView加载本地网页的话,所有网页相关的文件也需要放入到这个目录下。

  res目录,这个目录里面的文件有点多。简单的讲就是程序中用到的所有图片、布局文件、字符串等资源文件都要在这个目录下。其实R.java中自动生成的代码就是根据这里面的资源文件生成的。当然这些资源文件也有一定的放的规律:比如图片一般放到drawable子目录下,layout子目录下一般存放布局文件,values子目录下一般存放字符串文件。

  AndroidManifest.xml:整个项目的核心配置文件。前面所讲的四大组件、应用程序权限添加、指定程序运行的最低版本和兼容版本等的配置都必须在这里面进行。

  project.properties:这个文件非常简单,只是指定的项目编译的SDK版本。

从AndroidManifest.xml探究android程序是如何进行关联的:

  AndroidManifest.xml文件的源码如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="12"
android:targetSdkVersion="14" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.helloworld.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

AndroidManifest.xml

  可以看到里面注册了一个Activity,我们找到Activity的相关代码:

 package com.example.helloworld;

 import android.os.Bundle;
import android.app.Activity;
import android.view.Menu; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

MainActivity.xml

  前面说过Activity是一切应用程序的门面,那么在程序运行的时候是如何找到首先运行那个Activiy的就取决于AndroidManifest.xml中的intent-filter标签中的两句话。

  再继续看MainActivity的代码可以发现所有Android的Activity必须继承自Activity类。Activity类中有一个onCreate方法,该方法在Activity创建的过程中必须要被执行。

在MainActivity中通过setContentView(R.layout.activity_main); 来指定该Activity显示的布局。 这个布局其实对应的是前面所讲的res/layout目录下的activity_main.xml。

该文件的源代码如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>

activity_main.xml

可以看到在该布局文件中生命了一个TextView标签,这个是Android的一种显示文本的控件,其中该控件的android:text属性指定显示的文本内容。出于国际化和可服用的考虑,我们不推荐使用硬编码字符串。所以可以看到该文件中指定的控件显示值为@string/hello_world。这其实表明这个字符串来自字符串资源文件:/values/strings.xml中的hello_world:

 <?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">Hello World</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string> </resources>

strings.xml

其实可以发现AndroidManifest.xml 中也有对字符串资源的引用。

  好了,至此终于了解了整个程序是整样关联运行的。简单的来说必须要有AndroidManifest.xml 文件,这个文件配置了整个项目的Activity的相关信息,而Activity和该配置文件中引用到的相关资源文件,又需要在res路径下进行配置。引用的方式:如果在java文件中通过类似R.string.hello_world的形式,而在xml中则通过 @string/hello_world 的形式进行引用。最后需要说明下res目录下以drawable开头的目录的作用,这些子文件其实对应不同的分别率,目的是为了兼容更多的设备,但有时美工可能只能提供一个版本的图片,则是后全部放到drawable-hdpi目录下即可。

过渡到下一个学习阶段的两点小技能:

1. 感觉第一个程序运行界面有点小丑,很重要的一个原因是因为上面还有一个标题栏,其实只要在onCreate方法的setContentView方法调用之前添加一句代码就可以去掉这影响美观的标题栏:

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}

onCreate

改动之后的运行结果如下:

  

2. 启用logCat。起这个名字的绝对对tomcat有一定的钟情。不然连记日志都要用cat。Android的日志记录工具感觉使用超方便,功能巨强大。

主要日志级别如下:

verbose:对应最低级别琐碎型的日志。

其他级别的从低到高依次是:debug--->info--->warn--->error.

而android的日志使用方式简单粗暴,记录日志的方法都是静态方法,方法的名称取不同日志级别的第一个字母(刚好都不一样)。传入的参数第一个是tag,第二个是具体日志信息。eg:

Log.v("HelloWorld", "This is verbose log of MainActivity!");

当然android还有一个很方便的打印出改行日志处的调用堆栈信息的方法wtf(what the fAck?),这个方法感觉功能异常强大。

如果仅仅是能打印日志的话,还不能说对以后代码的调试有多少作用,不过eclipse里面可是集成了一个很牛的android日志查看神器,就是前面所说的需要打开的logCat窗口:

在这里可以自定义过滤器,以及根据级别过滤等等。以后查看日志就能更加有针对性了。

好了,Android之路的第一步结束!

   

1. 从系统架构到Hello World的更多相关文章

  1. (系统架构)标准Web系统的架构分层

    标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...

  2. 千万pv大型web系统架构,学习从点滴开始

     架构,刚开始的解释是我从知乎上看到的.什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像.更抽象一点,说架构其 ...

  3. [网站性能1]对.net系统架构改造的一点经验和教训

    文章来源:http://www.admin10000.com/document/2111.html 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案,这不仅仅是因为 ...

  4. 5G系统架构

    原文标题:迈向5G之路,颠覆性的5G系统架构?   本文部分图片,资料摘自<迈向5G C-RAN:需求.架构与挑战> 突如一夜春风来,随着Polar码与LDPC码作为5G编码候选方案,通信 ...

  5. 异构(兼容dubbo)SOA系统架构(.net)优化升级

    前面一片文章已经提到我司的异构(兼容dubbo)SOA系统架构,解决了不少技术痛点,也还算比较完善,也顺利推广开来. 但作为项目的开发者,自己产品的问题心里是清楚的,离自己满意还是有不小的距离. 在推 ...

  6. 【系统架构】IT职业技能图谱(点开大图查看)

    本文地址 1 程序开发语言综述 2 iOS开发工程师必备技能 3 运维工程师必备技能 4 前端工程师必备技能 5 大数据工程师必备技能 6 云计算工程师必备技能 7 安全工程师必备技能 8 移动无线测 ...

  7. [Architecture] 系统架构正交分解法

    [Architecture] 系统架构正交分解法 前言 随着企业成长,支持企业业务的软件,也会越来越庞大与复杂.当系统复杂到一定程度,开发人员会发现很多系统架构的设计细节,很难有条理.有组织的用一张大 ...

  8. 国内经典BI系统架构分析

    谈起商业智能BI,也许大家并不陌生,但你是否了解国内的各类BI系统架构? 自国内商业智能发展以来,就系统结构方面已经历了多次优化性的变革.目前国内商业智能BI系统的经典架构的模式包括数据层.业务层和应 ...

  9. Android入门(二):Android的系统架构

    android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.   从技术方面看,An ...

  10. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

随机推荐

  1. 【读书笔记】--SQL基础概念复习

    主键:每个表,只能有一个主键,主键不能为NULL,且必须是唯一的.主键最好是由单个列组成,但这不是必须的,主键也可以是由多个列组成,如果表的两个列组合在一起能唯一标识一个行,而单个列不能,则可以将这两 ...

  2. JS实现日程安排 日程安排插件

    代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EmpWeekPla ...

  3. WPF学习之绘图和动画

    如今的软件市场,竞争已经进入白热化阶段,功能强.运算快.界面友好.Bug少.价格低都已经成为了必备条件.这还不算完,随着计算机的多媒体功能越来越强,软件的界面是否色彩亮丽.是否能通过动画.3D等效果是 ...

  4. 微信--获取access_token

    今天,终于鼓足勇气,来到这片圣地,迎来人生新的开始. 第一次...... 最近做微信公众号,记录一下,仅供参看. 关于access_token微信公众号有相关说明: access_token是公众号的 ...

  5. 孙鑫MFC学习笔记6:菜单编程

    1.对菜单响应的顺序: 视类,文档类,框架类,应用程序类 2.消息的分类 3.CWnd继承自CCmdTarget类, 所以从CWnd派生出的类也可以接收WM_COMMAND消息 4.命令的消息路由 5 ...

  6. viewpager和fragment预加载的解决

    在使用Viewpager和fragment处理中会出现预加载的问题,最近看别人的代码,终于找到了一个很好的处理方法 能有效的解决预加载的问题,在fragment都继承一个重写setUserVisibl ...

  7. [moka同学笔记]window下.htacess文件 与linux下.htacess文件

    windows下 # Turn on URL rewritingRewriteEngine On# Installation directoryRewriteBase /# Protect hidde ...

  8. oracle/MySQL 中的decode的使用

    MySQL decode()的等同实现      在Oracle中使用decode方法可以轻松实现代码和值之间的转换,但是在MySQL中该如何实现类似功能呢?    MySQL中没有直接的方法可以使用 ...

  9. Servlet过滤器Filter用法

    1 Servlet 过滤器方法 过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法:public void ...

  10. MySQL支持的数据类型

    1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3 ...