安卓Activity 生命周期

2020-06-02  本文已影响0人  淡燃

简介

先说下什么是Activity?Activity是Android应用的关键组件,它提供了用户与应用进行交互的窗口,开发者可以通过这个窗口对界面进行绘制,展示用户需要的信息。通常,一个Activity实现应用中的一个屏幕。例如一个Activity实现“商品详情”页面,一个Activity实现“商品列表”页面。大多数应用包含多个屏幕,也就是包含多个Activity。通常,应用中的一个Activity会被指定为主Actvity,这就是用户启动应用时出现的第一个屏幕。一个Activity还可以启动另外一个Activity,例如从“商品列表”选择一个商品跳转到“商品详情”。

要想在应用中使用Activity,就必须在AndroidManifest.xml,也叫应用清单文件中使用<Activity></Activity>标签对Activity进行声明,指定需要的属性。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidtest">
    <application
        android:name=".BaseApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"
            android:label="secondActivity">
        </activity>
    </application>

</manifest>

那么什么是Activity的生命周期呢?生命周期是指一个Activity从创建到销毁的过程,Activity提供了一系列的回调方便我们来处理各种生命周期中各种状态之间的转换,下面有一个流程图,介绍了Activity状态转换的过程:

流程图:

image

从Activity的启动开始,Activity的创建会执行下边一系列的回调:

onCreate()[创建,不可见]--->onStart()[可见,不可交互]--->onResume()[可见,可交互],在resume的状态时,这个Activity就可以与用户进行交互,比如常见的点击、手指上下滑动,捏合等。

Activity创建之后,用户不会一直停留在这个页面,当遇到以下几种情况时,Activity的状态就可以改变,下面对流程图进行说明:

  1. 最右边的流程:

    当启动另外一个Activity或者按home键进入后台的时候,Activity从可见变为不可见状态,这个时候会依次执行以下回调

    onPause()[可见,不可交互]--->onStop()[不可见,不可交互]

    我们可以看一下这个时候log打印日志, 日志我省略了无关的信息

    D/test: 页面1 onCreate
    D/test: 页面1 onStart
    D/test: 页面1 onResume
    D/test: 跳转到页面2
    D/test: 页面1 onPause
    D/test: -----页面2  onCreate
    D/test: -----页面2  onStart
    D/test: -----页面2  onResume
    D/test: 页面1 onSaveInstanceState
    D/test: 页面1 onStop
    
  1. 中间的流程:

    当用户点击返回按钮的时候, 我们调用Activity的finish()方法,然后Activity销毁,这属于一种正常的销毁。如图中中间的流程,会依次执行以下回调:

    onPause()[可见,不可交互]--->onStop()[不可见,不可交互]--->onDestory()[销毁]

    这个时候的log日志如下, 页面2的流程

    D/test: -----页面2 点击返回
    D/test: -----页面2  onPause
    D/test: 页面1 onRestart
    D/test: 页面1 onStart
    D/test: 页面1 onResume
    D/test: -----页面2  onStop
    D/test: -----页面2  onDestroy
    
  1. 最左边的流程:

    当系统配置改变(例如屏幕旋转 ), 或者Activity在后台,前台的Activity需要更多资源的时候,系统就必须关闭后台进程来恢复内存,这个时候系统就有可能销毁这个Activity,这种情况就属于非正常销毁。如果要模拟非正常销毁的过程,可以打开手机设置里--开发者选项--不保留活动开关。这种情况下,Activity被销毁之后,当用户再次唤醒这个Activity的时候,Activity就会被系统重建,下面是系统销毁到重建的执行流程:

    onPause--->onStop--->onDestory--->onCreate--->onStart--->onResume()

    同样我们看下这个时候log日志,我使用旋转屏幕来模拟了下系统销毁到创建的过程

    D/test: 页面1 onCreate
    D/test: 页面1 onStart
    D/test: 页面1 onResume
    D/test: Application onConfigurationChanged
    D/test: 页面1 onPause
    D/test: 页面1 onSaveInstanceState
    D/test: 页面1 onStop
    D/test: 页面1 onDestroy
    D/test: 页面1 onCreate
    D/test: 页面1 onStart
    D/test: 页面1 onResume
    

生命周期中的各种回调

下面详细介绍一下Activity的每种回调,大家可以再看一下流程图,想想都有哪些回调,这些回调有什么区别?

Activity被销毁又重建的这种情况下,有一个问题,我们该如何保存View的状态呢?

首先说一下我们为什么要保存View的状态呢?

比如有一个非常复杂的表格页面,需要用户填各种信息,有非常多的文字输入控件,多选框,开关等,但是当用户花了十几分钟终于把页面填完了,这个时候不小心旋转了下屏幕,上边说过,如果配置改变了,页面是会被销毁重建的,那么此时所有填的信息就丢失了,很可怕吧。下面演示了这种情况, 当我们没有EditText设置id的时候,旋转屏幕之后,里边编辑的内容就丢失了:

image

这个时候我们就需要去保存View的状态,保证页面被重新创建的时候View操作的内容依然存在

系统只会保存页面中我们指定过ID的view状态,系统恢复状态时会根据ID找到对应的view去恢复对应的状态,所以我们在创建view的时候,如果想让系统保存它的状态,就一定要设置ID

上一篇下一篇

猜你喜欢

热点阅读