你的位置:首页 > 操作系统

[操作系统]第4章(1) Android项目的基本结构


分类:C#、Android、VS2015;创建日期:2016-02-06

第4章 UI设计基础

第3章虽然通过百度地图应用展示了你可能感兴趣的内容,但是,如果你是一个初学者,一开始就看懂和理解代码可能会非常费劲。为了解决此问题,从这一章开始,本模块将从最基本的内容讲起,带你逐步进入用C#进行Android应用开发的乐园。

4.1 Android项目的基本结构

要用C#开发Android应用程序,首先需要对项目的基本结构有一个感性认识。如下图所示:

image

1、AndroidApp入口

Android应用程序使用的是单一入口,源程序中并不能一眼看出程序从哪开始运行,当应用程序加载到内存中时,Android操作系统会自动从内部自定义的入口处开始运行该应用程序。这种独特的架构可让程序员设计的代码直接和Android操作系统交互,但其缺点也很明显:即使一个非常简单的程序,也会变得很复杂。

为了方便找到程序入口点,当新建一个Android项目时,默认情况下,在MainActivity.cs文件的特性声明中通过“MainLauncher = true”表示程序从这个Activity开始执行:

[Activity(Label = "myDemos", MainLauncher = true)]

public class MainActivity : Activity

{

     //……

}

注意MainActivity.cs的前缀,一般表示它控制的是布局文件Main.a实际上,你可以把“MainLauncher = true”放到任何一个继承自Activity的类中。总之,你将其放到哪个类的特性声明中,程序就从哪个Activity开始执行。

2、组件(Components)

在Android应用程序中,每个组件都是一个独立的模块,但并不是所有组件都是用户进入程序的真实入口,其中一些要依赖于其它组件。

Android内置了四种不同的应用程序组件:Activity、Service、Content Provider和Broadcast recevicer。除此之外,还可以自定义组件并将其保存到项目的Components文件夹下。

在后面的章节中,还会专门介绍这些内容,这里你只需要记住真正掌握Android应用开发技术,必须理解这些组件的含义和具体使用场合即可。

3、附件(Assets)

Assets文件夹包含了运行App需要的所有原始文件。该文件夹下可保存任意类型的文件:text、下面的代码演示了如何读取Assets下的.txt文件:

using Android.App;using Android.OS;using Android.Widget;using System.IO;namespace MyTestProj{  [Activity(Label = "Activity1")]  public class Activity1 : Activity  {    protected override void OnCreate(Bundle savedInstanceState)    {      base.OnCreate(savedInstanceState);      base.OnCreate(savedInstanceState);      var textView1 = new TextView(this);      string content;      using (StreamReader sr = new StreamReader(Assets.Open("readme.txt")))      {        content = sr.ReadToEnd();      }      textView1.Text = content;      SetContentView(textView1);    }  }}

4、资源(Resources)

一个Android App由代码、资源文件以及自定义的组件构成。

资源文件保存到Resources文件夹下,包括图片,音频文件,以及任何与程序可见内容相关的东西。例如,自定义的动画、菜单、风格、颜色以及由.a(1)基本概念

Resources文件夹下保存的资源不包括代码文件,而是指随项目一起编译和打包的除了代码文件之外的其他文件,如声音、视频、图像、字符串、布局文件等。

image

将资源单独组织的优点是:代码分离,这样就可以适用于多平台,同时也能在编译时进行检查,并在编译通过后为键入C#代码提供智能提示。

使用资源可使修改程序的特征变得很容易,同时不必修改代码。而且通过可选择的资源集合,能为不同的设备配置优化程序(例如不同的国家语言和不同的屏幕尺寸等)。

系统搭建工具会自动为Android项目使用的每一个资源都定义一个唯一的整型ID,程序通过ID获得代码中的资源或者.分隔资源的一个重要能力是为不同的设备配置提供可选择的资源文件。例如,在Android支持很多不同的修饰符以支持可选的资源。这些修饰符都是被加入到资源目录名中的简短字符串。这样定义是为了定义设备的特定配置,以保证这个目录下的资源可能会被使用到。

(2)常用资源

项目中常用的资源文件夹如下。

(a)图片资源

Drawable:保存通用的图片文件。

drawable-ldpi:保存低分辨率手机专用的图片文件。

drawable-mdpi:保存中等分辨率手机专用的图片文件。

drawable-hdpi:保存高分辨率手机专用的图片文件。

drawable-xdpi:保存超高分辨率手机专用的图片文件。

drawable-xxdpi:保存超超高分辨率手机专用的图片文件。

(b)布局文件

