深入学习Activity

作者: MrHorse1992 | 来源:发表于2018-03-26 22:56 被阅读387次

    前言

    Activty是安卓四大组件中最为常用的组件,通常也是安卓开发者最先接触的安卓组件。安卓开发的工作也主要是围绕Activity展开的。因此掌握Activity就显得尤为重要。
    对于学习最好是带着问题去研究分析,通过一步步解答疑问可以加深理解。

    对于本文要解答的问题主要有以下几个:

    1. 什么是Activty,Activty的作用是什么?
    2. Activity的生存状态是怎样的?
    3. Activity的生命周期是怎样的?
    4. Activity的启动模式有哪几种,各有什么特点?

    什么是Activity?

    Activity 对于用户而言就是手机屏幕大小的一块展示数据的界面,这个界面可以接受用户的点击滑动长按等操作,并且对不同的操作做出相应的响应。

    Activity对于开发者而言是最常使用的组件。Activity是程序开发者与用户之间沟通的桥梁,想成为一名优秀安卓开发人员就必不可少的要深入的了解Activity。

    Activity状态

    Activity也是一步步创建出来的,那么开发者怎么才能将自己设计的界面展示给用户呢?Activity是什么时候被创建,又是什么时候被系统回收的呢?这个问题就是Activity的生命周期问题。
    首先,根据Acticvity的创建过程中的不同步骤可以将Activity的状态分为以下四种状态:

    1) Active/Running 运行状态

    此状态是用户接触最多的状态,Activity处于可见状态并且可以与用户进行交互,即用户点击界面时Activity可以响应用户的操作。

    2) Paused 状态

    当Activity失去了焦点时,被一个非全屏的Activity或者透明的Activity遮挡时,此时被遮挡的Activity仍然是保持一定的可见性,但是不能响应用户交互的操作。

    3) Stopped状态

    当一个Activity完全被遮挡时,此Activity就会进入到Stopped状态。处于Stopped状态的Activity已经不再可见,但是此时Activity所占有的资源是依然存在的。

    4) Killed状态

    Activity被销毁后被系统回收此时Activity不再占有任何资源,等同于其从未存在过。

    Activity的生命周期

    Activity的不同状态对应了Activity的不同生命周期。Activity提供了控制其状态的生命周期方法,生命周期方法如下图:


    图片来源网络
    1) onCreate()

    onCreate()是创建Activity最先执行的生命周期方法,onCreate()的执行是为了创建一个窗口,一般在开发过程中在onCreate()中设置窗口的风格以及窗口的布局文件。此时窗口只是完成了创建过程,并没有显示出来。

    2) onStart()

    Activity创建过程中的一个过渡周期,一般在执行完onCreate()之后马上执行onStart()方法。大部分开发过程中没有在onStart()方法中进行操作。

    3) onResume()

    当执行完onStart()方法后会立即执行onResume()方法,此时Activity已经可见,执行完onResume()后Activty进入Active/Running状态。

    4) onPause()

    当Activity被遮挡时会调用此方法。例如,弹出一些提示对话框时,对话框后面的Activity就处于Paused状态。若被遮挡的Activity又重新可见(例如,当对话框消失,被遮挡的Activity又可以与用户交互) 这种操作流程会执行onResume()方法。

    5) onStop()

    onStop()方法与onStart()处于一种对应关系,此时Activity已经不可见,但是仍然处于后台运行,其仍然占有分配的资源。

    6) onDestroy()

    onDestroy()方法执行意味着Activity的销毁。此时系统要回收掉Activity占有的资源。例如用户已经退出了某款APP,则手机系统就会回收该APP运行时占有的资源。

    Activity任务栈

    系统是如何管理Activity的呢?每次点击返回键,就会销毁当前的界面回到之前浏览的界面,这种效果是通过Activity任务栈实现的。任务栈可以简单理解为一个装有Activity的栈。当启动一个新的Activity时会将当前的Activity入栈。例如:

    A启动B界面则A入栈,此时B位于栈顶。栈结构为A->B。若B启动C则B入栈。此时栈结构为A->B->C,此时C位于栈顶。若用户点击返回销毁C则ActivityC出栈,此时B再次可见,位于栈顶。

    注:若系统资源充足则不会回收任务栈顶以外的Activity,则当B重新可见时会执行onResume()方法。若系统资源不充足,非任务栈顶的Activity可能被GC回收,则当Activity重新出栈时要重新创建。

    Activity的启动模式

    理解了任务栈的工作原理,下面可以进一步谈谈Activity的启动模式。

    为什么需要启动模式?

    想象一下,当我们连续启动同一个Activity时,系统会将同一个Activity的实例多次放入任务栈中,你就会发现每次点击返回看见的都是同一个界面,导致APP的用户体验变差。为了解决这种问题,安卓提供了四种启动模式控制Activity。

    1) standard 默认模式

    默认的启动模式,每次创建Activity都会新建一个实例并放入任务栈中。


    standard.png
    2) singleTop 栈顶复用模式

    若待创建的Activity已经位于栈顶则不会再次创建新的Activity实例,此时回调onNewIntent()方法获取请求信息。若待创建Activity没有位于栈顶,仍会创建新的实例。例如:


    singleTop.png
    singleTop.png
    3) singleTask 栈内复用模式

    检测当前任务栈是否存在要启动的Activity,如果有则将其置于栈顶,并将其上面的Activity都出栈。如果没有则创建新的Activity。

    singleTask.png
    singleTask.png
    singleTask.png
    4) singleInstance

    单独的生存在一个任务栈中。该任务栈只能有一个Activity的实例。

    如何使用启动模式?

    学习了Activity的启动模式之后,那么如何设置呢?一般设置方法有两种:

    方式1:在AndroidMenifest.xml文件中设置:
    <activity 
        android:name=".SingleTaskActivity"     
        android:launchMode="singleTask" >
    </activity>
    
    方式2:通过为Intent添加标识来设置:

    (1) FLAG_ACTIVITY_NEW_TASK
    使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。

    (2) FLAG_ACTIVITY_SINGLE_TOP
    与指定android:launchMode=“singleTop”效果相同。

    (3) FLAG_ACTIVITY_CLEAR_TOP
    与指定android:launchMode=“singleTask”效果相同。

    (4) FLAG_ACTIVITY_NO_HISTORY
    Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。

    Activity异常生命周期

    以上所说的都是Activity正常情况下的生命周期,但是移动APP的用户场景复杂,就难免存在Activity异常的情况。异常情况大致有以下两种:

    一:资源相关的系统配置发生改变导致Activity被杀死并重新创建

    当系统配置发生改变(比如:横竖屏切换)后,Activity会被销毁,其onPause、onStop、onDestory均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。
    系统配置的改变会引起Activity的重建,那么有什么办法避免重建呢?
    安卓系统提供可了配置Activity的configChanges属性的方法来控制Activity的生命周期。

    二:资源内存不足导致低优先级的Activity被杀死

    Activity按照优先级可以分为以下三个级别:

    (1)前台Activity,正在和用户交互的Activity,优先级最高
    (2)可见但非前台Activity,比如Activity中弹了个对话框,导致Activity可见但是位于后台无法和用户直接交互。
    (3)后台Activity,已经被暂停的Activity,比如执行了onStop,优先级最低。

    当系统内存资源不足时,系统会先回收低优先级的进程,并在后续通过onSaveInstanceState()和onRestoreInstanceState()来存储和恢复数据。若开发者希望自己的进程不会轻易被系统回收,需要保证进程的优先级。

    结语

    通过以上的简单介绍希望可以帮助读者更好的理解Activity。由于本人能力有限,如有差错希望读者及时指出。看完请喜欢支持一下,您的支持就是我的动力。

    相关文章

      网友评论

        本文标题:深入学习Activity

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