iOS和Android对比系列(一):生命周期

2018-09-13  本文已影响49人  oceanfive

iOS UIViewControllerAndroid Activity 生命周期对比

iOS UIViewController Android Activity 描述
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 初始化
- (instancetype)init 初始化
- (void)loadView; 加载view
- (void)viewDidLoad; onCreate() view加载完成
- (void)viewWillAppear:(BOOL)animated; onStart() view将要显示
- (void)viewDidAppear:(BOOL)animated; onResume() view已经显示了
- (void)viewWillDisappear:(BOOL)animated; onPause() view将要消失
- (void)viewDidDisappear:(BOOL)animated; onStop() view已经消失
- (void)dealloc onDestroy() 销毁

iOSAndroid大体上的逻辑是相同的,细微上会有一些差别;

iOS UIViewController

打印如下:

-[MyViewController initWithNibName:bundle:]
-[MyViewController init]
-[MyViewController loadView]
-[MyViewController viewDidLoad]
-[MyViewController viewWillAppear:]
-[MyViewController viewDidAppear:]
-[MyViewController viewWillDisappear:]
-[MyViewController viewDidDisappear:]
-[MyViewController dealloc]

present方式

下面演示了从源控制器 OneViewController present 到目标控制器 MyViewController ,再dismiss返回 OneViewController的过程

OneViewController 加载完成显示顺序:

-[OneViewController initWithNibName:bundle:]
-[OneViewController init]
-[OneViewController loadView]
-[OneViewController viewDidLoad]
-[OneViewController viewWillAppear:]
-[OneViewController viewDidAppear:]

OneViewController 通过 present 方式到 MyViewController 过程如下:

-[MyViewController initWithNibName:bundle:]
-[MyViewController init]
-[MyViewController loadView]
-[MyViewController viewDidLoad]
-[OneViewController viewWillDisappear:]
-[MyViewController viewWillAppear:]
-[MyViewController viewDidAppear:]
-[OneViewController viewDidDisappear:]

可以看到需要等到目标控制器完成 viewDidLoad 方法(即加载 view 完成),源控制器才会 Disappear,目标控制器 Appear

目标控制器 dismiss 过程如下,即从目标控制器返回到源控制器:

-[MyViewController viewWillDisappear:]
-[OneViewController viewWillAppear:]
-[OneViewController viewDidAppear:]
-[MyViewController viewDidDisappear:]
-[MyViewController dealloc]

可以看到,目标控制器 WillDisappear ,等到源控制器 viewDidAppear 了,目标控制器才会真正的 DidDisappear 和销毁 dealloc

小结

-[A viewWillDisappear:]
-[B viewWillAppear:]
-[B viewDidAppear:]
-[A viewDidDisappear:]
-[A dealloc]

navigation方式

下面演示了从源控制器 OneViewController 到目标控制器 MyViewController ,再返回 ViewController的过程

OneViewController控制器加载顺序: 和 present方式相同

-[OneViewController initWithNibName:bundle:]
-[OneViewController init]
-[OneViewController loadView]
-[OneViewController viewDidLoad]
-[OneViewController viewWillAppear:]
-[OneViewController viewDidAppear:]

OneViewController pushMyViewController

-[MyViewController initWithNibName:bundle:]
-[MyViewController init]
-[MyViewController loadView]
-[MyViewController viewDidLoad]
-[OneViewController viewWillDisappear:]
-[MyViewController viewWillAppear:]
-[OneViewController viewDidDisappear:]
-[MyViewController viewDidAppear:]

MyViewController popOneViewController

-[MyViewController viewWillDisappear:]
-[OneViewController viewWillAppear:]
-[MyViewController viewDidDisappear:]
-[OneViewController viewDidAppear:]
-[MyViewController dealloc]

对比:

UIViewController生命周期对比.png

总结:

1、需要一个控制器 viewWillDisappear 作为信号,另外一个控制器开会开始处理;
2、控制器A到控制器B

  • present/dismiss方式,需要 B viewDidAppear,然后A viewDidDisappear
  • push/pop方式,需要 A viewDidDisappear,然后 B viewDidAppear

Android Activity

参考官方图示

[图片上传失败...(image-6cfcaf-1536829354686)]

activity 基本的四种状态

下面为一开始进入MainActivity,跳转到 LoginActivity,又返回到 MainActivity

// 1、MainActivity 创建
E/MainActivity: onCreate -- 
E/MainActivity: onStart -- 
E/MainActivity: onResume -- 

// 2、MainActivity 跳转到 LoginActivity
E/MainActivity: onPause -- 
E/LoginActivity: onCreate -- 
E/LoginActivity: onStart -- 
E/LoginActivity: onResume -- 
E/MainActivity: onStop -- 

// 3、LoginActivity 返回到 MainActivity
E/LoginActivity: onPause -- 
E/MainActivity: onRestart --
E/MainActivity: onStart -- 
E/MainActivity: onResume -- 
E/LoginActivity: onStop -- 
E/LoginActivity: onDestroy -- 

小结


页面A 跳转到 页面B

页面B 跳转到 页面A类似

Android类似iOSpresent方式跳转页面: 都是目标控制器已经显示了,源控制器才会已经消失了;


AndroidiOS多了一个onRestart()方法,即重新启动

上一篇下一篇

猜你喜欢

热点阅读