美文网首页编程开发
Android系列-应用程序的生命周期

Android系列-应用程序的生命周期

作者: QuietHeart | 来源:发表于2020-04-03 11:46 被阅读0次
    android.jpg

    目录

    应用程序生存周期的管理
        优先级
            Priority=1, Foreground
            Priority=2, Visible
            Priority=3, Service
            Priority=4, Background
            Priority=5, Empty
            注意
        应用程序对象
    Content provider 生存周期
    Broadcast receiver 生存周期
        对进程生存周期的影响
    Service 生存周期
        通过 Context.startService()
        通过 Context.bindService()
        对进程生存周期的影响
    Activity 生存周期
        Activity 状态
        Activity 生存周期函数
        Android对 Activity 的终止
        Activity 实例状态
            非持久状态信息
            持久化状态信息
            应用注意
    总结
    

    应用程序生存周期的管理

    在Android中,应用程序的生存周期不是由应用程序本身来控制,而是由系统决定。当先需要释放资源之时,Android系统便会终止运行的程序,或者回收Android组件(Android的四类组件: Activity, Service, Content providers BroadcastReceiver )。

    优先级

    优先级反映进程的重要性,当需要终止进程的时候,Android系统遵循如下优先级规则(值越小,越重要,越不会被kill):

    Priority=1, Foreground

    最重要的是前台进程,表示当前正在与用户交互的进程。主要有如下情况:

    1. 进程运行了一个在屏幕最前面的 Activity ,用户正与此 Activity 进行交互( AcitvityonResume 函数被调用)。
    2. 进程执行一个 BroadcastReceiverBroadcastReceiver.onReceive() 方法正在执行)。
    3. 当前在进程调用栈中,有一个 Service 正在运行(运行了 Service.onCreate(), Service.onStart(), 或 Service.onDestroy() )。

    系统中只有少数进程处于此状况,只有当系统内存少到无法运行这些进程的时候,它们才会被杀掉。这个时候一般设备正处于页面换置状态,为保持用户界面有响应,才需要杀死这些进程。

    Priority=2, Visible

    其次重要的是可见进程,意思是这时候进程有一个可见的 Activity , 但是 Activity 部分可见没在最前端,与用户并无交互( onPause() 已被调用)。

    例如: 前台进程被一个对话框挡住,但是其界面仍可见。

    这样的进程也很重要,不应该被杀死。除非到了只能保留 Foreground 进程的情况。

    Priority=3, Service

    然后是服务进程,是指进程持有一个 Service ( startService 被调用后产生),进程不可见但是仍在做有用的工作。

    例如:mp3背景音乐播放、或网络数据上传下载等。

    系统应当尽量保持这样的进程,除非内存不足以运行 前台进程和可见进程。

    Priority=4, Background

    然后是后台进程,是指进程持有一个不可见的 ActivityonStop 方法已被调用),并且没有 Service 或者正在执行的 BroadcastReceiver

    这种进程对用户体验没有什么影响(当然,前提是要保证 Activity 的生命周期控制正确),系统可以在任何时候,在需要前面更重要的三种进程回收内存之时,杀死它们。

    一般系统中这样的进程有很多,Android会将他们保存在LRU列表中,需要之时会将最少使用者终止。

    Priority=5, Empty

    最不重要的是空进程,是指没有任何活动应用组件的进程。

    保持空进程的唯一场景是,为了在下一次再次启动该应用程序的一个应用组件缓存之用,使之启动时间更短。

    因此,系统会经常杀死这些进程,以保证在这些缓存空进程和内核缓存的整体系统资源平衡。

    注意

    LRU列表

    所有在 "Empty" 列表中的进程都会被添加到一个最近最少使用列表(LRU)中,其中在其最前端的进程会在需要之时被 out-of-memory 杀掉。如果一个应用进程被用户重新启动,它将会被移动到这个队列的尾端,具有最低的优先级别。 Background的 进程也有它的 Background LRU 列表。

    LRU 如下图所示:

    lru.png

    进程重要性的分类

    系统会根据进程中所有应用组件中最重要者,来为该进程进行分类(优先级),所以应用组件会对进程优先级有很大的影响,不同组件(如: Activity, Service, BroadcastReceiver )对应用程序的生命周期都有影响,如果使用不当,会导致预料外的现象。

    例如: 一个 BroadcastReceiver 进程在 BroadcastReceiver.onReceive() 中接收 Intent 的时后启动了一个线程, 当函数( onReceive )返回的时候,系统便认为 BroadcastReceiver 进程不处于活动状态了,因此它的主进程便无存在的意义,这时候,系统可能随时都会杀死该进程,以释放资源,进而这个启动 BroadcastReceiver 的线程便被终止了。这个现象显然很可能不是我们期望的(可能接收消息之后,我们还需要那个线程运行一会),我们可以为 BroadcastReceiver 启动一个 Service , 这样系统便认为进程内始终是活动的。

    进程优先级可能因其他依赖而提升。

    例如:如果进程A有一个 Service, ServiceContext.BIND_AUTO_CREATE 标记,或者它正使用一个在进程B中的 ContentProvider, 这个时候进程B的优先级将会变得至少和进程A一样重要。

    应用程序对象

    当启动一个Android组件的时候,应用程序对象将被创建,这个对象具有如下生命周期函数。

    • onCreate() 在应用程序第一个组件启动之前被调用。

    • onLowMemory() Android系统请求应用程序清理内存的时候调用。

      一般所有 background 进程被杀掉之后,才会调用到这个函数。

    • onTrimMemory() Android系统请求应用程序清理内存之时被调用。

      一般用于当 background 进程太多的时候,对相对不重要的 background 进程进行清理。这个消息包含一个指示应用程序位置的标记。例如,常量 TRIM_MEMORY_MODERATE 指明进程在 Background LRU 列表的中间;释放内存有助于系统在列表中保持其他进程之后的运行,便于获得更好的整体性能。

    • onTerminate() 只用于测试,不会在产品中调用到(进程会被直接杀掉,执行不到包括该函数在内的代码)。

    • onConfigurationChanged() 当设备配置发生变化的时候被调用。

      配置变化之时,除 Activity 之外的其它组件不会重启, 它们自己处理配置变化的相关内容,例如重新分配资源。

    Content provider 生存周期

    一旦进入到一个 Content provider 中,那么它将不会被单独停止。由整个应用程序决定它是否停止。

    相关文章

      网友评论

        本文标题:Android系列-应用程序的生命周期

        本文链接:https://www.haomeiwen.com/subject/rmnvuhtx.html