layout文件夹:用于保存所有界面文件(包括带设计界面的.aMain.a(c)字符串资源文件

Values文件夹:存放用字符串描述的资源文件信息(strings、integers、colors等),这些都是文本资源,在文件夹中有一些约定的文件名称。(具体内容待以后详解)

(d)默认的资源类型

下表列出了默认的所有资源类型:

image

5、引用资源的方式

当将资源文件添加到项目中时,管道会自动将该资源描述添加到资源中,并自动生成对应的类(保存在Resource.designer.cs文件中),自动生成的类会为每个资源自动分配一个唯一的ID。

有两种存取和管理资源的方式:

  • 用C#代码引用资源。
方式1--在C#代码中引用资源

格式:@[<PackageName>.]Resource.<ResourceType>.<ResourceName>

例如:

SetContentView(Resource.Layout.Main);EditText phoneNumberText = FindViewById<EditText>(Resource.Id.PhoneNumberText);

方式2--在

格式:@[<PackageName>:]<ResourceType>/<ResourceName>

例如(见Main.a<??><LinearLayout ="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/myImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/flag" /></LinearLayout>

6、备用资源(Alternate Resources)

备用资源也是保存在Resources文件夹下,子文件夹的格式为:

<ResourceType>-<Qualifier>

即:<资源类型>-<限定标识符>

例如:drawable-hdpi

当有多个限定符时,各限定符之间用短划线分隔。

限定符必须按下表列出的顺序出现(该表实际是按优先级从高到低排列):

image

image

image

例如,v11的目标是API level 11 (Android 3.0)设备。.下图列出了Android的判断规则:

image

7、权限设置与管理(AndroidManifest.

清单(Manifest)可以定义应用程序及其组件的结构和元数据。

AndroidManifest.该文件的功能类似于网站中的Web.conig文件。

在AndroidManifest.image

设置后,它会自动更新项目中Properties文件夹下的AndroidManifest.在Android系统能够启动一个程序组件之前, 系统必须通过读取程序的AndroidManifest.除了声明程序组件外,这个配置文件还做一些其它的工作,例如:

  • 确定程序需要哪些用户权限,例如网络访问或者读取用户的联系人。
  • 声明程序需要的最小的 API Level 这个要参照程序都使用了哪些API。
  • 声明程序使用或要求的硬件和软件特性,例如相机,蓝牙服务,或者多点触屏。
  • 程序需要链接的API类库(除Android framework API之外的类库),例如 Google Map类库。

但是,如果用C#来开发,“直接在AndroidManifest.当然,如果你希望直接在该文件中添加声明,也可以这样做。换言之,C#开发给你提供了多种声明清单的方式,你只需要按自己的习惯去选择一种合适的方式即可。这些方式有:

  • 在AndroidManifest.
  • 通过项目的属性窗口选择,然后让编译器自动将合适的代码添加到AndroidManifest.
  • 在AssemblyInfo.cs文件中声明,然后让编译器自动自动将合适的代码添加到AndroidManifest.
  • 通过在类上方添加特性声明来声明,然后让编译器自动自动将合适的代码添加到AndroidManifest.

通过这些方式,你就拥有了最大的灵活性,同时也是代码看起来简洁而直观,

8、CPU架构(CPU Architectures)

VS2015调试模式(Debug)使用的是可适应多种CPU架构的模式,发布模式(Release)用于选择某种具体型号的手机,然后部署。

(1)如何指定支持的CPU架构

在调试状态(Debug)下,下面的两个选项默认是选中的:

image

这两个选项选中后。可防止调试时指定某种具体的CPU架构(CPU Architectures),即在下面的配置中,下面这些选项是不可更改的:

image

通常情况下,实际发布应用程序时需要明确配置使用的CPU体系结构或架构。当更改为发布(Release)模式时,它会自动不勾选“Use Shared Runtime”和“Use Fast Delployment…”复选框,这样一来,上图中的选项就可选了。

Xamarin.Android提供下面的架构:

  • armeabi – 基于ARM的CPU系列,提供了不低于ARMv5TE结构的指令集。注意armeabi不是线程安全的而且不能用于多CPU的设备。
  • armeabi-v7a – 这种CPU支持硬件浮点运算和多CPU(SMP)设备。注意armeabi-v7a的机器码无法在ARMv5设备上运行。
  • arm64-v8a –这是一种基于64-bit ARMv8架构的CPU。
  • x86 – 这种CPU提供x86 (or IA-32)指令集。该指令集等价于奔腾Pro(Pentium Pro),包括MMX, SSE, SSE2,以及SSE3指令集。
  • x86_64 CPUs提供64-bit的x86指令集。

在Release模式下,Xamarin.Android默认指定的是armeabi-v7a,其性能比armeabi高。如果发布目标是64-bit ARM平台(例如Nexus 9),此时需要选择arm64-v8a。如果发布到x86设备,就选择x86,如果发布目标是64-bit的CPU架构,就选择x86_64。

注意:由于在64位架构上可运行32位程序(例如Nexs 9就是64-bit ARM设备),因此,发布到64位手机设备上的时候,不是必须选择arm64-v8a或x86_64,仍然可以继续选择32位架构,这样做的优点是可避免应用程序占用过多的内存。

(2)多平台目标(Targeting Multiple Platforms)

面向多平台的优点是可同时调试多种CPU,缺点是这会导致.apk文件很大,如果希望减少.apk文件的大小,发布时只选择一个平台就行了。

注意:虽然在Xamarin.Android 5.1.x或更高版本中也可以体验64位的功能,但实际发布时并不使用它。