App的生命周期简介

按照国际惯例,编程类的书籍开篇一般会来一个"Hello world",但我却准备首先给大家介绍一下App的生命周期。当我们知道了了App生命周期的各个阶段以后,就相当于在修房子的时候,我们已经建好了房子的整体框架,剩下的就是在框架上修补完善我们的房子,而我们的App开发也是如此。讲到这里,想必大家已然了解App生命周期的重要性,下面就不要眨眼,我要开始(装逼)讲解了。

讲到生命周期,对于自然界生命来说,最关键的两个就是出生与死亡,对应到我们的App就是启动与退出。下面我们来分别看看Andriod和iOS中的App的启动与退出的流程。

App的启动和退出流程

启动流程

Andriod

  1. 用户点击应用图标或从应用列表中选择应用:当用户在安卓设备上点击应用程序的图标或从应用程序列表中选择应用时,应用程序的启动过程开始。
  2. 创建应用进程:安卓系统为该应用程序创建一个新的进程,即应用程序的主进程。每个应用程序都运行在独立的进程中,以确保应用之间的隔离性。
  3. 创建 Application 类实例:在应用程序进程中,会自动创建一个 Application 类的实例,该类是全局的,用于管理应用程序的生命周期和全局状态。在这个阶段,Application 的 onCreate() 方法会被调用。
  4. 启动主 Activity:应用程序的主 Activity 会在 Application 类创建后启动。主 Activity 是应用程序的入口点,它是应用程序用户界面的第一个可见组件。
  5. 执行主 Activity 的生命周期方法:主 Activity 的生命周期方法按照一定顺序被调用,包括 onCreate()、onStart() 和 onResume()。在这些方法中,通常进行应用程序的初始化工作,比如设置布局、初始化变量和加载数据等。
  6. 显示用户界面:在主 Activity 的生命周期方法执行完毕后,系统会根据布局文件加载用户界面,并显示在设备屏幕上供用户交互。 iOS
  7. 用户点击应用图标:当用户在iOS设备上点击应用程序的图标时,应用程序的启动过程开始。
  8. 加载应用程序:系统会将应用程序加载到内存中,并创建一个应用程序进程来运行应用。
  9. 执行 AppDelegate 类的生命周期方法:在应用程序进程中,系统会自动创建一个 AppDelegate 类的实例,该类是应用程序的委托对象,负责管理应用程序的生命周期和处理系统事件。在 AppDelegate 中,会执行一系列生命周期方法,包括 application:didFinishLaunchingWithOptions: 方法,用于进行应用程序的初始化和设置。
  10. 显示主界面:在 AppDelegate 的 didFinishLaunchingWithOptions 方法中,通常会设置应用程序的主界面,并显示在设备屏幕上供用户交互。
  11. 应用程序运行:此时,应用程序已经完全启动并进入运行状态。用户可以与应用程序进行交互,执行各种操作。
启动流程中,Andriod和iOS的区别和联系

1、2、 步骤都一样,都是点击应用图标,然后Andriod和iOS系统启动对应的App进程,当然各自启动的细节和需要的准备工作都不一样,对于App开发来讲,一般不需要关注这里的细节。

3、 步骤Andriod和iOS都"Application"对象,只不过提供给我们的对象不一样,Andriod是"Application ",而iOS是"UIApplication"。

在Andriod中

默认提供了系统自己的"Application"对象,如果你想在App启动的时候做一些事情的话,就需要创建自定义的"Application"对象,继承至"Application",然后AndroidManifest.xml配置,系统启动的时候就会加载自定义的"Application"对象,具体代码如下

ini 复制代码
public class DemoApplication extends Application {
@Override
public void onCreate() {
   super.onCreate();
   Log.d(TAG, "程序启动了哦 ");
}
}
在AndroidManifest.xml配置
<application
    android:name=".application.DemoApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme">
    <activity android:name=".DEMO.DemoThreadPoolActivity"></activity>

我们创建了一个继承自Application对象的自定义DemoApplication对象,并且重写了onCreate方法,在方法中,我们调用了父类的onCreate方法,然后打印了程序启动了哦的日志。

在iOS中

app启动跟传统的C语言类似,会有一个main函数。我们,新建一个 Swift 的 iOS app 项目后,(如果有过Objective-C的iOS开发经验,没有也不重要)我们会发现所有文件中都没有一个像 Objective-C 时那样的 main 文件,也不存在 main 函数。唯一和 main 有关系的是在默认的 AppDelegate 类的声明上方有一个 @UIApplicationMain 的标签。

不说可能您也已经猜到,这个标签做的事情就是将被标注的类作为委托,去创建一个 UIApplication 并启动整个程序。在编译的时候,编译器将寻找这个标记的类,并自动插入像 main 函数这样的模板代码。我们可以试试看把 @UIApplicationMain 去掉会怎么样:

Undefined symbols _main

在绝大多数的iOS开发需求场景,我们并不需要对这个标签做任何修改,但是当我们如果想要使用 UIApplication 的子类而不是它本身的话,我们就需要对这部分内容 "做点手脚" 了。

刚才说到,其实 Swift 的 app 也是需要 main 函数的,只不过默认情况下是 @UIApplicationMain 帮助我们自动生成了而已。和 C 系语言的 main.c 或者 main.m 文件一样,Swift 项目也可以有一个名为 main.swift 特殊的文件。在这个文件中,我们不需要定义作用域,而可以直接书写代码。这个文件中的代码将作为 main 函数来执行。比如我们在删除 @UIApplicationMain 后,在项目中添加一个 main.swift 文件,然后加上这样的代码:

