Activity的生命周期

时间:2021-06-11 14:44:05

Activity是存放在栈(返回栈Back Stack)中的,栈是一种先进后出的数据结构;当我们打开了一个新的Activity时,该Activity会将前面的Activity压入栈底,当前打开的Activity代替前一个处于栈顶位置;当我们按下安卓手机的back键或者是调用finish()方法去摧毁一个活动时,这时处于栈顶的Activity就会出栈,而前一个Activity又会回到栈顶的位置。

在介绍Activity的生命周期之前,先介绍一下Activity在生命周期中可能出现的四种状态。

状态1Running(运行)状态:当一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端;此时它处于可见并可和用户交互的运行状态。系统最不愿意回收的就是处于运行状态的活动,因为这会带来非常差的用户体验。
状态2Paused(暂停)状态当:Activity被另一个透明或Dialog样式的Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互。
状态3Stopped(停止)状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
状态4Killed(销毁)状态:Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动才可以显示和使用。

在上述4种状态中,Running状态和Paused状态是可见的,Stopped状态和Killed状态时不可见的。

Activity类中定义了七个回调方法,覆盖了Activity生命周期的每一个环节,注意:实现这些生命周期方法时,必须保证在其它代码之前首先调用一下父类的方法(super.回调方法)

在详细讲这七个回调方法之前,先贴上官网的一张Activity的生命周期图

Activity的生命周期 

1、onCreate()

之前创建的HelloWorld程序中的MainActivity.java文件中就出现了该方法,其实,对于每个活动,我们都要重写该方法。在上图中,我们可以看到:当活动被启动时,首先会调用onCreate()方法,且只会调用一次。在该方法中一般是用来完成活动的初始化操作,比如说加载布局、绑定事件等。因此在实现该方法的同时,还需要实现Activity的重要组件, 最重要的是,必须在onCreate()方法中调用setContentView()来关联Activity用于与用户进行交互的布局。

2、onStart()

该方法是在Activity界面被显示出来的时候调用的。

3、onResume()

该方法是在Activity准备好了与用户进行交互的时候调用。由上面官网给出的生命周期图中可以看出,当程序第一次启动时,会依次调用onCreate()onStart()onResume()三个方法,然后活动处于运行状态,前面了解到:当活动处于运行状态时,Activity是一定位于返回栈的栈顶的。

4、onPause()

该方法在系统准备去启动或者恢复另一个Activity的时候调用。此时该Activity处于暂停状态,不过还是可见的。我们通常会在该方法中将一些消耗CPU的资源释放掉,以及执行保存一些当前关键数据的操作。但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

5、onStop()

该方法表示另一个Activity完全启动,使得当前的Activity不再可见的时候,将调用该方法,此时该Activity处于停止状态。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。

6、onDestroy()

该方法在退出当前Activity时调用,当然如果程序中调用finish()或者说Android系统当前资源不够用时也会被调用,之后活动将处于销毁状态。

7、onRestart()

在之前的Activity被重新启动时调用该方法,

 

下面通过代码来体验一下Activity的生命周期;在创建的LearnActivity项目中,创建两个ActivityMainActivity.javaSecondActivity.java和两个布局文件first_activity.xmlsecond_activity.xml;其中MainActivity.javafirst_activity.xml关联,SecondActivity.javasecond_activity.xml关联。具体代码如下:

MainActivity.java

public class MainActivity extends Activity implements View.OnClickListener {
private Button create_dialog, start_secondActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_activity);
Log.i(
"Tag", "onCreate");
// The activity is being created.

//获取Button组件
create_dialog = (Button) findViewById(R.id.create_dialog);
start_secondActivity
= (Button) findViewById(R.id.start_secondActivity);
//以实现View.OnClickListener接口的方式为Button组件添加事件监听器
create_dialog.setOnClickListener(this);
start_secondActivity.setOnClickListener(
this);
}

@Override
protected void onStart() {
super.onStart();
Log.i(
"Tag", "onStart");
// The activity is about to become visible.
}

