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

原创 2015年01月07日 16:39:42

一、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开发,经常会遇到很多难以解释的现象,如果出现了类似于:
bool b = false;
if (b == true){
     //do something...
}
这样的代码,如果还是会执行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中我们使用一下代码来实现:

[BroadcastReceiver]

[IntentFilter(new string[] { "com.msg.ywq" })]

public class YlPadMsgReceiver : BroadcastReceiver
 {

}

当系统启动后便会执行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包起来。
public void do1() throws Exception {
     //do something...
     throw new Exception("not implement");
}

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

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

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

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

vs2013+Xamarin F5提示部署不错误

vs2013+Xamarin环境搭建完成后,按F5运行,提示出现部署错误,是否继续。 如果点击继续,则提示MonoDroid does not support running the p...
  • zhaoqi5705
  • zhaoqi5705
  • 2015年05月31日 22:25
  • 1770

Xamarin.Android 开机广播、开机自启动

xamarin.android 开机广播监听,开机自动启动、BroadcastReceiver
  • cdf881125
  • cdf881125
  • 2015年10月16日 14:27
  • 1548

Xamarin Android权限请求

Xamarin Android权限请求
  • u014621518
  • u014621518
  • 2017年09月12日 14:19
  • 389

Xamarin.Android如何异步更新UI线程

异步更新UI在App开发中是不可避免的一个话题 在原生App开发中有这样两种主流方式: (1) Handler消息传递机制 (2)AsyncTask异步任务 那么在Xamarin.Androi...
  • sinat_26562875
  • sinat_26562875
  • 2016年05月01日 12:43
  • 2382

xamarin android异步更新UI线程

UI线程简单了解 一些从事web开发的同学,可能对UI线程没有这个概念,没办法,毕竟“UI线程”这个概念只存在一些客户端(window客户端软件、app等)。其实android在子线程中更新UI线程,...
  • kebi007
  • kebi007
  • 2017年08月30日 23:06
  • 8003

VS2015 Xamarin- ios程序真机调试

目前VS2015还不能直接连接到苹果手机上。依然要借助苹果MAC系统和Xcode。 1、首先是要在Mac系统上用Xcode新建项目,此处的Product Name(产品命名),Organizatio...
  • eit520
  • eit520
  • 2016年04月26日 21:17
  • 6627

xamarin android 布局尺寸了解

先来问大家几个问题,1.android设备中有哪些 度量单位?2.像素的最小单位是多少?3.什么是屏幕分辨率?4.什么是独立像素密度?5.屏幕尺寸是指长和宽的物理尺寸?...
  • kebi007
  • kebi007
  • 2017年06月08日 16:52
  • 1910

xamarin.forms使用stacklayout自定义列表及相关加载状态处理。

xamarin.forms本身有提供ListView控件,个人觉得不够灵活,而且在和ScrollView嵌套使用时,会存在内外两个滚动条问题,不好处理。 我们可以用ScrollView和StackL...
  • rucilengluo
  • rucilengluo
  • 2016年11月21日 15:15
  • 885

Xamarin.Android 照相机的使用

这个板块呢,我想展示如何调用照相机,如何保存其路径,然后在我们imageView里面展示 出来 先上最终效果图(用的是Genymotion模拟器) 新键一个Layout,命名为Cam...
  • sinat_26562875
  • sinat_26562875
  • 2015年11月23日 17:56
  • 948

android程序启动画面之Splash总结

方法一: 很多应用都会有一个启动界面。欢迎画面慢慢隐现,然后慢慢消隐。实现这种效果的方法有两种(暂时只发现两种) 1、使用两个Activity,程序启动时候load第一张Activity,然后...
  • dj0379
  • dj0379
  • 2014年05月18日 15:57
  • 1658
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Xamarin.Android开发及常见问题的解决
举报原因:
原因补充:

(最多只允许输入30个字)