objectivec 复制代码
UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))

现在编译运行,就不会再出现错误了。当然,我们还可以通过将第三个参数替换成自己的 UIApplication 子类,这样我们就可以轻易地做一些控制整个应用行为的事情了。比如将 main.swift 的内容换成:

swift 复制代码
import UIKit 
class MyApplication: UIApplication { 
    override func sendEvent(event: UIEvent!) { 
        super.sendEvent(event) print("Event sent: \(event)"); } 
    } 
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MyApplication), NSStringFromClass(AppDelegate))

我们跟安卓的方式一样,创建了一个继承自UIApplication对象的自定义MyApplication对象,并且重写了sendEvent方法,这样每次发送事件 (比如点击按钮) 时,我们都可以监听到这个事件了。但是,我们如果要做到跟安卓一样,在APP启动的时候打印日志,我们一般在UIApplicationMain函数的第四个参数指定的参数,也就是UIApplication的代理对象中实现对应功能。

swift 复制代码
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        NSLog("程序启动了哦");
        return true
    }
}

4、 步骤,Android和iOS都是各自启动自己的主界面,在安卓中一般是Activity,在iOS中是UIViewController

5、 步骤,App获得用户焦点,响应用户的各种交互

后台流程

Andriod App进入后台的流程如下:

  1. 用户按下"Home"键或使用"Recent Apps"(最近使用的应用)按钮:当用户按下设备上的"Home"键或使用"Recent Apps"按钮时,当前运行的应用程序会进入后台。Android系统会将应用程序的界面隐藏,并将其放置在后台任务列表中。
  2. onPause() 方法的调用:当应用程序进入后台时,Android系统会调用应用程序当前活动(Activity)的 onPause() 方法。在该方法中,您可以处理一些暂停活动的操作,例如保存数据或停止某些活动。
  3. onStop() 方法的调用:在 onPause() 方法调用之后,如果用户切换到其他应用程序或回到主屏幕,Android系统将调用当前活动的 onStop() 方法。在 onStop() 方法中,您可以执行一些资源释放或清理操作。
  4. 生命周期状态:应用程序进入后台后,它的生命周期状态将从"Running"(运行)或"Paused"(暂停)转换为"Stopped"(停止)状态。在"Stopped"状态下,应用程序仍然在后台存在,但它的界面不再可见,系统可能会回收一些资源以优化性能。

iOS App进入后台的流程如下:

  1. 用户按下Home键:当用户按下iOS设备上的Home键时,应用程序会进入后台运行。
  2. 执行AppDelegate类的生命周期方法:在AppDelegate类中,会执行applicationDidEnterBackground:方法,该方法允许应用程序在进入后台之前进行必要的清理和保存工作。
  3. 进入后台运行:应用程序被挂起,并继续在后台运行,直到被系统终止或用户再次激活应用程序。

请注意,不管iOS还是Andriod当应用程序处于后台运行时,系统可能会根据资源管理策略终止应用程序进程。在这种情况下,应用程序被"终止"而不是正常的退出。当用户再次启动应用程序时,将重新执行上述启动流程。因此,应用程序需要适当地处理被终止的情况,以确保数据的一致性和用户体验。

可以看到,Andriod和iOS都有App的后台状态,他们的区别是操作方式和调用的函数不同,但是从整体上看,整个流程是没有很大的区别

退出流程

Andriod App退出的流程如下:

  1. 用户点击返回键:当用户在应用程序界面按下返回键时,系统会调用当前活动(Activity)的 onPause() 和 onStop() 方法。如果当前活动是主 Activity 并且没有其他活动在栈中,则系统会调用 onDestroy() 方法,并关闭应用程序进程,从而退出应用程序。
  2. 用户通过其他方式退出:应用程序可能会提供其他退出方式,例如在界面中提供"退出"按钮。当用户通过这种方式触发退出操作时,相应的退出逻辑将被执行。通常,这包括对资源的清理和保存操作,然后关闭应用程序进程。

iOS App退出的流程如下:

  1. 长按"home"按钮(带home按钮的设备),或者从屏幕底部向上滑动并在中间暂停(没有home按钮的设备),iOS系统会显示最近使用过的App的缩略图.
  2. 找到应用程序的缩略图并向上滑动使其从屏幕顶部消失:这将关闭应用程序并从应用切换器中移除。
  3. iOS系统调用app项目的Appdelegate中的applicationWillTerminate方法。

需要注意的是,在Andriod和iOS中,当应用程序处于后台运行时,系统可能会根据资源管理策略终止应用程序进程。在这种情况下,应用程序被"终止"而不是正常的退出。

对比退出流程,和后台流程一致,Android和iOS的区别也是操作方式和回调的函数不一致,整体流程类似

全文总结

通过Android和iOS平台下App生命周期的对比,可以得出同为移动端操作系统,概念和流程确实有很多类似的地方。比如我们介绍了 Application和UIApplication,启动流程,后台流程,退出流程等等,都呈现了高度的类似,所以Android和iOS一起学确实能够类比学习,达到事半功倍的效果哦

相关推荐
大白要努力!7 分钟前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
天空中的野鸟1 小时前
Android音频采集
android·音视频
小白也想学C2 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程2 小时前
初级数据结构——树
android·java·数据结构
闲暇部落4 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
程序猿看视界5 小时前
如何在 UniApp 中实现 iOS 版本更新检测
ios·uniapp·版本更新
诸神黄昏EX6 小时前
Android 分区相关介绍
android
大白要努力!7 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee7 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood8 小时前
Perfetto学习大全
android·性能优化·perfetto