Xamarin.Android开发及常见问题


Xamarin.Android开发及常见问题的解决

xamarin.android


一、Xamarin.Android开发环境的搭建

(一)所需组件

1.VS2013(VS2010以上即可)
2.JDK(http://www.oracle.com/technetwork/java/javase/downloads/index.html
3.Android SDK及NDK(http://developer.android.com/sdk
4.gtk-sharp(http://www.mono-project.com/download/#download-win
5.Xamarin VisualStudio

(二)搭建环境两种可选方案

搭建开发环境可以使用Xamarin官网上的在线安装文件来安装,下载地址:http://xamarin.com/download,也可以选择自己手动安装。在线安装为傻瓜式安装,就不解释了(唯一缺点是下载速度奇慢)。来说下手动安装过程。

(三)安装顺序

1.安装Java SDK(jdk),这是虚拟机运行的基本条件
2.安装Android SDK后运行并下载各个版本的Android SDK
3.使用avd Manager工具(在Android SDK同级目录下可以找到)来新建一个模拟器(如果使用真机测试,可以不用新建模拟器)
4.安装gtk-sharp
5.安装Xamarin VisualStudio,该文件为VS的插件,用来添加Xamarin的项目模板
6.设置VS2013开发环境里的Android SDK及NDK路径

此处输入图片的描述

至此,环境搭建完成!

二、常见问题的解决方案

(一)开发环境无法发现模拟器或真机

这种情况90%是adb被占用的问题,adb的tcp默认是5037,导致android设备与5037端口绑定失败的原因有很多,比如不要安装360、91助手等任何能连接手机的应用,他们会占用该tcp5037。
我们来输入命令来进一步确定,在cmd命令台输入“adb start-server”后如果输出了:
adb server is out of date. killing...
ADB server didn't ACK
* failed to start daemon *

那么可以确定adb的端口是被别的进程占用了,这时候,我们再来输入命令:
netstat -ano | findstr "5037"
回车后会有类似这样的反馈:
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4236
TCP 127.0.0.1:5037 127.0.0.1:49422 ESTABLISHED 4236
TCP 127.0.0.1:49422 127.0.0.1:5037 ESTABLISHED 3840

这时候我们打开任务管理器,把pid为4236的进程干掉。

(二)开发环境提示“vs正忙...”

开发环境一旦出现了这样的提示,请不要继续傻傻的等它忙完,它也不会告诉你它到底在忙些什么,唯一能确定的是,它永远忙不完。你还是直接启动任务管理器来结束它,再重新开始,所以我们做开发一定要记得时刻不停的按“control+s”,至少开发Xamarin.Android要把它当回事儿。

(三)双击axml文件后,开发环境死掉

这是Xamarin.Android插件的问题,要么你可以换一种打开方式来编写布局文件
此处输入图片的描述
此处输入图片的描述

要么你可以选择升级你的Xamarin插件

(四)出现代码不正确的执行

做Xamarin.Android开发,经常会遇到很多难以解释的现象,如果出现了类似于:

  1. bool b = false;
  2. if (b == true)
  3. {
  4. //do something...
  5. }

这样的代码,如果还是会执行do something,请自觉的把你的解决方案清理后,重启,这大多是编译器的错误,他会记录你的断点位置,以及监视变量的值,他出了问题,你最好重启吧。

三、调试及部署解决方案

(一)一个断点拦不住

经常会出现打了断点,但是调试期间却没有停下来,也无法监视变量。遇到这样的问题我们需要在连续的地方打上两个断点,两个以上(包括两个)的断点才能拦住它!如下图,要监视变量c,我们打断点需要这样打两个!切记!
此处输入图片的描述

(二)部署(发布app)

电子签名是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。通俗点说,电子签名就是通过密码技术对电子文档的电子形式的签名,并非是书面签名的数字图像化,它类似于手写签名或印章,也可以说它就是电子印章。很多杀毒软件会把其当做一个鉴别软件安全与否的首要标准。一个完善的可运行应用都要有电子签名,在android签名时需要使用keytool来签名,需要提供版本号、密钥、公司名称、所属地区等资料。在vs中省去了dos界面的命令行,只需要在发布android app的时候填写资料,点击“Next”即可!
首先我们需要把解决方案配置由Debug版本改为Release版本,再来点击菜单栏中的“工具”==>“pulish Android Application”选项

此处输入图片的描述

此处输入图片的描述

四、Android基础知识汇总

编码注意事项:
android原生开发语言为java,他们的成员以及变量命名采用Camel命名规则,而C#语言采用Pascal命名规则,因此,在看到java代码,想要转换C#代码时,请修改下大小写;另外java中没有属性这一说法,请将obj.setValue()等这类方法在转换时改为obj.Value=”xxx”;而且在java中,没有事件Event这一说,请灵活修改java中的接口。

(一)Android四大组件

Activity、Service、Broadcast Receiver以及Content Provider并称为Android四大组件。
(1)、Activity:活动
注意:
1.生命周期一定要清楚
生命周期:
onCreate ==> onStart ==> onResume ==> onPause ==> onStop ==> onDestroy

此处输入图片的描述

(2)、Service:服务

注意:
1.服务中的code默认是运行在主线程中,请新开线程来运行你的code
2.请尽量使用filter使用startService方法来启动Service
生命周期:
startService:onCreate ==> onStartCommand ==> onDestroy
bindService:onCreate ==> onBind ==> onUnbind ==> onDestroy
此处输入图片的描述

(3)、Broadcast Receive:广播

Broadcast Receive为广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,广播处理机制是系统级别的。
注册广播:(这是一个拦截系统启动完毕的注册方式)

此处输入图片的描述

在Xamarin中我们使用一下代码来实现:

  1. [BroadcastReceiver]
  2. [IntentFilter(new string[] { "com.msg.ywq" })]
  3. public class YlPadMsgReceiver : BroadcastReceiver
  4. {
  5. }

当系统启动后便会执行onReceive()方法,你要做什么,请写在这里。

(4)、Content Provider:内容提供者

Android中的Contentprovider机制可支持在多个应用中存储和读取数据。这也是跨应用共享数据的唯一方式。在android系统中,没有一个公共的内存区域,供多个应用共享存储数据。
参考地址:http://blog.csdn.net/iceo45683968/article/details/42496867

(二)Android Layout常见布局文件的使用

小窍门:很多人觉得写布局很烦,写起来太困难,属性太多,其实布局文件理解起来很简单,就把它当做在做css+div布局就行,这样理解起来会对我们写布局有很大的帮助。

常见布局:
LinearLayout:线性布局。分为水平、垂直,设置属性orientation为horizontal或vertical即可。
RelativeLayout:相对布局。几个相对布局会重叠在一起,调整它的位置可使用
layout_above:在xxx之上
layout_below:在xxx之下
layout_alignParentLeft=”true”:设置在父容器的左侧
layout_alignParentRight=”true”:设置在父容器的右侧
layout_toLeftOf:在xxx的左边
layout_toRightOf:在xxx的右边
FrameLayout:层次布局。常用来配合Fragment使用

常见布局属性:
layout_width:设置宽度
layout_height:设置高度
layout_gravity:设置该容器在父容器中的方位,属性值包括有:center、right...
gravity:容器内部文字或元素在该容器中的方位
layout_marginLeft、layout_marginRight、layout_marginTop ...... 不解释
background:背景。可设置十六进制颜色值,也可设置图片
id:设置控件元素的id,是渲染到界面后,取得该控件的方式。

(三)Android 分辨率的调整

1.使用相对屏幕像素密度单位。
2.使用android layout 布局文件做布局,灵活使用fill_parent、wrap_content等属性值,以及灵活使用layout_weight比重属性调整比例。
3.使用draw9path工具调整不规则图片的局域拉伸。
4.使用Context.Resources.DisplayMetrics.Density得到屏幕像素比例,动态调整布局。

(四)adb常用命令

adb pull -从手机中下载文件到电脑上 如:adb pull sdcard/stock.apk C:\stock.apk
adb push -从电脑中上传文件到手机上 如:adb push C:\stock.apk sdcard/
adb install -安装软件到手机上 如:adb install C:\stock.apk
adb uninstall -卸载手机上的软件 如:adb uninstall stock.apk
adb device 列出adb已绑定的android设备

五、Android设备兼容性

Android设备在国内有相当部分厂商修改了内核底层,因此做安卓有个很头疼的问题,就像web应用中常见的问题---兼容性,兼容性是个硬伤!我们开发应用,尽量使用较低版本的sdk来编译,除此之外,谨记:代码一定要规范,切不可投机取巧!为实现一个效果而牺牲了兼容性,倒不如将效果降低,保持功能的正常使用!
在android设备中,特别是国内的中兴,三星,华为等以及山寨机,经常把android内置的Google服务框架从系统内核中抽掉,这种情况下不能使用Google自带的推送。加之推送服务器为Google的服务器,国内把Google给和谐了,所以在做推送时,建议使用国内第三方推送工具。
还有一些设备厂商将手机做成了双卡双待,Android SDK中没有获取第二个卡槽信息的api,加之国内通讯运营商对sim卡所做的修改,经常在获取sim信息的时候不成功,甚至报错,这时候一定要加try!
为了将系统安装包缩小,自带的语音组件,也经常被国内厂商卸载掉,在使用语音的时候也一定要加上try!
在某些功能块调用时必须使用try,同时切记不可在catch里不做任何处理!还有一个不得不用try的原因,在java 语言的api中,常常会有以下的api,而我们在调用的时候,必须使用try,将其包起,否则编译器都无法通过!
以下代码是模拟了android api的一个方法,遇到这类api,必须使用try包起来。

  1. public void do1() throws Exception {
  2. //do something...
  3. throw new Exception("not implement");
  4. }

六、具有敢于怀疑一切的精神

没有什么特殊的,记得出了问题后,不要认为something一定是对的,没有什么是绝对的,必须怀疑一切!比如上面提到的代码不正确的执行,如果不敢怀疑,一整天都找不到问题所在!

七、具有网管的精神-重启

我们必须承认事物没有完美的,况且Xamarin还在进化阶段,有bug是很正常的,不稳定也可以理解。我之前经常遇到VS挂掉、连接模拟器失败,怎么都解决不了、代码不按照正常思维执行、VS自己闪退、视图编辑器打开失败、编译总是失败等等一些问题,经过重启环境更甚至于重启电脑后,一切正常!

作者:Andy
原文地址:http://blog.csdn.net/iceo45683968/article/details/42495413

分享到