Android与iOS开发比较--实战篇

5. 工程文件结构

自行打开项目工程查看...

6. 界面绘制

6.1 独立界面

Android的Activity和iOS的UIViewController,是差不多的概念,都是界面的控制器,可以在其中添加View,处理触屏事件。

特性 Activity UIViewController
生命周期 onCreate
onStart
onResume
运行态
onPause
onStop
onDestroy
viewDidLoad
viewWillAppear
viewDidAppear
运行态
viewWillDisAppear
viewDidDisAppear
viewDidUnload
栈管理 Activity启动模式(使用简单):
standard,singleTop,singleTask,singleInstance
UINavigationController
使用灵活

6.2 layout.xml vs storyborad & xib

Android主要使用xml文件来配置界面布局,灵活方便,提供5种布局方式:
FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout、AbsoluteLayou。

还可以通过代码动态修改布局。
也支持可视化的界面编辑,但很少用。

iOS一般通过代码来实现界面,其第3方库masonry提供了约束布局方案,和Android的ConstraintLayout非常相似。

也提供了可视化的界面编辑stroryboard和xib,但非常容易导致代码冲突,一般不用,除非单人项目。

6.4 分辨率适配

Android屏幕尺寸众多,适配略有麻烦。一般是用10801092的标注图,像素值/3density。有时个别机器需要单独适配。

iOS机型少,适配比较简单。尺寸是以宽度为基准,根据标注图的尺寸来做等比缩放。而间距则是根据以下公式来计算:

// 转换像素
#define RELAXW(x) (((x) / 1.5 * (ScreenWidth / 375.0)) / 2.0)
#define RELAXH(x) (((x) / 1.5 * (ScreenHeight / 667.0)) / 2.0)

6.5 动画

  • Android动画有3种:View动画、属性动画和帧动画。可以xml配置,也可以代码配置,或者混编。
  • iOS动画,有UIKit动画和Core Animation。

7. 数据存储与传递

7.1 key-value简单存储

Android的SharePreferrences和iOS的UserDefault,都提供了key-value式的简单存储。

其中前者的加载机制是一次性加载整个文件到内存,所以单文件不要存太多数据,并且value不适合存储JSON。

另外,iOS的keyChain,也是key-value存储,其中的数据在app卸载后仍然保留,通常用于存储密码和重要信息。

7.2 数据库

  • Android和iOS都支持sqlite数据库。
  • Android有room、realm、greenDao等sqlite开源库。
  • iOS有FMDB、realm、WCDB、LKDBHelper等sqlite开源库。

7.3 文件存储

Andoird的文件可以存内置存储,也可以存sd卡,并且sd卡数据分了私有目录和公共目录两种。公共需要权限,通常用于应用间通信。

iOS的文件都存沙盒。

7.4 对象序列化

Android有两种序列化方式:Java原生的Serializable和Android特有的Parcelable。

特性 Serializable Parcelable
易用性 简单,创建版本号即可 复杂,要实现4个方法
效率 低(使用反射多,产生临时变量多)
应用场景 文件缓存、网络传输 Intent

iOS序列化方式有NSArchiver、NSPropertyListSerialization(支持NSData、NSDate、NSNumber、NSString、NSArray、NSDictionary)等。

7.5 应用间数据共享

方式 Android iOS
网络 Yes Yes
剪切板 Yes yes
Content Provider Yes No
Service Yes No
本地socket Yes ?
URL Scheme ? Yes
CoreCFMessagePort No Yes
CFNotificationCenter No Yes

8. 线程与同步

8.1 主线程与Looper(runloop)

  • Android的主线程会默认启动一个Looper,Looper自带一个消息队列,其启动后会循环“等待消息->处理消息”。所有投递到消息队列的消息,都会在Looper所在的线程里依次同步执行。
  • 其它子线程,也可以通过以下代码来启动一个Looper:
    Looper.prepare();
    Looper.loop();

iOS的主线程会默认启动runLoop,其功能和Android的Looper是类似的。

8.2 线程构建

Android子线程实现方式有:
Thread、 ExecutorServie线程池、handler、asyncTask、HandlerThread。

iOS子线程实现方式有:
NSThread、gcd、NSOperation。其中gcd提供了同步异步、串行并行的封装,可以很简单的使用。

8.3 线程同步

Android的线程同步方式主要是Object的wait、notify方法。

    final Object obj = new Object();
    new Thread(){
        @Override
        public void run() {
           //业务处理1
            synchronized (obj) {
                try {
                    obj.notifyAll();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
    synchronized (obj) {
        try {
            obj.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    //业务处理2

iOS的NSCondition也提供了一样的功能,用法也很类似,比如调用前要加锁。

        __block NSCondition *condition = [[NSCondition alloc] init];
NSLog(@"111111 currentThread:%@", [NSThread currentThread]);
dispatch_queue_t serialQueue = dispatch_queue_create("Dan-serial",
              DISPATCH_QUEUE_CONCURRENT);


    dispatch_async(serialQueue, ^{
        [NSThread sleepForTimeInterval:0.5];
        //处理业务1
        NSLog(@"222222 currentThread:%@", [NSThread currentThread]);
        [condition lock];
        [condition signal];
        [condition unlock];
    });

[condition lock];
[condition wait];
[condition unlock];
//处理业务2
NSLog(@"333333");

8.4 多线程数据安全

都支持synchronized同步代码块、Locker、信号量semaphore等。

iOS有个gcd的方法dispatch_once,可以做到代码只执行一次,通常用于单例实现。

Android的单例:

 private static ActivityMgr sInstance;
 public static ActivityMgr getInstance() {
    if (sInstance == null) {
        synchronized (ActivityMgr.class) {
            if (sInstance == null) {
                sInstance = new ActivityMgr();
            }
        }
    }
    return sInstance;
}

iOS的单例:

+ (instancetype)sharedInstance {
   static id _sharedInstance = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      _sharedInstance = [[self alloc] init];
   });

   return _sharedInstance;  
 }

8.4 线程池

  • Android的线程池ExecutorServie可以灵活设置线程并发数和线程队列。
  • iOS的gcd提供了简单的多线程调用方式,而NSOperation则可以灵活设置线程并发数等。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容