对于Andriod的开发者来说,相信Java语言是第一选择,可是对于.Net开发者来说,要想利用C#在Andriod平台上开发,Mono提供了相应的开发平台来实现,Mono for Andriod就是专门为.Net开发者设计的Andriod手机端开发平台。

Mono for Andriod官方文档:http://docs.xamarin.com/android

Mono for Andriod完全绑定于Andriod Java API,因此,在您安装Mono for Andriod时,必须先安装JDK以及Andriod SDK,这样才能够顺利进行开发。

Mono for Andriod可与Java、C/C++进行交互操作,也就是说Mono for Andriod可以直接调用Java,C,C++的类库。

Mono for Android的应用程序是以.Net BCL为基础,BCL即Base Class Library,它提供了XML, Database, Serialization, IO, String, and Networking等等支持。它的集成开发环境是MonoDevelop或者Visual Studio都可以。

移动跨平台支持,例如Mono for Andriod和MonoTouch(C#版IOS开发平台)可以共用一套后台的公共代码,当然相信未来也受用于Windows Phone 7。

Mono for Andriod是构建于Mono之上,Mono是一个基于.NET ECMA标准的.Net Framework的开源版本,可运行于Linux, UNIX, FreeBSD, Mac OSX等等。

当您编译一个Mono for Andriod应用程序的时候,主要包括三个步骤:

1. 源产生,作为预编译阶段,aresgen.exe运行资源目录,例如Resource.Designer.cs,UI File,Images等资源文件

2. 编译成托管的.Net或者Mono应用程序集

3. Andriod安装包的创建:生成apk文件,通过mandroid.exe工具进行打包

Mono for Andriod安装

目前支持在Windows以及Mac下的安装,这里以Windows为例:

下载地址:http://xamarin.com/trial

您也可以参考它的安装文档:http://docs.xamarin.com/android/getting_started/installation/Installation_for_Windows

这里我选择的是企业版的安装文件setup.exe

运行之,首先它会监测你的计算机是否已经安装了相关的准备,包括JDK(据说目前不支持Java 7,没有试过,因为计算机已经安装了JDK 6)、Andriod SDK、MonoDevelop 3.0.2、Mono Andriod Tool等等,建议这里讲Andriod SDK中的所有版本全部安装,便于调试不同版本的应用程序。

全部安装好了之后,可以在MonoAndriod的Framework的程序集路径C:\Program Files\Reference Assemblies\Microsoft\Framework\MonoAndroid中看到:

另外在目录中,还可以发现mono.android.jar,说明mono也支持Jar包的调用。

在我的本地已经安装了Andriod所有版本的mono.andriod包

现在,不管在您的Monodevelop还是VS中,都可以打开一个AVD Manager的窗口,在该窗口中你可以设置本地的模拟器以及启动它:

通过Start按钮,就可以打开相应的Andriod模拟器。

Mono for Andriod的试用版本可以在任意的模拟器上供你开发学习,如果你需要发布、部署到真实设备中,或者发布到App Store中,就需要购买相应版权,企业版一般授权费用$999,专业版一般授权费用$399,详见:https://store.xamarin.com/

在开发Mono for Andriod应用程序之前,首先必须要先了解一下Mono for Andriod的构成:

Mono for Andriod的BCL是以Silverlight和Client .NET3.5程序集为基础,它包括了丰富的程序集:

1. Base Class Library

主要包括mscrolib.dll,System.dll,System.Core.dll,System.Data.dll,System.Json.dll,System.Runtime.Serialization.dll,

System.ServiceModel.dll,System.ServiceModel.Web.dll,System.Transactions.dll,System.Web.Services.dll,

System.Xml.dll,System.Xml.Linq.dll等等

2. Mono for Android Framework

主要包括Mono.Android.dll,Mono.Andriod.dll作为Andriod开发中最核心的部分,它直接和Andriod API进行绑定

3. Mono Libraries

主要包括Mono.xml.dll,Mono.Security.dll,Mono.Data.Tds.dll,Mono.Data.Sqlite.dll,

Mono.CompilerServices.SymbolWriter.dll等等

另外在MonoAndriod的Framework中还可以看到一个OpenTK.dll,它是OpenGL/OpenAL的封装,通过它可以设计3D的模型,在Andriod游戏开发中相当有用。

Activity与Activity生命周期

Activities作为Andriod应用程序的基础组件,不管是在mono还是非mono下,这个概念是相同的。

在Andriod操作系统中使用优先级栈来管理activities在设备中的运行,而Activity 的生命周期是交给系统统一管理,在android中,Activity拥有四种基本状态:

1. Active/Runing:一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。 
2. Paused:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。 
3. Stopped:当Activity被另外一个Activity覆盖、失去焦点并不可见时处于Stopped状态。 
4. Killed:Activity被系统杀死回收或者没有被启动时处于Killed状态。 
当一个Activity 实例被创建、销毁或者启动另外一个Activity时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作,下图说明了 Activity 在不同状态间转换的时机和条件(参考文章:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/):

Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。Activity 的状态与它在栈中的位置关系如下图所示:

如上所示,除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。

Activity生命周期调用顺序:

参考MonoAndriod的一段代码:


[Activity (Label = "Hello M4A", MainLauncher = true)] 
public class Activity1 : Activity 
{
protected override void OnCreate (Bundle bundle) 

base.OnCreate (bundle);  //Use UI created in Main.axml 
SetContentView(Resource.Layout.Main);  var aButton = FindViewById<Button> (Resource.Id.aButton); 
var aLabel = FindViewById<TextView> (Resource.Id.helloLabel);  aButton.Click += (sender, e) => {aLabel.Text = "Hello from the button";}; 

}

所有的活动页面基本是基于Activity来实现(当然andriod 3.0版本之上还可以通过Fragment的UI组件来实现),通过OnCreate完成Activity的首次构建。

具体Activity生命周期还可以参考官方文档:http://docs.xamarin.com/android/tutorials/Activity_Lifecycle

Activity之间的数据通信是通过使用Intent类来实现,在官方的Demo中大量使用Intent类,不同的Intent类型实现了不同的功能,这个在后面的文章中我会具体在作出介绍。

最后,通过一个示例的介绍来看看怎样创建一个Mono for Andriod应用程序,(以VS为例):

当你安装好Mono for Andriod的一切之后,我们可以在VS的新建项目中看到:

新建一个Andriod项目,在解决方案中我们看到产生一系列的目录以及文件:

Asserts包含应用程序需要在其中任何类型的文件,这里包含的文件通过Asserts类就可以进行访问,其中需要设定相关文件的生成操作为AndriodAsset:

您可以通过代码来访问文件的内容,例如:

InputStream input = Assets.Open ("AboutAssets.txt");

Resources包含应用程序资源,如字符串和图像,以及声明性XML(Andriod XML)的用户界面(这里统一放在Layout中)定义。这些资源是通过生成Resources类进行访问,同样需要设定文件的生成操作:

Values中的String.xml作为本地的资源字符串文件进行配置,例如:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="helloButtonText">Say Hello</string> 
    <string name="helloLabelText">Hello Mono for Android</string> 
</resources> 

通过代码访问:

var aLabel = new TextView (this);
aLabel.SetText(Resource.String.helloLabelText);
var aButton = new Button (this);
aButton.SetText(Resource.String.helloButtonText);

Activity1.cs就是新建的一个继承于Activity类的实现,通过这个类可以编写页面的相关逻辑。

Mono for Andriod最终将Code以及Resources文件等等编译执行打包成为.apk文件,如下图所示:

编写代码:


[Activity (Label = "Hello M4A", MainLauncher = true)] 
public class Activity1 : Activity 

    protected override void OnCreate (Bundle bundle) 
    { 
        base.OnCreate (bundle);
        SetContentView(Resource.Layout.Main); 
        
        var aButton = FindViewById<Button> (Resource.Id.aButton); 
        var aLabel = FindViewById<TextView> (Resource.Id.helloLabel); 
        
        aButton.Click += (sender, e) => {aLabel.Text = "Hi, Leepy!";};                 
    } 

以及Main.axml:


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:orientation="vertical" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 
<TextView 
        android:id="@+id/helloLabel" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/helloLabelText" /> 
<Button 
        android:id="@+id/aButton" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/helloButtonText" /> 
</LinearLayout>

具体实现的说明我会在下篇具体介绍

现在要运行应用程序,先开启一个Andriod 2.2版本的模拟器:

调试执行程序

选择刚刚启动的模拟器,(注:应用程序在首次加载时,首先会将相关的mono Assembles 和 mono for andriod framework包安装到模拟器中,打包的apk文件也会安装到模拟器中,这个过程要等待几分钟)

点击“Say Hello”按钮,在TextView控件中显示“Li,Leepy”。

Mono for Andriod学习与实践(1)— 初体验的更多相关文章

  1. oracle 12c 学习系列(1)–12c初体验

    详见原文博客链接地址: oracle 12c 学习系列(1)–12c初体验

  2. 学习C++模板,初体验

    最近,看了很多码神级人物的代码,发现其代码很炫酷,尤其对模板的使用,作为小码农,感觉已经落伍了,所以应该发奋图强,好好学习和掌握模板这个东西. 模板是什么呢?有人说一个模板就是一个创建类或函数的蓝图或 ...

  3. JavaCV 学习(一):JavaCV 初体验

    最近工作中因为项目的原因边学边用,接触并使用JavaCV做了一些相关的产品,目前觉得,JavaCV在图形图像(人家本身就是一个视觉库)的功能真的挺强大,而且使用起来避免了复杂的平台处理.下面整理一下对 ...

  4. 云中沙箱学习笔记2-ECS之初体验

    1.1 背景知识 云服务器(Elastic Compute Service, 简称ECS),是一种简单高效,处理能力可以弹性伸缩的计算服务.ECS的相关术语说明如下: --实例(Instance):是 ...

  5. Android开发学习之路--百度地图之初体验

    手机都有gps和网络,通过gps或者网络可以定位到自己,然后通过百度,腾讯啊之类的地图可以显示我们的地理位置.这里学习下百度地图的使用.首先就是要申请开发者了,这个详细就不多讲了.http://dev ...

  6. Python基础学习参考(一):python初体验

    一.前期准备 对于python的学习,首先的有一个硬件电脑,软件python的运行环境.说了一句废话,对于很多初学者而言,安装运行环境配置环境变量的什么的各种头疼,常常在第一步就被卡死了,对于pyth ...

  7. MindSpore手写数字识别初体验,深度学习也没那么神秘嘛

    摘要:想了解深度学习却又无从下手,不如从手写数字识别模型训练开始吧! 深度学习作为机器学习分支之一,应用日益广泛.语音识别.自动机器翻译.即时视觉翻译.刷脸支付.人脸考勤--不知不觉,深度学习已经渗入 ...

  8. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  9. hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse

    生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...

随机推荐

  1. SilkTest高级进阶系列7-用PostMessage模拟鼠标

    SilkTest可以通过调用Windows API来向控件发送消息,从而进行特定的操作.下面这段code使用PostMessage来向计算器上的清除键发送WM_LBUTTONDOWN和WM_LBUTT ...

  2. IOS中的id与nil

    1 id id和void *并非完全一样.在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject) ...

  3. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...

  4. 最佳新秀SSH(十三)——Spring集装箱IOC分析和简单的实现

    时间最近一段时期,"集装箱"这个词一直萦绕在我的耳边,连吃饭.睡在我的脑海里蹦来蹦去的. 由于这几天的交流时间.讨论,对于理解容器逐渐加深. 理论上的东西终归要落实到实践,今天就借 ...

  5. linux LVS DR模式配置

    拓扑图: 测试环境:CentOS 6.5 X86 64位 配置步骤: 1.  安装测试环境 [root@UCS-1 ~]# yum -y install httpd [root@UCS-1 ~]# c ...

  6. java中线程中的相关知识点

    (1)守护线程必须在线程start前设置(2)守护线程在所有用户线程结束后,也会终止(3)由于(2)所有守护线程不能执行一些读写操作,原因:如果守护线程在执行读写操作时,如果用户线程结束了,守护线程的 ...

  7. 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别

    原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPa ...

  8. poj3206(bfs+最小生成树)

    传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...

  9. C#多线程问题整合

    一.跨进程访问组件 错误:线程间操作无效: 从不是创建控件“XXX”的线程访问它 解决方法: 1:把CheckForIllegalCrossThreadCalls设置为false 这个方法只是不去捕获 ...

  10. Hdu 3410 【单调队列】.cpp

    题意: 给出一个数组,问你对于第i个数,从最后一个比它大的数到它之间比它小的数中最大的那个数的下标,以及它右边到第一个比它大的数中比它小的数中最大的那一个数的下标<下标从1开始>. eg: ...