首页 > 其他分享 >Android开发--架构详解

Android开发--架构详解

时间:2023-05-05 23:08:28浏览次数:44  
标签:xml 文件 layout -- public 详解 清单 Android android


Android体系架构详解:

http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/#ibm-pcon

 

 

 

Android开发--架构详解_移动开发

 

src文件夹

是项目的所有包及源文件(.java)(与一般的Java项目一样)

分析HelloAndroid项目的主程序文件HelloAndroid.java,如代码清单3-8所示。

代码清单3-8 HelloAndroid.java
1. package com.yarin.Android.HelloAndroid;  
2. import android.app.Activity;  
3. import android.os.Bundle;  
4. public class HelloAndroid extends Activity  {  
5.     public void onCreate(Bundle savedInstanceState)  {  
6.         super.onCreate(savedInstanceState);  
7.         /* 设置Activity要显示的布局为(R.layout.main) */    
8.         setContentView(R.layout.main);  
9.     }  
10. }

主程序HelloAndroid类继承自Activity类,重写了void onCreate(Bundle savedInstanceState)方法。在onCreate方法中通过setContentView(R.layout.main)设置了Activity要显示的布局文件(\layout\main.xml)。

到这里,是不是明白了为什么我们在创建项目时没有进行编码就可以直接运行程序呢?当然,这也是Android开发的特点,这样可以很轻松地将代码和UI分开,在国际化和程序维护方面有着巨大的作用。如果你的Android程序需要自适应国际化,比如说多国语言等问题,那么就可以定义不同语言的UI布局,在程序装载时调用不同的布局。而且,如果我们需要修改UI的一些问题,就不必查看代码了,直接更改这些布局文件即可,是不是很方便?当然,这需要开发者在开发时使用这种MVC框架,尽量减少使用"硬编码"。这里,笔者个人建议使用这种框架。

 

 

 

gen文件夹

R.java是在建立项目时自动生成,只读模式,不能更改,存储项目所有资源的索引。

为项目中用户界面、字符串、图片等资源都会在该类中创建其惟一的ID,当项目中使用这些资源时,会通过该ID得到资源的引用

代码清单3-1 R.java

1. package com.yarin.Android.HelloAndroid;  
2.  
3. public final class R {  
4.     public static final class attr {  
5.     }  
6.     public static final class drawable {  
7.         public static final int icon=0x7f020000;  
8.     }  
9.     public static final class layout {  
10.         public static final int main=0x7f030000;  
11.     }  
12.     public static final class string {  
13.         public static final int app_name=0x7f040001;  
14.         public static final int hello=0x7f040000;  
15.     }  
16. }

可以看到这里定义了很多常量,仔细一看就发现这些常量的名字都与res文件夹中的文件名相同,这再次证明R.java文件中所存储的是该项目所有资源的索引。有了这个文件,在程序中使用资源将变得更加方便,可以很快地找到要使用的资源,由于这个文件不能被手动编辑,所以当我们在项目中加入了新的资源时,只需要刷新一下该项目,R.java文件便自动生成了所有资源的索引。

 

 

 

assets文件夹

资源路径,不会在R文件注册。该目录用于存放项目相关的资源文件,这个目录和res包含的xml文件差不多,也是应用中引用到的一些外部资源。但主要区别在于这些资源是以原始格式保存,且只能用编程方式读取。例如文本文件,视频文件,MP3音频等媒体文件

 

bin文件夹编译生成目录。二进制文件,包括class、资源文件、dex、apk等

 

res文件夹中则包含了项目中的所有资源,比如:程序图标(drawable)、布局文件(layout)、常量(values)等。

 

drawable:

开头的三个文件夹用于存储.png、.9.png、.jpg等图片资源(.9.png是Android特有的图片格式,可以根据情况进行拉伸,达到不变形的效果),他们的分变率从高到低,如果你打算在android应用中包含一个图片或者图标,就应该把它们放在这个目录

 

raw:

用于存放应用程序所用到的声音等资源。raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;相比较assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类

 

values:

这个目录也包含了一些xml文件,但主要是应用中要引用的key-value对。这些XML文件声明了数组(Array)、颜色(color)、度量(Dimension)、字符串。之所以把这些东西分别放在单独的xml文件中主要是考虑到这些值能够在不更改源代码的情况下用于多语言环境。例如,根据用户语言的不同应用程序中的信息可以有多种语言版本

 

下面我们看看资源文件中一些常量的定义,如String.xml,如代码清单3-3所示。

代码清单3-3 String.xml
1. <?xml version="1.0" encoding="utf-8"?> 
2. <resources> 
3.     <string name="hello">Hello World, HelloAndroid!</string> 
4.     <string name="app_name">HelloAndroid</string> 
5. </resources>

这个文件很简单,就定义了两个字符串资源,与R.java中对应的索引如代码清单3-4所示。

