技术门诊是51CTO社区品牌栏目,每周邀请一位客座专家,为广大技术网友解答疑问。从热门技术到前沿知识,从技术答疑到职业规划。每期一个主题,站在最新最热的技术前沿为你引航!

 本期特邀资深C、C#、Android技术专家、畅销书作者薛小龙老师以及资深Android、塞班技术专家朱桂英老师针对Android应用开发问题给予解答,欢迎网友积极提问,与专家一起讨论!

查看本期门诊精彩实录:http://doctor.51cto.com/develop-269.html

参与最新技术门诊: 云时代,让端到端的应用畅通无阻

精选本期网友提问与专家解答,以供网友学习参考。

 

【255期门诊集锦】一起步入Android应用开发的神奇世界_第1张图片

Q:

老师您好,

        问一个android方面的问题,就是在android里面有什么方式可以让系统马上释放被finish()掉的资源吗?比如activity

还有就是在activity之间使用Intent进行传递值的时候,比如说从activityAactivityB,由于activityA需要接受activityB的返回值,可以使用startActivityForResult来跳转到activityB,然后等activityB执行完以后,在activityA中执行回调方法接受activityB返回的值,但是现在就有能有一种情况,假如说在activityB执行的时候,由于系统资源紧张,activityA被回收掉了,那当B执行完的时候,还会不会返回到activityA,如果返回到了activityA,那这个activityA是栈里面的还是重新生成的一个,如果是重新生成的,那activityA上面的一些参数怎么得到的或者说就是丢了的.....谢谢老师解答

A:

第一个问题是释放资源的问题,是当前android程序员多次面对的问题。我们知道每次使用过的对象,如果现在不用了,但是别的对象还继续持有它,那么这个对象就是垃圾,而且回收不掉。一般一个对象持有另一个对象,如果以后程序不用了,我们应该将其设置为null,这样垃圾收购器就能回收掉。

你的第二个问题有很多学生问过我,很具有代表性。安卓是一个神奇的系统,他会出于回收内存的考虑关闭一个Activity。但是对于我们用户来说,会期望当他再次回到那个Activity的时候,它仍保持着上次离开时的样子。为了获取Activity被杀死前的状态,我们应该为Activity实现方法onSaveInstanceState()。这样Android会在Activity有可能被销毁之前(即onPause()调用之前)调用此方法,它会将一个以“名称-值对”的方式记录了Activity动态状态的Bundle对象传递给该方法。这样当Activity再次启动时,这个Bundle会传递给onRestoreInstanceState(),所以它们两个都可以恢复捕获的状态。

 

Q:

老师好,我01年计算机专业毕业。有稳定工作。爱好编程,业余时间做asp.net方面的web应用开发多年。asp.net c#   sql 等相关技术 的应用和面向对象开发的实现原理以及前端开发技术css div js jquery很熟悉。喜欢研究用户界面ui的设计。 对uml 设计模式 等等理论也有所涉及,并在逐步学习和了解。 不断融合实践到我的设计中来。近几年,随着社会发展,我不断感觉,未来必然是移动应用的天下,更能丰富和改变人们的生活。所以很想学习Android平台移动应用的开发,并把它和web应用融合起来。我个人认为java c#原理上有共通之处。但我没有具体学习过java 所以我想知道学习android开发,对我这种情况而言,难度有多大。该如何开始,大致什么步骤。请各位老师指点。谢谢!

A:

通过你的简单描述,可以知道你的强项是Web开发,并且精通前端技术。其实你不必急于想从事于安卓开发的工作,想着去学习Java。其实你可以重点学习安卓的前端-本地技术,努力的掌握在安卓开发Web技术。这是当前的一大热点,需要HTML 5css div js jquer等技术的支持,正好很适合你。

至于Java,你可以稍稍放后,编程并不是学得越多越好,而是精通最重要。

 

Q:

老师你好:

        在学校一直想做开发,可进入社会,作为一名网络管理人员已经3年了,能搭建Linux一些服务,C有些皮毛,玩过一段时间的51单片机(仅能做些数码管等类的小实验),如果我这种情况转开发有必要吗?如果转开发,是首选Android还是应用或是网站,以哪种语言为切入点,又如何找相关的开发工作。我想这一系列的问题,可能代表了很多人的心声吧。

A:

这得看你的基础,从你的描述看,掌握一些Linux、单片机、C的知识,但是从你的描述看,都只是皮毛。要想转型做开发,你所提出的两条路:

1android:如果做应用方面,需要先学习Java,然后学习android的知识;如果做底层开发,需要学习LinuxC等方面的知识。整个学习过程有一点漫长,需要付出较多的汗水,但是就业前景好。

2)网站开发:这方面相对来说上手较容易,ASP.NETPHPJava Web都可以选择,并且前两者只需几个月的时间便可有成就。这方面的工作社会需求大,同样竞争也激烈。

 

Q:

刚刚提了个定制的问题,现在还有一个问题就是本地appweb app的应用如何更好地结合?web app我看网络上有很多都是用一些js的移动开发框架,看着那么多的框架,选择起来感觉有点儿费事。html5的推出,会不会更好地的定制我们所需要的功能。如何更好更加快速的进入web app的开发当中呢?

A:

本地app的优势是强大设备的处理能力,这样开发出功能更加强大的应用。web app的优势是一个巨大的平台,有着无与伦比的普及性。由此可见,要想实现两者的更好结合,就需要通过一个中间媒介来将两者串联起来,这样可以做到在本地实现和外界的接轨,在web端调用本地的强大功能。在这一方面,js是最佳选择。正是因为这样,所以现实中存在了很多js的移动开发框架,这说明这些框架把握住了现实需求。

