本人从事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。

1
2
3
4
5
public void onItemClick(...) {
       Intent i = new Intent(getBaseContext(), MyActivity.class);
       i.putExtra("row", position);
       startActivity(i);
}

  在新创建的Activity(如上所示的MyActivty)中,你可以以这样方式提取之前Activity传递的数据。

1
2
3
4
5
6
7
8
9
10
11
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去触发一些东西,例如:分享页面。

1
2
3
4
5
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,例如:

1
@+id/myButton

  Android将会为这些ID自动生成一个叫做R的类(想了解更多R点击这里),你可以通过如下的方式来操作这个Button 对象。

1
Button button = (Button)findViewById(R.id.myButton);

 Tag

  为视图设置一个tag来查找信息是iOS开发者们常用的一个小技巧,例如:数组的偏移。而在Android你可以讲这个对象设置成tag,相当的有用。

1
row.setTag(data);

 UITableViewController / UITableViewDataSource / UITableViewCell

  在Android中与UITableView相对应的是ListView。

  与UITableViewDataSource大体上相对应的是ArrayAdapter:

1
2
MyAdapter adapter = new MyAdapter(this, R.layout.listview_item_row);
listView.setAdapter(adapter);

  如上的例子中,listviewitemrow是布局中的一行,大体上相当于一个UITableViewCell。

  Adapter通过getView来创建或复用不同的列。

  你还可以设置表头:

1
2
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文件夹,之后你可以像这样调用他们:

1
2
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版本号。

1
2
3
if (Build.VERSION.SDK_INT >= 11.0)  {
...
}

  你可以这样来屏蔽警告:

1
2
3
4
@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的冰山一角。谁知道呢,说不定接下来还有初探应用商店的精彩教程等着你呢。

给iOS开发者的Android开发建议的更多相关文章

  1. (转).net开发者对android开发一周的学习体会

    春节期间,相对比较闲,上班时也没什么事情做.利用这一周的时间,简单的学习了一下移动方面的开发.主要是针对android,其实我对IOS更感兴趣 (因为我用iphone),苦于暂时没有苹果电脑,只能把它 ...

  2. 面向忙碌开发者的 Android

    面向忙碌开发者的 Android passiontim 关注 2016.11.19 21:41* 字数 4013 阅读 2967评论 2喜欢 92 面向忙碌开发者的 Android 视频教程(Tuts ...

  3. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  4. Android开发环境搭建篇详尽的教程实例汇

    原文链接:http://android.eoe.cn/topic/android_sdk 一.android开发环境搭建图文教程整理篇: 1.Android开发环境搭建全程演示(jdk+eclip+a ...

  5. 最强最全干货分享:Android开发书籍、教程、工具等

    最全干货分享,本文收集整理了Android开发所需的书籍.教程.工具.资讯和周刊各种资源,它们能让你在Android开发之旅的各个阶段都受益. 入门<Learning Android(中文版)& ...

  6. Android学习总结(1)——好的 Android 开发习惯

    Android编码规范 java代码中不出现中文,最多注释中可以出现中文: 局部变量命名.静态成员变量命名:只能包含字母,单词首字母出第一个都为大写,其他字母都为小写: 常量命名:只能包含字母和 ,字 ...

  7. Android IOS WebRTC 音视频开发总结(四六)-- 从另一个角度看国内首届WebRTC大会

    文章主要从开发者角度谈国内首届WebRTC大会,支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. -------------------- ...

  8. iOS和Android开发异同点(一)

    说到移动开发,目前主流平台有谷歌的android os 系统,苹果iOS系统,和微软主打的windows Phone OS 系统,至于目前为啥移动开发中,安卓和iOS比较受欢迎,者要看三家产品的历史由 ...

  9. 《React Native 精解与实战》书籍连载「配置 iOS 与 Android 开发环境」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

随机推荐

  1. ES6精简要点

    没想到ES7都出来了(虽然并不大),想到自己ES6还没学完 现在就补补吧,记录下重点部分 Let的用法 用来声明块级变量 f1();function f1() { let n = 5; if (tru ...

  2. KNN分类算法实现手写数字识别

    需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...

  3. BZOJ5074 小B的数字 BZOJ2017年10月月赛 其他

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5074 题意概括 题解 作为蒟蒻的我第一个就选择了过的人最多的D题. 不仔细看好吓人. 然而并不难. ...

  4. Sublime Text 支持GBK , 解决中文乱码问题

    Sublime Text 是一款既简洁又强大的文本编辑器,其默认采用UTF8编码,这就造成了许多采用GBK编码的文件里的中文显示为乱码. 有一个专门解决这个问题的插件:ConvertToUTF8 要安 ...

  5. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (三)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 19 Canny 边缘检测 目标 • 了解 Canny 边缘检测的概念 • 学习函数 cv2.Canny() 1 ...

  6. java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  7. Solution for unable to create "dead-letter-exchange" in RabbitMQ

    在参考 Dead-Letter-Exchange 进行Dead-letter-exchange的理解, 在本地时,想要创建 Dead-letter-exchange 时,一直报错,错误如下: Unha ...

  8. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  9. C++ map<key , value> key值为指针

    STL中map的key能否用char *呢?当然可以! 在程序中需要用到一个map,本来是这样写的, map<string, int> mapStr; 为了追求效率,把string改成了c ...

  10. [Astar2008]Black-Whilte-Tree

    Description: 你拥有一棵有 N 个结点白色的树--所有节点都是白色的. 接下来,你需要处理 C 条指令: 1.修改指令:改变一个给定结点的颜色(白变黑,黑变白); 2.查询指令:询问从结点 ...