monoandroid教程
① 什么是Mono for Android
Mono for Android 由一组针对移动平台进行优化的程序集、命名空间以及类组成。其代码是.NET 4、Silverlight和Windows Phone 配置文件的组合,同时还包括允许开发人员充分利用Android 平台的代码。
命名空间和类
Mono for Android 提供了一组丰富的命名空间和类来支持为 Android 设备构建应用程序。
Mono的含义:Mono是一个有Xamarin所发起的开源项目,主要用于创建.NET CLI、C#编译器以及开放的开发堆栈的Ecma标准的实现。
目前Mono的实现主要有三个目标:
(1) 开源的CLI
(2)C#编译器
(3)公开的开发堆栈
② mono开发安卓的人多吗
Mono for
Android开发调研笔记
安装完Mono for Android(简称:MonoDroid)之后,可以用MonoDevelop或Visual Studio来开发Mono for
Android应用程序;目前只能在模拟器上调试和部署,必须购买后才能在真机上调试和部署;目前遇到的最大的问题是:模拟器上调试速度非常慢,通过单步调试每一行代码都需要几秒钟。有人开了个帖子抱怨以及一些回复的相关讨论:http://mono-for-android.1047100.n5.nabble.com/Free-version-Emulator-only-Bye-bye-td5091443.html,另外,如果购买了正式版,那支持直接用设备来调试的相关文章介绍:http://docs.xamarin.com/android/tutorials/debug_on_device
MonoDroid应用程序,应该说所有的Android应用程序只要在处理5秒后还未完成,则会自动提示用户“应用程序无响应,是否结束应用”类似这样的提示信息。所以我们一般在处理一些可能比较耗时的操作时,比如与服务器进行通信请求数据或Post数据。这里操作都需要通过异步的方式来完成;
MonoDroid提供的API与原生java平台下的Android开发基本一致,类的名称以及方法名称都保持一致,这样只要会开发原生的Android应用,那在MonoDroid下也可以开发;
虽然说MonoTouch,
MonoDroid可以允许我们用C#来开发在IOS以及Android应用,但是并不是所有的代码都只要用c#写一次就可以在这两个平台上跑了。实际上,能重用的代码也许只有业务层的代码。因为UI的实现,两种平台不同,MonoDroid下依赖于Mono.Android来实现UI,而MonoTouch下则是用另外一套不同的UI实现方式。实际上Mono更多的是考虑了与原生API一致的方式来开发UI,所以设计了两套不同的类库来实现UI架构;所以UI层的代码无法重用;另外,数据访问层,也不能共用,因为虽然都是访问sqlite,但是Mono在这两个平台上分别对应实现的API不同,MonoTouch下使用:MonoTouch.CoreData,而MonoDroid下使用Mono.Data.Sqlite。当然我们还是可以将数据访问层进行抽象,比如抽象成IRepository,然后业务层调用IRepository的接口即可,IRepository的具体实现需要基于不同平台分别实现;
之前可以在Windows上跑的Castle框架在MonoDroid上不再支持,编译会遇到错误,因为Castle程序集依赖于System.Configuration这个程序集,但是在MonoDroid平台上没有这个程序集;MomoDroid平台上支持的.Net程序集有限,见下面的介绍。基于这个原因,但是又希望能像以前那样使用某个IOC框架,所以找了一个跨各种手机平台的轻量级开源Ioc框架(TinyIoC),该框架非常小,只有一个cs文件就能使用,使用后感觉效果还不错,基本容器功能都支持了。git开源项目地址:https://github.com/grumpydev/TinyIoC
log4net在MonoDroid上也不支持,因为:Log4Net uses classes in .Net namespaces such as
System.Web, and System.Diagnostics that are not yet implemented in Mono for
Android. 不过幸好,Android平台自带了一个Log记录器,在MonoDroid下可以使用Android.Util.Log来记录日志。如果是用Visual
Studio来开发,则可以直接在VS的Output窗口看到日志,另外VS还有一个专门的窗口(View -> Other Windows ->
Android Device Logging)用来查看Android记录的日志。另外,也可以通过命令行的方式查看日志,定位到目录:C:\Program
Files (x86)\Android\android-sdk\platform-tools,执行命令:adb
logcat,详细方法可以参考:http://docs.xamarin.com/android/advanced_topics/android_debug_log
MonoDroid的数据库是用sqlite,目前内置支持两种数据访问方式:原生方式(游标的方式)以及ADO.NET类似的接口,使用起来ADO.NET的方式非常简单,我们只需要引用:Mono.Data.SQLite这个程序集就能像ADO.NET那样来访问sqlite数据库了。
游标方式举例:
//查询数据
ICursor cursor = this.db.Query(DatabaseTable, new[] { KeyRowId, KeyTitle, KeyBody }, null, null, null, null, null);
//新增数据
var initialValues = new ContentValues();
initialValues.Put(KeyTitle, title);
initialValues.Put(KeyBody, body);
this.db.Insert(DatabaseTable, null, initialValues);
//更新数据
var args = new ContentValues();
args.Put(KeyTitle, title);
args.Put(KeyBody, body);
this.db.Update(DatabaseTable, args, KeyRowId + "=" + rowId, null);
//删除数据
this.db.Delete(DatabaseTable, KeyRowId + "=" + rowId, null);
//事务支持
this.db.BeginTransaction(); //Start a transaction.
try {
var result = func(); //Do update db operations.
db.SetTransactionSuccessful(); //tell db the update operations successfully.
return result;
} catch {
//Error in between database transaction
}finally {
//commit the transaction.
//if the setTransactionSuccessful method have not been called, then the transaction will auto rollback.
db.EndTransaction();
}
ADO.NET方式举例,(需要引用:Mono.Data.Sqlite)
//查询数据
public static IEnumerable<Note> GetAllNotes()
{
var sql = "SELECT * FROM ITEMS;";
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
yield return new Note(reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2));
}
}
}
}
//新增和更新数据
public static void SaveNote(Note note)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
if (note.Id < 0)
{
// Do an insert
cmd.CommandText = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified); SELECT last_insert_rowid();";
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);
note.Id = (long)cmd.ExecuteScalar();
}
else
{
// Do an update
cmd.CommandText = "UPDATE ITEMS SET Body = @Body, Modified = @Modified WHERE Id = @Id";
cmd.Parameters.AddWithValue("@Id", note.Id);
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);
cmd.ExecuteNonQuery();
}
}
}
}
//删除数据
public static void DeleteNote(Note note)
{
var sql = string.Format("DELETE FROM ITEMS WHERE Id = {0};", note.Id);
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
}
//事务支持
using (var conn = GetConnection ()) {
conn.Open ();
var transaction = conn.BeginTransaction();
try
{
//Do db operations.
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
ORM,NHibernate不能运行在Mono for
Android上,不过手机应用的业务逻辑相对简单,ORM的需求优先级应该不是很急,暂时可以通过上面的数据访问方式来访问sqlite数据库。
类库方面,目前支持的.net类库有限,主要有以下几个:
1 mscorlib
2 System 包含System.Net命名空间,支持HttpWebRequest, HttpWebResponse,这两个类可以实现与服务器端通信
3 System.Core 包含IO, LINQ, Collections,etc
4 System.Data 该类库实现了ADO.NET的相关基础架构,如DataReader, DataAdapter, Connection, Command, etc.
5 System.Data.Services.Client
6 System.EnterpriseServices
7 System.Json 提供了简单的JSON序列化和反序列化支持
8 System.Numberics
9 System.Runtime.Serialization
10 System.ServiceModel
11 System.ServiceModel.Web
12 System.Transactions 提供事务支持,包括分布式事务
13 System.Web.Services
14 System.Xml
15 System.Xml.Linq
16 Microsoft.CSharp
17 //以下几个是Android开发需要的类库
18 Mono.Android MonoDroid核心类库,该类库中提供的API与原生的JAVA API基本一致,所以使用起来很方便;
19 Mono.Android.Export
20 Mono.Android.GoogleMaps
21 Mono.Android.Support.v4
22 Mono.CompilerServices.SymbolWriter
23 Mono.CSharp
24 Mono.Data.SQLite 提供封装了Sqlite数据库的ADO.NET接口支持
25 Mono.Data.Tds
26 Mono.Security
与服务器通信,可以像平时一样通过HttpWebRequest或WebClient来发送请求。以下代码设计了一个通用的通过异步的方式发送HttpWebRequest
/// <summary>
/// 异步发送HttpWebRequest
/// </summary>
/// <param name="cookie"></param>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <param name="callback"></param>
public static void SendHttpPostRequest(Cookie cookie, string url, string postData, Action<HttpWebResponse> callback)
{
//解决https下的证书问题
HttpRequestCredentialHelper.();
var request = HttpWebRequest.Create(url) as HttpWebRequest;
//设置请求类型为POST
request.Method = "POST";
//设置Post的数据
if (!string.IsNullOrEmpty(postData))
{
request.ContentLength = postData.Length;
request.ContentType = "application/x-www-form-urlencoded";
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
writer.Close();
}
}
//将Cookie放入请求,以让服务器知道当前用户的身份
var container = new CookieContainer();
request.CookieContainer = container;
if (cookie != null)
{
container.SetCookies(new Uri(Constants.ROOT_URL), string.Format("{0}={1}", cookie.Name, cookie.Value));
var logger = DependencyResolver.Resolve<ILoggerFactory>().Create(typeof(HttpWebRequestHelper));
logger.InfoFormat("HttpWebRequest CookieName:{0}, Value:{1}", cookie.Name, cookie.Value);
}
//异步发送请求
request.BeginGetResponse(new AsyncCallback(asyncResult =>
{
var httpRequest = asyncResult.AsyncState as HttpWebRequest;
using (var response = httpRequest.EndGetResponse(asyncResult) as HttpWebResponse)
{
callback(response);
}
}), request);
}
发送请求示例代码:
HttpWebRequestHelper.SendHttpPostRequest(null, url, postData,
response =>
{
var response = HttpWebRequestHelper.GetTextFromResponse(response);
//这里处理HttpWebResponse
//如果要反问UI相关元素,则需要封装为一个委托然后在RunOnUiThread方法内执行
RunOnUiThread(() =>
{
var folders = _taskFolderService.GetAllTaskFolders();
_listView.Adapter = new TaskFolderAdapter(this, Resource.Layout.TaskFolderListItem, folders.ToArray());
});
});
分层架构,我觉得我们可以采用以下的分层架构:
UI 界面层,MonoTouch,MonoDroid分别实现
Model
模型层,实现核心业务逻辑,代码可重用,如果采用DDD领域模型来实现,则可以包括:Service,Aggregate,Entity,VO,IRepository
Model.Infrastructure
基础框架层,实现公共基础代码,供上层调用,如DI,log,configuration,httprequest, constants, etc
Model.Repositories 仓储实现层,对Model层的IRepository接口的实现,不同平台采用不同实现
③ mono for android 怎么设置数字签名
用java命令查看,如下:
C:\jdk1.6.0_10\bin>jarsigner.exe -verify f:\ICBCAndroidBank.apk
jar 已验证
什么是数字签名?
数字签名就是为你的程序打上一种标记,来作为你自己的标识,当别人看到签名的时候会知道它是与你相关的。
为什么要数字签名?
Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!
Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
④ 关于 mono for android的安装问题
mono for android不是免费软件,但可以试用。
安装这个软件,需按照以下步骤:
1、安装JDK
2、安装 Andorid SDK(根据你的Android版本,下载合适的SDK)
3、MONO 在 Windwos 下的运行时
4、装MONO for Android (根据你的Android版本,比如MONO for Android 4.2.5)
5、可选MonoDevelop, 装MonoDevelop要注意,要先装gtk-sharp
以上步骤不能错!
⑤ 在mono for android中的webview加载网页实现百度api浏览器定位问题 !!!
楼主问题解决了吗?我也遇到这个问题了,地图加载都正常,但是定位失效,在手机浏览器定位功能好用
⑥ Mono for Android 发布,开发者可以使用 C# 开发 Android 程序
Mono for Android V1.0 正式发布啦!
Mono for Android就是原先的MonoDroid,由于商标问题(名称中含有Droid),现在改名为Mono for Android。
Mono for Android提供了一个基于Android的Mono虚拟机,让开发者可以用C#开发Android应用程序。另外,Dalvik API已经被绑定至C#,你可以用C#方便地调用Android内置的很多类库。OpenTK类库也被移值过来,你可以在Windows, Linux与iPhone三个不同的平台上共享同样的OpenGL代码。
当前版本只支持C#语言,但理论上应该支持其他语言的编译器。通过针对Mono for Android的Visual Studio 2010 add-on,你可以在熟悉的VS2010开发环境中开发Android应用。
如果你是.NET程序员,如果你想开发移动应用程序,如果你不想学习和编写Java代码,如果你目前不看好Windows Phone 7,那就用Mono for Android吧!而且,如果哪天Windows Phone发达了,你想开发WP应用程序了,那你现在写的很多代码还可以用于WP应用开发!另外,如果你考虑用MonoTouch开发iPhone应用程序,那就更幸福了,为Android应用写的C#代码,也可以用于iPhone应用开发。一次写代码,却可以用于三大移动平台,世上难道还有比.NET程序员更幸福的程序员吗!.NET程序员们,欢呼吧!
但是欢呼的同时,我们也要面对现实,使用Mono for Android有一些限制。比如,不能使用C# 4.0的dynamic特性。另外,一些专门针对Android的类库(比如针对Android特有的硬件,针对由Android本地类库和TK实现的UI),在其他平台的.NET实现中可能得不到支持。这就意味着,如果Android应用与Windows Phone应用要共享代码,只能共享核心代码。Mono for Android提供的只是让你可以用C#代码编写Android应用,但是开发一个真正的Android应用,你还需要学习很多东西,比如:Activities, Intents,通过XML创建UI。
Mono for Android提供了一个可以免费下载的版本,但只能在模拟器中使用。要想在真实环境中使用,需要购买商业许可。专业版$399/年,企业版$999/年。i-programmer上的报道有误,经过在Mono for Android官网上查证,专业版授权费$399,企业版授权费$999,学生版授权费$99(无时间限制)。
⑦ 怎么在vs2015上安装mono for android破解版
注意: 请不要 将 Android SDK 安装在带有空格的目录,例如很多人喜欢将应用默认安装在 C:\Program Files\ 下,这会导致出错。
安装完毕后运行 SDK Manager
安装要求:
Android SDK Tools, revision 10 or greater
Android SDK Platform-tools, revision 3 or greater
Install one or more SDK Platforms, such as:
SDK Platform Android 1.6, API 4, revision 3
SDK Platform Android 2.3.3, API 10, revision 1
注意: SDK 会经常提示更新一些建议版本,最简单的方式是选择 Update All 按钮.
如果在打开 SDK 设置时收到了错误信息 "Failed to fetch URL https://...", 可以尝试在选项 Settings > Misc 下检查 "Force https://... sources to be fetched using http://..." 并返回可用包列表中。
第三步 - 配置模拟器
Android Simulator 可配置用来运行多个不同版本设备的模拟,在使用前至少需要配置一个设备,可通过 Android SDK 安装程序直接选择 Virtual Devices 选项:
点击 "New" 按钮,下面是配置对话框:
不要理会下面的提示信息,该信息只是告诉你一切正常:
做完这步后我们已经配置好了模拟器,Android SDK 的设置也就到此结束。
注意: 你无需在 Android SDK 安装程序中启动模拟器,MonoDroid 将帮你搞定。
第四步 - 安装 Mono for Android Visual Studio 2010 插件
一旦你走到这步,就可以开始安装 Mono for Android 的 Visual Studio 2010 插件了,
注意: 安装之前必须先关闭 Visual Studio 2010!
根据提示信息进行安装,建议仔细阅读最终用户协议,这里设计很多法律方面的问题,如果你只是想试试的话,跳过去!
⑧ Mono For Android !Could not create the Android package!
我是这样解决的:
1. 可能是你的VS创建的项目路径含有中文或其他杂乱数据
2. 如果不是1中的:把android-sdk\tools这个目录用原原包文件重新履盖一遍。原因可能是在某个安装或升级时把以上这个目录中的哪个文件删除掉了(比如的就发现aapt.exe不在了),所以用Android SDK安装包中tools目录再履盖本地同一目录就可解决。
我自己是用方法2解决的。
⑨ mono for android 开发的程序如何生成安装包
编译就可以生成apk文件。下载一个破解的替换文件就可以联机了。
download.csdn.net/detail/yourboy416/4913360
⑩ C#开发Android手机应用全接触(mono for android)教程
也在学习这个,但找不到系统性的教程,只好到xamarin去看官网上的示例。下载下来自己再看。
http://xamarin.com/
但有些示例,也不知是不是网络原因,打开时一些引用DLL无法安装。