HTML 的推出,确实在web端更加强大了,至于能否强大到可以舍弃本地端 ,我想是不大可能。建议你当前的任务的是,多了解HTML 5的新功能,并利用HTML 5开发出更加强大的功能。并学习知名的js移动框架,做到熟练运用,这样即可在web app中做到游刃有余。

 

Q:

专家您好,我从事J2EE开发3年了。近期想转Android开发自己的工具类应用(SNS),我有几个困惑:我需要从哪儿入手快速开始?怎样应对Andriod频繁的版本升级?有什么好的参考书推荐(编码驱动的)?谢谢!

A:

你好,因为你已经有相关开发经验了。所以建议你掌握基本的Android知识后,先从源码分析开始,了解每一个Android控件是怎么样实现的。其实每一个控件就是一个谷歌程序员们编写的类,分析高手们的源码对你的SNS有很大的高出。

版本升级你无需考虑太多,谷歌的每一次大的升级,都是针对一整个框架而言的。而除了这些变化的框架之外,其他的细节没有什么变化。从目前情况来看,谷歌定期一年有一个相对比较大的变动,没有刚发布时那么频繁了。

编码驱动的书籍相对来说比较少,建议参阅电子工业出版社的新书《Android底层开发技术实战详解:内核、移植和驱动 》,希望会对你有所帮助。

 

Q:

老师您好,再次麻烦您了。以前,不知道通过USB 数据线怎么实现android手机和电脑之间互相读取数据传输文件的?以前查资料说是通过USB HOST编程实现的,是什么串口编程,在android3.0版本以后,手机上以及支持android主从机模式,也查了一些资料,研究了一个多星期,没有结果。不知道您能不能解释一下,是什么原理或者单纯的数据线连接电脑时,怎么实现读取到手机数据的?

还有一个问题,我想做一个网站的客户端的话,该怎么做?就比如51CTO的博文,我就只是想把博文这一个版块在自己的客户端显示出来,大概是要用到JSON解析网页,然后自己封装展示,请问一下,怎么解析?要每一篇都解析吗?思路不太清晰,请老师指点一下。

A:

Android支通过两种模式来支持Android USB外设 (实现了Android 外设协议的硬件):
(1)USB 外设模式:外部USB 硬件(装有Android的设备要连接的外部设备)充当USB 主机,例如机器人、扩展插座、诊断和音乐设备、电子报亭、读卡器等。

(2)USB主机模式:装有Android 的设备扮演着主机的角色,例如数码像机,键盘,鼠标和游戏手柄。
USB驱动连接的知识你可以阅读AndroidUSB驱动程序源码,源码路径是/kernel/drivers/usb/gadget/,在这目录下,保存了USB驱动文件的实现C文件。Android USB驱动是实现过程是连接并读取复合设备、cdrom/u盘设备、网络设备和adb驱动的过程,在gadget目录下的文件很好的说明了这一点。

 

Q:

老师,您好,我是一名在校的学生,接触android也大概有一年时间了,但是总感觉对android的掌握程度还很小,一直在做android应用开发,也都是一些比较小的应用,想在做应用的基础上,试试往android的底层和网络方面延伸呢,我是一个对学习尤其是没接触过的东西很有兴趣的人,在此想问问老师能不能给点意见;还有就是,当学完java课程的时候,我还是想再自己看看相关的知识点呢,毕竟在android的开发中,java语言还是比较重要的,也希望两位老师在jav深入学习这方面能够给我一些宝贵意见或者建议,学生感激不尽。谢谢两位老师!

A:

首先肯定你喜欢钻研的品格,值得鼓励。android应用开发比较容易上手,既然你已经有一定基础了,建议你继续深入下去,做到学一门,精通一门。在此基础上,可以进一步向网络方面发展。Java对于android非常重要,建议你继续了解一些虚拟机、多线程和Socket等方面的知识,因为这些知识对于android来说非常重要。

底层和应用是两个独立的领域,需要具备linuxC等方面的知识。毕竟我们的精力是有限的,建议底层作为的第二目标,等经过android应用知识后再掌握这方面的知识也不迟啊。

 

Q:

老师您好,

有机会向您请教真是荣幸,我知道有很多库可以实现即时通信,但是对于原理方面了解不多,也不曾深入了解过,想趁这个机会问一下。两个局域网通过互联网相互通信,靠的是tcp/ip但是,

1、两台终端是怎样通过socket进行绑定的呢?

2、我知道局域网和互联网通信可能用到nat,难道这些协议也是通过nat找端口?是怎么实现的?在有就是服务器在这个时候是起的什么样的作用呢?

3、一台终端能够即时的获得消息,是从另一台终端获得的消息吗?还是通过服务器转发?这台终端是否一直占用着socket一个端口?难道是一直在轮询?

因为对这一块很感兴趣,请不吝赐教

A:

第一个问题就不回答了,因为十分简单,只是一个使用socket实现连接、交互和关闭这三个阶段的过程。

第二个问题:NAT只是一个中间媒介,起一个翻译的作用,翻译的对象是外部因特网网的地址,因为在使用时已经有了外部地址,所以不需要查找端口操作。如果为了追求系统的可扩展性和稳定性,则需要添加找端口机制,但是此时最好对应添加服务器代理,因为这样做的效率会更高。由此可见,这个时候服务器的作用就是处理翻译寻址工作,做一些存储工作。

第三个问题:当然可以从另一台终端获得的消息,但是这样会占用更多资源,所以最合理做法是服务器转发。在一个端口只能用一种方式,例如只能用轮询。一只占用是不好的做法,现在硬件设备都支持轮询,因为这样会更加节约资源,甚至andoridios等移动设备都支持轮询。当然也会有人反驳说:移动设备的资源有限,所以才选择用轮询。如果硬要这么反驳,那么在追求效率和利用率的今天,这些工作就没有意义了!