对于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. heapq

    heapq-Guest-ChinaUnix博客 假设你需要维护一个列表,这个列表不断有新的元素加入,你需要在任何时候很方便的得到列表中的最大(小)值,因此要求列表始终处于排序完毕状态,怎么办呢 最简单 ...

  2. latex命令替换之\newcommand

    有时候我们在用latex写文档的时候不想写很长的命令,那么我们自己定义一个新的命令来替换一段代码. 举例如下: \usepackage{booktabs} \usepackage{multirow} ...

  3. CSDN编程挑战——《高斯公式》

    高斯公式 题目详情: 高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050.如今问题在于给你一个正整数n,问你他能够表示为多少种连续正整数之和?(自身也算). 输入格式: 多组数据,每 ...

  4. Android资源文件及文件夹介绍

    在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的 1:assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片, ...

  5. python安装依赖

    yum install zlib zlib-devel openssl openssl-devel bzip2 bzip2-devel ncurses ncurses-devel readline r ...

  6. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  7. VSTO之旅系列(四):创建Word解决方案

    原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结 一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个 ...

  8. 【ASP.NET】验证控件

    在软件开发中,验证输入信息是否正确,这是不可缺少的一项工作.就拿我们做过的机房收费系统来说,在登录的时候,我们须要对username和用户password进行验证.推断是否为空,推断输入字符是否合理等 ...

  9. WPF案例 (三) 模拟QQ“快速换装"界面

    原文:WPF案例 (三) 模拟QQ"快速换装"界面 这个小程序使用Wpf模拟QQ快速换装页面的动画特效,通过使用组合快捷键Ctrl+Left或Ctrl+Right,可实现Image ...

  10. yum 安装软件时报错

    报错信息 Another app is currently holding the yum lock; waiting for it to exit 处理方法 rm -rf /var/run/yum. ...