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

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

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

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

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

 

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等移动设备都支持轮询。当然也会有人反驳说:移动设备的资源有限,所以才选择用轮询。如果硬要这么反驳,那么在追求效率和利用率的今天,这些工作就没有意义了!

 

更多相关文章

  1. 【专访】爱图腾高级架构师 李鹏军:手机音频接口具有无限的应用潜
  2. Android(安卓)studio 3.6 NDK开发 基本流程入门了解
  3. 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!
  4. Android开发实践:WIFI连接功能的封装
  5. android第一周总结——但愿这次可以发出来,不要再被自己的手机阻
  6. Symbian学习笔记(8):再尝试着做一个数独游戏
  7. 一周一本技术书(第四周)《Android谷歌官方Training》
  8. Android菜鸟App开发,第一个App(第一天)
  9. MonoDroid学习笔记(一)—— 搭建MonoDroid开发环境及Hello World

随机推荐

  1. 关于对mysql语句进行监控的方法详解
  2. OEL7.6源码安装MYSQL5.7的教程
  3. Mysql优化技巧之Limit查询的优化分析
  4. 通过sysbench工具实现MySQL数据库的性能
  5. 浅析mysql迁移到clickhouse的5种方法
  6. Mysql自连接查询实例详解
  7. MySQL查询条件中in会用到索引吗
  8. mysql(5.6及以下)解析json的方法实例详解
  9. Mysql主从复制作用和工作原理详解
  10. Mysql时间轴数据 获取同一天数据的前三条