代码清单3-4 R.java中的String类
1. public static final class string {  
2.     public static final int app_name=0x7f040001;  
3.     public static final int hello=0x7f040000;  
4. }

在程序中装载并使用这个字符串资源如代码清单3-5。

代码清单3-5 String资源程序中的使用

1. Resources r = this.getContext().getResources();  
2. String appname= ((String) r.getString(R.string.app_name));  
3. String hello= ((String) r.getString(R.string.hello));

基本上可以定义出项目中所有使用的常量,例如颜色。所以,可根据需对资源常量进行定义。下面是定义了颜色的常量colors.xml,如代码清单3-6所示。

代码清单3-6 colors.xml

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <resources> 
    3.     <color name="status_idle">#cccccc</color> 
    4.     <color name="status_done">#637a47</color> 
    5.     <color name="status_sync">#cc9900</color> 
    6.     <color name="status_error">#ac4444</color> 
    7. </resources>

     

     

    layout:

    现在我们来分析HelloAndroid项目的布局文件(layout),首先我们打开res->layout->main.xml文件,如代码清单3-7所示。

    代码清单3-7 main.xml

    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    3.     android:orientation="vertical" 
    4.     android:layout_width="fill_parent" 
    5.     android:layout_height="fill_parent" 
    6.     > 
    7. <TextView    
    8.     android:layout_width="fill_parent"   
    9.     android:layout_height="wrap_content"   
    10.     android:text="@string/hello" 
    11.     /> 
    12. </LinearLayout>

    代码清单3-7中,有以下几个布局和参数。

    < LinearLayout>:线性版面配置,在这个标签中,所有元件都是按由上到下的排队排成的

    android:orientation:

                                   horizontal表示这个介质的版面配置方式是从上到下垂直地排列其内部的视图

                                   vertical表示这里是水平排列

    android:layout_width: 定义当前视图在屏幕上所占的宽度

    android:layout_height:定义当前视图在屏幕上所占的高度

                                          fill_parent表示填充整个屏幕

                                          wrap_content表示随着文字栏位的不同而改变这个视图的宽度或高度

                                          match_parent表示

    layout_weight 用于给一个线性布局中的多个视图的重要度赋值。所有视图都有layout_weight 值,默认为零,即需要显示多大的视图就占据多大的屏幕空间。如果值大于零,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight 值和该值在当前屏幕布局的整体 layout_weight 值,以及在其他视图屏幕布局的layout_weight 值中所占的比例。

     

    <TextView>:布局中设置了一个TextView,用来配置文本标签Widget,其中设置的属性

    android:layout_width为整个屏幕的宽度,

    android:layout_height可以根据文字来改变高度,

    android:text则设置了这个TextView要显示的文字内容,这里引用了@string中的hello字符串,即String.xml文件中的hello所代表的字符串资源。hello字符串的内容"Hello World, HelloAndroid!"这就是我们在HelloAndroid项目运行时看到的字符串。

     

    menu:

     

     

     

     

    AndroidManfest.xml文件(每个Android项目都必须有)

    清单文件 这个XML文件包含了android应用中的元信息,是每个android项目中的重要文件。在软件安装的时候被读取 ,Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、Service)都需要在该文件中,以及运行这个android应用程序需要的用户权限列表,例如:电话、短信、互联网、访问SD卡,同时也详细描述了android应用的项目结构

     

    我们先来打开HelloAndroid项目中的AndroidManfest.xml文件,如代码清单3-2所示。

    代码清单3-2 AndroidManfest.xml
    1. <?xml version="1.0" encoding="utf-8"?> 
    2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    3.       package="com.yarin.Android.HelloAndroid" 
    4.       android:versionCode="1" 
    5.       android:versionName="1.0"> 
    6.     <application android:icon="@drawable/icon" 
    android:label="@string/app_name"> 7.         <activity android:name=".HelloAndroid" 
    8.                   android:label="@string/app_name"> 
    9.             <intent-filter> 
    10.                 <action android:name="android.intent.action.MAIN" /> 
    11.                 <category android:name="android.intent.category.LAUNCHER" /> 
    12.             </intent-filter> 
    13.         </activity> 
    14.     </application> 
    15.     <uses-sdk android:minSdkVersion="5" /> 
    16. </manifest>

    代码清单3-2中intent-filters描述了Activity启动的位置和时间。每当一个Activity(或者操作系统)要执行一个操作时,它将创建出一个Intent的对象,这个Intent对象能承载的信息可描述你想做什么,你想处理什么数据,数据的类型,以及一些其他信息。而Android则会和每个Application所暴露的intent-filter的数据进行比较,找到最合适Activity来处理调用者所指定的数据和操作。

    表3-1 AndroidManfest.xml分析

    manifest

    根节点,描述了package中所有的内容

    xmlns:android

    包含命名空间的声明。

    xmlns:android=http://schemas.

    android.com/apk/res/android,使得

    Android中各种标准属性能在文件中使用,

    提供了大部分元素中的数据

    Package

    声明应用程序包

    application

    包含package中application级别组件声

    明的根节点。此元素也可包含application

    的一些全局和默认的属性,如标签、icon、

    主题、必要的权限,等等。一个manifest

    能包含零个或一个此元素(不能大余一个)

    android:icon

    应用程序图标

    android:label

    应用程序名字

    Activity

    用来与用户交互的主要工具。Activity是用

    户打开一个应用程序的初始页面,大部分

    被使用到的其他页面也由不同的activity所

    实现,并声明在另外的activity标记中。

    注意,每一个activity必须有一个<activity>

    标记对应,无论它给外部使用或是只用于

    自己的package中。如果一个activity没有

    对应的标记,你将不能运行它。另外,

    为了支持运行时查找Activity,可包含一个

    或多个<intent-filter>元素来描述activity所支持的操作

    android:name

    应用程序默认启动的activity

    intent-filter

    声明了指定的一组组件支持的Intent值,从

    而形成了IntentFilter。除了能在此元素下指

    定不同类型的值,属性也能放在这里来描

    述一个操作所需的唯一的标签、icon和其他信息

    action

    组件支持的Intent action

    category

    组件支持的Intent Category。这里指定

    了应用程序默认启动的activity

    uses-sdk

    该应用程序所使用的sdk版本相关

     

     

     

     

     

    proguard-project.txt:代码混淆相关文件

     

    project.properties:

     工程属性的配置文件,配置编译的版本等

     

     

     

     

    标签:xml,文件,layout,--,public,详解,清单,Android,android
    From: https://blog.51cto.com/iwtxokhtd/6248001

    相关文章

    • 网页抓取--1(原网页+Javascript返回数据)
       有时候由于种种原因,我们需要采集某个网站的数据,但由于不同网站对数据的显示方式略有不同!本文就用Java给大家演示如何抓取网站的数据:(1)抓取原网页数据;(2)抓取网页Javascript返回的数据。一、抓取原网页。这个例子我们准备从http://ip.chinaz.com上抓取ip查询的结果:第一步:打开这个网页......
    • 前端技能汇总
      项目起源前端知识结构图(@jayli)。前端开发知识结构前端工程师浏览器IE6/7/8/9FirefoxChrome/Safari/Opera编程语言JavaScript/Node.jsJavaScript语言精粹切页面HTMLCSSPhotoShop/Paint.net开发工具IDEVIM/SublimeText2Notepad++/EditPlus调......
    • 大型网站架构演变和知识体系
      之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术,于是有了写这篇文章的想法。在这篇文章......
    • 微信公众平台开发——如何保证access_token长期有效?
      【编者按】由CSDN和《程序员》杂志联合主办的 2014年微信开发者大会将于8月23日在北京举行。内容涵盖企业服务号开发和高级应用、企业号开发、业务系统对接、高级接口运用、微信支付、智能客服与LBS、HTML5社交应用、微信电商、微信广告自助平台等多方面。作为一线微信开发商云......
    • Java中快如闪电的线程间通讯
      这个故事源自一个很简单的想法:创建一个对开发人员友好的、简单轻量的线程间通讯框架,完全不用锁、同步器、信号量、等待和通知,在Java里开发一个轻量、无锁的线程内通讯框架;并且也没有队列、消息、事件或任何其他并发专用的术语或工具。只用普通的老式Java接口实现POJO的通讯。它可能......
    • 5个强大的Java分布式缓存框架推荐
      本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展。1、EhcacheEhcache是一个Java实现的开源分布式缓存框架,EhCache可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取......
    • JDK----下载、作用、安装、配置
        官网JDK下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html   JDK介绍:java开发、调试需要安装JDK(包括javac编译、JRE等)只运行java程序只需安装JRE(包括javaAPI类库和JVM虚拟机)JRE  JDK环境变量配置及作用:安装完JDK后在cmd中输入java报错“不是内......
    • 错误信息----输出方法
      错误信息输出方式:一:JDK方式控制台输出try{       可能出错的代码}catch(Exceptione){e.printStackTrace();在控制台打印出异常种类,错误信息和出错位置等} 二:Log4j日志输出:导入org.apache.log4j.Logger;及相关包方法1:在需要使用log4j的地方获取Log实例(写......
    • 开发工具说明------
      前端:w3c------------------------------------------------------------------------------------------------------前端调试:HttpWatch------------------------------------------------------------------------------------------------------后端代码生成:Auto----IBatis插件--......
    • web开发总结----xml的写入、读取---2
      publicclassDOM4JTest{/***//***//***//***//***//***//***//***DOM4J读写XML示例**@paramargs*@throwsException*/publicstaticvoidmain(String[]args){try{XMLWriter......