什么是Activity?Activity的生命周期!

刚刚接触安卓,水平不高但是凭自己的坚持相信能有一个不错的结果,努力一把,趁着年轻逼自己学点东西,贴贴微博希望能得到大家鼓励,share make us better,加油年轻人!!


1.什么是Activity

Activity是安卓四大组件之一(还有Service、BroadcastReceiver、ContentProvider),在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口。当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界面,而这个界面就是提供给用户交互的接口。Android系统中是通过Activity栈的方式来管理Activity的,而Activity自身则是通过生命周期的方法来管理的自己的创建与销毁,既然如此,现在我们就来看看Activity生命周期是如何运作的。

1.生命周期中各个方法的含义和作用

(1)onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……

(2)onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。

(3)onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备

(4)onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。

(5)onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。

(6)onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。

(7)onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。

什么是Activity?Activity的生命周期!_第1张图片
一张来自官方文档( http://developer.android.com/reference/android/app/Activity.html)的图,相信大家都看到过。

现在我们来说一下方法的具体流程:

1.Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime。

2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime。

3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime。

在实际应用场景中:

假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity。那么对AB来说,具体会回调哪些生命周期中的方法呢?回调方法的具体回调顺序又是怎么样的呢?

开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy

至此,Activity栈中只有A。在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。

此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

此时如果按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

此时如果长按Home键,不同手机可能弹出不同内容,Activity生命周期未发生变化(由小米2s测的,不知道其他手机是否会对Activity生命周期有影响)。

由于Android本身的特性,使得现在不少应用都没有直接退出应用程序的功能,按照一般的逻辑,当Activity栈中有且只有一个Activity时,当按下Back键此Activity会执行onDestroy,那么下次点击此应用程图标将从重新启动,因此,当前不少应用程序都是采取如Home键的效果,当点击了Back键,系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面.

验证几个主要的生命周期情况

package com.cmcm.activitylifecycle;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;

import android.view.View;import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button bt;

/** * Activity创建时被调用 * @param savedInstanceState */

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LogUtils.e("onCreate is invoke!!!");

bt= (Button) findViewById(R.id.bt);

bt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(MainActivity.this,SecondActivity.class); startActivity(i);

} }); }

/** * Activity从后台重新回到前台时被调用 */

@Override

protected void onRestart() {

super.onRestart();

LogUtils.e("onRestart is invoke!!!");

}

/** *Activity创建或者从后台重新回到前台时被调用 */

@Override

protected void onStart() {

super.onStart();

LogUtils.e("onStart is invoke!!!");

}

/** *Activity创建或者从被覆盖、后台重新回到前台时被调用 */

@Override

protected void onResume() {

super.onResume();

LogUtils.e("onResume is invoke!!!");

}

/** * Activity被覆盖到下面或者锁屏时被调用 */

@Override

protected void onPause() {

super.onPause(); LogUtils.e("onPause is invoke!!!");

}

/** *退出当前Activity或者跳转到新Activity时被调用 */

@Override

protected void onStop() {

super.onStop(); LogUtils.e("onStop is invoke!!!");

}

/** *退出当前Activity时被调用,调用之后Activity就结束了 */

@Override

protected void onDestroy() {

super.onDestroy(); LogUtils.e("onDestroy is invoke!!!");

}

}


下面我们俩综合分析几种生命周期方法的调用情况

1.我们先来分析Activity启动过程中所调用的生命周期方法,运行程序截图如下:

什么是Activity?Activity的生命周期!_第2张图片
从Log中我们可以看出Activity启动后,先调用了onCreate方法,然后是onStart方法,最后是onResume方法,进入运行状态,此时Activity已在前台显示。因此, Activity启动–>onCreate()–>onStart()–>onResume()依次被调用

2.当前Activity创建完成后,按Home键回到主屏。按如上操作运行截图:


从Log中我们可以看出Activity启动后,先调用了onCreate方法,然后是onStart方法,最后是onResume方法,进入运行状态,此时Activity已在前台显示。因此, Activity启动–>onCreate()–>onStart()–>onResume()依次被调用 2.当前Activity创建完成后,按Home键回到主屏。按如上操作运行截图:

3.当我们点击Home键回到主界面后,再次点击App回到Activity时,调用结果如下:


我们可以发现重新回到Activity时,调用了onRestart方法,onStart方法,onResume方法。因此, 当我们再次回到原Activity时–>onRestart()–>onStart()–>onResume()依次被调用

4.当我们在原有的Activity的基础上打新的Activity时,调用结果如下:

我们可看到原来的Activity调用的了onPause方法和onStop方法。也就是说 在原Activity的基础上开启新的Activity,原Activity生命周期执行方法顺序为–>onPause()–>onStop(),事实上跟点击home键是一样的。但是这里有点要注意的是如果新的Activity使用了透明主题,那么当前Activity不会回调onStop方法。同时我们发现新Activity(SecondActivity)生命周期方法是在原Activity的onPause方法执行完成后才可以被回调,这也就是前面我们为什么说在onPause方法不能操作耗时任务的原因了。

5 当我们点击Back键回退时,回调结果如下:

从Log我们可以看出,当点击Back键回退时,相当于退出了当前Activity,Activity将被销毁,因此 退出当前Activity时–>onPause()–>onStop()–>onDestroy()依次被调用

小结:到这里我们来个小结,当Activity启动时,依次会调用onCreate(),onStart(),onResume(),而当Activity退居后台时(不可见,点击Home或者被新的Activity完全覆盖),onPause()和onStop()会依次被调用。当Activity重新回到前台(从桌面回到原Activity或者被覆盖后又回到原Activity)时,onRestart(),onStart(),onResume()会依次被调用。当Activity退出销毁时(点击back键),onPause(),onStop(),onDestroy()会依次被调用,到此Activity的整个生命周期方法回调完成。现在我们再回头看看之前的流程图,应该是相当清晰了吧。嗯,这就是Activity整个典型的生命周期过程。下篇我们再来聊聊Activity的异常生命周期。

你可能感兴趣的:(什么是Activity?Activity的生命周期!)