(一)Activity生命周期

(一)Activity之生命周期

一、概念

Activity是Android四大组件之一,其主要功能是与用户交互,向用户显示内容,接收用户输入(点击,滑动),可以说Activity是四大组件中最重要的组件(当然了,其他3个组件也很重要)。那么掌握activity的生命周期就显得很有必要。比如初始化动作适合在哪里做,什么时候该释放资源。点击back和home,activity会发生怎样的变化,两者有什么不同。横竖屏切换的时候,activity生命周期是怎样的。activity弹出dialog,生命周期会发生变化吗?......

带着这些疑问,接下来我们就一块学习下,首先我们先看下都有哪些常见的生命周期

二、生命周期

2.1常见生命周期


Activity共有4种状态:

Active:此时activity位于栈顶,可见,并且正在与用户交互

Paused:activity仍然可见,但是不能与用户交互了。比如启动了一个非全屏的activity或者透明的activity。

Stoped:activity不可见,与不能与用户交互了。启动了一个一般的activity

Destroyed:用户点击back或者系统将activity实例销毁。

onCreate:当Activity第一次被创建时调用。是生命周期开始的第一个方法。在这里我们可以做一些初始化的操作,比如:调用setContentView()方法去加载界面,绑定布局里的一些控件,初始化一些Activity需要用到的数据。之后会调用onStart方法

onStart:当Activity正在变为可见时调用。这个时候Activity已经可见了,但是还没有出现在前台还不能跟用户交互。可以简单理解为Actvity已经可见但是还没有出现在前台。之后会调用onResume

onResume:当Activity可以跟用户交互时调用,这个时候,这个Activity位于栈的顶部。跟onStart相比,它们都是表示Activity已经可见,但是onStart调用时Activity还在后台,而调用onResume时,Activity已经进入了前台,可以跟用户交互了。之后会调用 onPause

onPause:当Activity暂停时调用这个方法;在这里我们可以用来保存数据,关闭动画和其它比较耗费CPU的操作;但是在这里做的操作绝对不能耗时,因为如果当前Activity要启动一个新的Activity,这个新的Activity会在当前Activity执行完毕onPause之后才能进入可见状态。这个方法之后一般会调用的方法有onStop或者onResume

onStop:当Activity进入后台,并且不会被用户看到时调用。当别的Activity出现在前台时,或者Activity会被销毁时,调用此方法;在这个方法调用之后,系统可能会在内存不够的情况下回收Activity;在这个方法之后一般会调用onRestart或者onDestroy

onDestroy:这个方法是Activity生命周期中调用的最后一个方法。它会在Activity被销毁之前调用;Activity销毁原因一般是我们调用Activity的finish方法手动销毁,另一个就是系统在内存紧张的情况下去销毁Activity,以用来节省空间。我们可以通过方法 isFinishing 来判断Activity是否正在被销毁。

onRestart:这个方法是在Activity处于停止状态后,又回到可视状态时调用。之后会调用onResume

常见的生命就是以上这些了,一定要注意理解每个生命周期的意思,这些生命周期都是系统帮我们回调回来的,虽然我们没必要对回调过程做太深入的研究(一般情况下不需要),但是一定要理解,生命周期方法代表的意义。

生命周期其实就是android系统在告诉我们activity处于什么样的状态,我们需要在不同的状态下做不同的事情。

2.2特殊生命周期

(1)back键和home键

back:finish->onPause->onStop->onDestory。也就是说点击了back后,再次进入该activity需要重新onCreate

home:onPause->onStop。此时Activity实例并没有销毁,所以再次进入时走onRestart->onStart->onResume

注意两种方式生命周期的不同

(2)结束:finish和onDestroy

finish,比如用户点击back,会主动回调finish,最终销毁Activity实例

onDestroy,系统回调的生命周期,也会销毁Activity实例

我们看一下finish的源码

    /**
     * Call this when your activity is done and should be closed.  The
     * ActivityResult is propagated back to whoever launched you via
     * onActivityResult().
     */
    public void finish() {
        finish(DONT_FINISH_TASK_WITH_ACTIVITY);
    }
都是去结束activity,区别就是一个是主动,一个是被动

我们知道,系统会尽可能的保存运行的进程,一旦内存吃紧,就会根据一套规则去清理进程,一旦应用因为内存原因被系统强制回收了,那么再次进入的时候是可以保存之前的状态的,是怎么回事呢?这里引入2个生命周期

(3)保存/恢复,onSaveInstanceState,onRestoreInstanceState

onSaveInstanceState,部分注释如下

/**
     * Called to retrieve per-instance state from an activity before being killed
     * so that the state can be restored in {@link #onCreate} or
     * {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
     * will be passed to both).

意思就是说当Activity将要被killed时候调用,以便再次打开该Activity时可以通过Bundle对象恢复数据。

用户主动销毁的Activity不会调用,只有系统未经用户允许的情况下,销毁了Activity,这时候才可能会调用。

onRestoreInstanceState,不做详细研究,保存的时机和作用清楚了,恢复的意思显而易见。

(4)onNewIntent

还是先看定义

     * This is called for activities that set launchMode to "singleTop" in
     * their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
     * flag when calling {@link #startActivity}.  In either case, when the
     * activity is re-launched while at the top of the activity stack instead
     * of a new instance of the activity being started, onNewIntent() will be
     * called on the existing instance with the Intent that was used to
     * re-launch it.

从字面上理解,一个新的intent。我们知道,启动activity,是需要intent的,onNewIntent其实就是再次启动activity时的回调方法。

注意,这个方法不是再次启动activity就一定会调用。当可以复用activity实例时,会调用。不单是singleTop,其他启动模式只要复用都会调用,默认的启动模式是永远创建新实例,所以永远不会调用

关于启动模式的可以看下一篇 《启动模式》,结论:activity复用,就会调用onNewIntent

你可能感兴趣的:(Activity生命周期,生命周期,Activity,Android,技术)