1. 从系统架构到Hello World

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文件的源码如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.helloworld"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="12"
 9         android:targetSdkVersion="14" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name="com.example.helloworld.MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25     </application>
26
27 </manifest>

AndroidManifest.xml

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

 1 package com.example.helloworld;
 2
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.view.Menu;
 6
 7 public class MainActivity extends Activity {
 8
 9     @Override
10     protected void onCreate(Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13     }
14
15     @Override
16     public boolean onCreateOptionsMenu(Menu menu) {
17         // Inflate the menu; this adds items to the action bar if it is present.
18         getMenuInflater().inflate(R.menu.main, menu);
19         return true;
20     }
21
22 }

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。

该文件的源代码如下:

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <TextView
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         android:text="@string/hello_world" />
15
16 </RelativeLayout>

activity_main.xml

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

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4     <string name="app_name">Hello World</string>
5     <string name="action_settings">Settings</string>
6     <string name="hello_world">Hello world!</string>
7
8 </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方法调用之前添加一句代码就可以去掉这影响美观的标题栏:

1 @Override
2     protected void onCreate(Bundle savedInstanceState) {
3         super.onCreate(savedInstanceState);
4         requestWindowFeature(Window.FEATURE_NO_TITLE);
5         setContentView(R.layout.activity_main);
6     }

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之路的第一步结束!

   

时间: 2024-08-24 18:28:51

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

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,

大型网站系统架构的演化(转)

前言 一个成熟的大型网站(如淘宝.京东等)的系统架构并不是开始设计就具备完整的高性能.高可用.安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式.技术架构.设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线.所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就:不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索.下单.支付,例如腾讯,要解决数亿的用户实时消息传输,百度它要处理海量的搜索请求,他们都有各

dubbo框架----探索-大型系统架构设计(图解)

对于高并发系统的架构要求: 1. 负载均衡 2.高并发 3.高可用 4.面向服务架构 (Dubbo框架使用) 5.分布式缓存 (redis分布式缓存) 6.分布式全文检索 (solr分分布式全文检索) 7.分布式数据库集群 (mycat 集群mysql数据库) dubbo  简介 系统架构 redis 集群 solr 集群 mysql 集群

ios系统架构及常用框架

1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media layer).核心服务层(Core Services layer).核心操作系统层(Core OS layer)如图: (1) 触摸层:为应用程序开发提供了各种常用的框架并且大部分框架与界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作.它包括以下这些组件: Multi-Touch Event

软件体系结构---安卓系统架构之应用程序框架层分析---1

本博客只介绍安卓系统架构中的应用程序框架层 什么是应用程序框架? 应用程序框架可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性.其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响. 而对于安卓来说:Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则.我们在开发应用时就是在这个框架上进行扩展.在这个框架中我们可以完全访问核心应用程序所使用的API框架,即我们

企业内部IT一体化系列之一:系统架构

有个构想,将企业内部IT的日常运维,管理以及员工服务等日常全部集合和汇总到一起,说起来简单,其实相当复杂,因为自己在之前的公司曾经做过,虽然还未做完,但是构想有了,期待能有机会实施,现在先把可行的成果展示出来,主要是以前技术定级的时候写的ppt的图,凑合看看吧. 平台架构: 这图是微软给的私有云体系,我基本就是照着这个来做的. 下图是我目前整个系统所有的架构: 大概讲解一下: 1:首先整个企业IT统一管理平台需要一个登入的接口,或者说WEB的平台,那么我用SharePoint来做,WFE01,W

适应多场景应用的web系统架构探讨

背景: 虽然身处互联网时代,但还有很多信息系统仍运行在内部网络中,例如,企事业内部的OA系统,医院的HIS系统,银行的管理系统等.软件公司会针对系统应用环境,对信息系统进行逻辑业务上的修改.因此,本文主要介绍一种适应于多场景应用的web系统架构,供相关人员讨论研究. 1 系统框架图 2 分层的优势 (1)解耦:降低代码耦合度,允许前后端的分离,显示与业务的分离,前端开发与后台开发的分离. (2)复用:面向接口编程,面向接口实现,面向接口形成文档,提高接口函数的复用. (3)固化通用业务逻辑. (

Unity3D手游开发日记(2) - 技能系统架构设计

我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得预留10个特效的字段.在代码里面也是写死一些东西,要增加和修改,就得改核心代码,如果我要把核心部分做成库封装起来,就很麻烦了. 能不能做成数据驱动的方式呢? 改技能文件就行了,即使要增加功能,也只需要扩展外部代码,而不用改核心代码, 我是这么来抽象一个技能的,技能由一堆触发器组成,比

查看Linux系统架构类型的5条常用命令

导读 很多时候我们都需要查看当前 Linux 系统是 32 位还是 64 位系统架构类型,本文中我将向大家推荐 5 条常用命令.无论你使用的是桌面版或是只装了文本界面的 Linux 环境,以下命令几乎可以通吃所有 Linux 发行版,例如:RHEL.CentOS.Fedora.Scientific Linux.Debian.Ubuntu.Linux Mint.OpenSUSE 等等. 1. uname 命令 uname -a 命令可以直接显示 Linux 系统架构的命令,安几乎可以工作在所有 L

大型网站系统架构的演化

前言 一个成熟的大型网站(如淘宝.京东等)的系统架构并不是开始设计就具备完整的高性能.高可用.安全等特性,它总是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式.技术架构.设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线.所以成熟的系统架构是随业务扩展而完善出来的,并不是一蹴而就:不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索.下单.支付,例如腾讯,要解决数亿的用户实时消息传输,百度它要处理海量的搜索请求,他们都有各