@Override
protected void onResume() {
super.onResume();
Log.i(
"Tag", "onResume");
// The activity has become visible (it is now "resumed").
}

@Override
protected void onPause() {
super.onPause();
Log.i(
"Tag", "onPause");
// Another activity is taking focus (this activity is about to be "paused").
}

@Override
protected void onStop() {
super.onStop();
Log.i(
"Tag", "onStop");
// The activity is no longer visible (it is now "stopped")
}

@Override
protected void onRestart() {
super.onRestart();
Log.i(
"Tag", "onRestart");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.i(
"Tag", "onDestroy");
// The activity is about to be destroyed.
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.create_dialog:
//创建AlertDialog实例
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
//为AlertDialog设置其属性
dialog.setTitle("This is a Dialog");
dialog.setMessage(
"something");
//在对话框中添加两个按钮,并添加事件监听器
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//取消对话框
}
});
dialog.setNegativeButton(
"取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
//取消对话框
}
});
dialog.show();
//将创建的对话框显示出来
break;
case R.id.start_secondActivity:
Intent intent
= new Intent();
intent.setClass(
this, SecondActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}

SecondActivity.java

public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
}
}

first_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools
="http://schemas.android.com/tools"
android:layout_width
="match_parent"
android:layout_height
="match_parent"
tools:context
="com.rocking.learnactivity.MainActivity"
android:orientation
="vertical">
<Button
android:id="@+id/create_dialog"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:text
="创建一个Dialog"/>
<Button
android:id="@+id/start_secondActivity"
android:layout_width
="match_parent"
android:layout_height
="wrap_content"
android:text
="启动第二个Activity"/>
<TextView
android:layout_width="match_parent"
android:layout_height
="wrap_content"
android:layout_gravity
="center"
android:text
="这是第一个Activity"/>
</LinearLayout>

second_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools
="http://schemas.android.com/tools"
android:layout_width
="match_parent"
android:layout_height
="match_parent"
tools:context
="com.rocking.learnactivity.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height
="wrap_content"
android:text
="这是第二个Activity"/>
</LinearLayout>

当然,别忘了在AndroidManifest.xml文件中对创建的两个Activity进行注册:

<activity
android:name=".MainActivity"
android:label
="This is FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"/>

代码完成之后,就可以开始运行程序了,运行状态与结果如下:

1、运行程序,使程序自动在手机上打开MainActivity的界面,此时通过打印信息可以发现MainActivity依次调用了onCreate()onStart()onResume()方法。

Activity的生命周期

2、当我们点击"启动第二个Activity"的按钮时,此时SecondActivity代替MainActivity处于返回栈的栈顶位置。MainActivity依次调用onPause()onStop()方法。

Activity的生命周期 

3、按下手机的back键,又从SecondActivity回到MainActivity界面时,MainActivity会依次调用onRestart()onStart()onResume()方法。

Activity的生命周期 

4、当按下手机的home键或者是锁屏时,MainActivity会依次调用onPause()onStop()方法

Activity的生命周期 

5、用户在之前按下home键的基础上又回到了程序,或者是解锁完屏幕,此时又是处于MainActivity界面。它会依次调用onRestart()onStart()onResume()方法。

Activity的生命周期

6、当点击"创建一个Dialog"的按钮时,会在MainActivity的界面上显示一个对话框,但是和了解到的活动失去焦点,但是可见时,会调用onPause()方法相反。MainActivity并没有调用任何的方法(PS:如果是当前Activity弹出的Dialog则不会执行Activity任何生命周期中的方法,只有其它Activity弹出了Dialog或者拦住了当前的Activity才会执行onPause()方法)

7、点击back退出程序或者是先按home键退到主界面,再进行内存清理时,MainActivity会依次调用onPause()onStop()onDestroy()方法。不过在MainActivity界面直接通过清理内存结束该程序,则只会调用onPause()方法。

Activity的生命周期