给 iOS 开发者的 Android 开发建议
本人从事iOS应用开发已经5年有余,直到现在还总是刻意回避Andriod应用的开发。但是不管你信不信,安卓开发还是很有意思的,从iOS转向Android应用开发的跨度并没有你想象的那么大。
现在我把在开发7分钟训练这款Android应用中所学到的一些东西与大家分享,希望能对你们有所帮助。需要指出的是,我稍后所比较的每个项目并不是完全匹配的,并且这篇文章并不是一个完整的Android应用开发概述,但是它包涵了我从开发这个简单应用所学到的点点滴滴。
开发环境
开发环境我选择了Android Studio,我打赌当正式版发布以后,它将成为Android应用的标准开发环境。虽然有很多关于Android Studio 不稳定的言论,但是我只遇到了一次程序崩溃,个人认为Android Studio稳定性尚可,也许是已经适应了Xcode的习惯性程序崩溃吧。
Java
说说你对Java了解多少,说白了它只是另外一门编程语言。像其他语言一样,协助你利用计算机实现你的想法,如果你是个经验丰富的程序员,你将会把更多的精力投入到应用的架构,而不是Java语言本身。谢天谢地,我们并不需要学习J2EE。
模拟器
在使用Android 模拟器之前,我习惯性的认为iOS的模拟器糟糕透了,现在看来iOS的模拟器还是很给力的。能不用Android模拟器就尽量别用,直接上真机调试;要不然你就准备好把大把时间花在无谓的等待上吧。
Storyboard / NIBS
对于storybaord的使用,在我之前iOS开发的文章中已经有所阐述,在是否使用Storyboard这个问题上,之后还收到了持不同看法的读者措辞强烈的来信,今天对此我们不予讨论。
Android 使用xml来编写布局。不同布局彼此是完全独立的。Android Studio同时也提供了一个非常好的WYS|WYG编辑器:
你也可以深入原始xml文件进行编辑(我自己经常这么做)。
各种布局容器可以被用来当做自动布局的替代方案,比如 Relative Layout, Framelayout 等等。选中布局后,你可以对布局的宽度,高度,填充,留白,比重等属性进行像素(dp 设备像素)级的设定,或者直接将它们设置为match parent, wrapcontent。
Wrap-content 对于文本来说是个很好的选择,它会自动根据文本来决定视图的尺寸。
虽然我还没有习惯使用fragments,但似乎确实是一个不错的自定义界面的复用的方式。
UIViewController
Android中等同于iOS UiViewController的是一个叫Activity的组件。你所看到的每个视图和窗口都是一个Activity。在Activity中,你做的最多的就是把数据和UI绑定,处理各种事件等等。
Transitioning Controllers / Views
在iOS中我们使用segues、 pushViewController、 presentController 进行不同视图间的切换。在Android中,我们则用一个叫Intent的组件。
你可以轻松地使用intent去创建一个新的Activity,甚至是传递一些数据给新创建的Activity。
public void onItemClick(...) { Intent i = new Intent(getBaseContext(), MyActivity.class); i.putExtra("row", position); startActivity(i); }
在新创建的Activity(如上所示的MyActivty)中,你可以以这样方式提取之前Activity传递的数据。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mine); Bundle extras = getIntent().getExtras(); if (extras != null) { int row = extras.getInt("row"); .... } ... }
你也可以使用Intent去触发一些东西,例如:分享页面。
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "Share This"); sendIntent.setType("text/plain"); startActivity(sendIntent); IBOutlet
如果你像我一样至少有一半时间会忘记连接IBOutlets,Android将是你的福音。
Android中每一个视图/组件都有一个唯一的ID,例如:
@+id/myButton
Android将会为这些ID自动生成一个叫做R的类(想了解更多R点击这里),你可以通过如下的方式来操作这个Button 对象。
Button button = (Button)findViewById(R.id.myButton); Tag
为视图设置一个tag来查找信息是iOS开发者们常用的一个小技巧,例如:数组的偏移。而在Android你可以讲这个对象设置成tag,相当的有用。
row.setTag(data); UITableViewController / UITableViewDataSource / UITableViewCell
在Android中与UITableView相对应的是ListView。
与UITableViewDataSource大体上相对应的是ArrayAdapter:
MyAdapter adapter = new MyAdapter(this, R.layout.listview_item_row); listView.setAdapter(adapter);
如上的例子中,listviewitemrow是布局中的一行,大体上相当于一个UITableViewCell。
Adapter通过getView来创建或复用不同的列。
你还可以设置表头:
View header = getLayoutInflater().inflate(R.layout.listview_header_row, null); listView.addHeaderView(header);
网上有大把相关的好教程,例如这个。
Images / Resources
自从Asset Catalogues在iOS出现后,对于图片的处理就轻松了很多,而且只需要应付retina和非retina屏幕即可(除非你还有专门为iPad使用的图片)。
为了适应不同Android设备的分辨率,你需要提供四套不同尺寸的图片。
它们分别是:mdpi (中等质量)、hdpi (高质量)、 xhdpi (超高质量), xxhdpi (宇宙无敌高质量)。个人很期待xxhdpi画质的出现。
当你在Android Studio里创建工程的时候,它会为你所提供的应用图标自动生成四种不同尺寸的图标。这可把设计师们吓的心肝儿发颤了吧,别担心,稍后它们还是可以被完美的图标所替换的。
所以,基本的理念就是对应不同的屏幕分辨率创建不同的图片,并用与之相对应的屏幕分辨率的名字命名后,放入正确的文件夹中,之后的事情就交给Android去处理吧。
自定义字体
自定义字体在Android中也相当容易实现:拷贝字体到main/assets文件夹,之后你可以像这样调用他们:
Typeface font = Typeface.createFromAsset(getAssets(), "Lato-Regular.ttf"); textView.setTypeface(font);
这种方法并不是在所有设备上都可行,最好还是加上try/catch方法来处理异常,即是在我的两台Android设备上从来没有出现过异常。
NSLog
看来Log 似乎是Android给我们提供的解决方案,你指定log的类型:debug ,verbose等等。当然,Java最基本的打印语句System.out.println(..) 也是行得通的。
向下兼容性
我们常听说Android碎片化。对于这个问题在Android中的解决技巧,跟我们在使用iOS新特性又要兼顾老版本时所采用的技巧基本上差不多。 你也许需要更频繁,更长久的使用这些技巧。
Android中有一个非常有用的常量供你查询当前的Android的API版本号。
if (Build.VERSION.SDK_INT >= 11.0) { ... }
你可以这样来屏蔽警告:
@SuppressLint({"NewApi", "LocalSuppress"}) private void myFunction() { ... }
令人诧异的东西
计时器
我对Android内建了计时器这样的功能感到非常兴奋,它正是我开发7分钟训练所需要的。可是它不发送在计时结束前的最后一次信号,就是这样一个令人诧异的bug,仍旧没有得到修复。恼火,太恼火了!
屏幕方向
当用户旋转屏幕的时候,activity被完全重置,这意味着你需要保存所有activity重置前的状态,并在activity继续后重新还原这些状态。这可能会让你感到有点诧异,因为在iOS中旋转屏幕,你不需要做任何处理,一切照旧。
Kindle Fire / Amazon Store
在亚马逊商店发布应用相当简单,我只想说两点:
- YouTube的SDK将会停止工作,因为需要Youtube 应用的支持,而YouTube应用在此是不可用的,但似乎它们是支持Flash的。
- 为了亚马逊商店,你需要清除源代码里的内购代码。
你可以通过使用android.os.Build.MANUFACTURER 和 android.os.Build.MODEL. 来查询设备的制造商和型号。
在此列出一份kindle fire型号详细资料清单。
下一步?
希望未来我能给7分钟训练这个应用添加更多的功能,并且开发更多的Android应用。我相信我只看到了Android的冰山一角。谁知道呢,说不定接下来还有初探应用商店的精彩教程等着你呢。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 7.0 重磅新功能:原生支持压力屏
虽说之前谷歌发布了安卓7.0的预览版,但它仅仅加入了分屏多任务等小功能,真正的看点还是留到I/0大会上。 5S催生了Touch ID指纹识别的普及,而到了iPhone 6S,苹果带来的3D Touch,也引来众多竞争对手的效仿,特别是安卓阵营,但他们存在一个致命问题。 简单来说就是,虽说目前有安卓手机支持压力屏功能,但也只是个别行为,因为系统底层并不支持这个所谓的压敏技术,这意味着推出压力屏的厂商需要为这个系列的设备量身定制相应的压力应用才能使用,非常麻烦。 之前曾有消息称,Android 7.0在本月重新亮相时,将迎来这项重磅新功能,但现在事情有变。外媒给出的报道强调,谷歌内部已经推迟了新系统支持压敏技术的计划。 知情人士爆料,这项功能绝不会是Android N的首发功能,其会在以后升级时添加进去。 文章转载自 开源中国社区[http://www.oschina.net]
- 下一篇
报告称微软计划本周进行史上最大规模裁员
苹果 iPhone 和 iPad 获得成功后,微软一直没能推出真正成功的移动产品。根据彭博社报告,匿名消息人士表示,微软可能本周宣布史上最大规模的裁员。微软曾经在2009年裁员 5800人,本周的裁员可能将超过这个数字。微软这次裁员是为了减少微软移动部门和诺基亚手机部门的人员重复。微软去年花费72亿美元收购诺基亚。 收购诺基亚后,微软需要为诺基亚公司3万名员工支付薪水,这也导致微软公司的雇员人数在6月初达到了13万人。微软在移动设备市场一直尝试反击苹果 iPhone 和 iPad,在 iPhone 和 Android 推出之前,微软在智能手机市场一直有很高的份额。目前,低端 Windows PC 销量也深受 iPad 成功影响。 微软前任 CEO 鲍尔默一直被市场分析人士批评,分析师认为鲍尔默没有能够快速适应移动市场。 Satya Nadella 今年2月正式成为微软新任 CEO。今年3月,微软终于为 iPad 带来了 Office 办公套件,不过距离 iPad 发布已经过去4年了。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址