声明:写下本文主要是为了记录一些学习的笔记,当然了,如果能给别的博友带去帮助,那就更加好了!因为接触安卓开发的时间不是太长,加上文笔有限,如有错误,欢迎指出;如有侵权,还请告知,谢谢!
那么我们直入主题,关于活动(Activity)的生命周期,主要通过七个回调函数来说明:
-
onCreate()
- 每个活动都要重写这个方法,它会在活动第一次被创建的时候调用。在这里可以进行一些简单的初始化操作,比如加载活动对应的布局,绑定事件等,它对应的下一个回掉方法总是onStart();
-
onStart()
- 这个方法会在一个活动由不可见变为可见之前调用。如果对应的活动是进入前台,下一个回掉方法是onResume();如果活动进入被遮蔽状态,下一个回掉方法是onStop();
-
onResume()
- 这个方法在活动就绪,准备跟用户进行交互之前调用。此时活动一定处在返回栈的栈顶,并且处于运行状态。下一个回掉方法总是onPause();
-
onPause()
- 这个方法在系统准备启动或者恢复另一个活动的时候调用。一般会在这个方法中将一些消耗CPU的资源释放,以及保存一些关键的数据。要注意的是这个方法执行速度要快,不然会影响到下一个活动的使用。如果活动进入前台,则下一个回掉方法是onResume(),如果活动被遮蔽,下一个方法是onStop();
-
onStop()
- 这个方法在活动完全不可见的时候调用。如果活动以后还能跟用户交互,下一个回掉方法是onRestart(),如果活动即将销毁,下一个回掉方法是onDestory()。如果启动的新活动是对话框模式的,那么opPause()会得到执行,而onStop()不会。
-
onDestory()
- 这个方法在活动被销毁之前调用。后面就没有回掉方法了。
-
onRestart()
- 这个方法在活动由停止状态变为运行状态之前调用。下一个回掉方法总是onStart();
下面我们通过一个项目来实际查看效果:
首先新建一个安卓项目ActivityLifeCycle,在默认生成的activity_main.xml下面添加两个按钮,,分别用来启动普通的活动以及对话框模式的活动,代码如下:
<RelativeLayout 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" >
<Button
android:id="@+id/btnNormal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/btnNormal" />
<Button
android:id="@+id/btnDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/btnNormal"
android:text="@string/btnDialog" />
</RelativeLayout>
既然有了两个启动不同类型活动的按钮,那么我们还需要新建两个Activity:NormalActivity(对应的布局是activity_normal.xml)和DialogActivity(对应的布局是activity_dialog.xml),两个Activity都是默认生成,我们只在布局文件里面做很小的改动,分别是:
activity_normal.xml:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/title_activity_normal"
android:textSize="20sp" />
activity_dialog.xml:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/title_activity_dialog"
android:textSize="20sp" />
只是 把系统生成的显示helloworld的地方改成了“这是普通模式Activity!”和“这是对话框模式的Activity!”这两段文本。(注意:为了显示对话框模式的的Activity,我们要在AndroidMainfest.xml中对DialogActivity的配置作如下修改):
<activity
android:theme="@android:style/Theme.Dialog"</span>
android:name="com.example.lifecycle.app.DialogActivity"
android:label="@string/title_activity_dialog" >
</activity>
以此标记这是对话框模式的Activity!
接下来我们打开MainActivity,复写七个回掉方法,并且在每个回掉方法里面打印日志,用于跟踪整个生命周期的活动顺序,代码如下:
package com.example.lifecycle.app;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
* Activity生命周期完美呈现
*
* @author Luo
*/
public class MainActivity extends Activity {
// 定义用于日志输出的常量
private static final String TAG = "MainActivity";
// 声明控件
private Button btnNormal, btnDialog;
/**
* 每个活动都要重写这个方法,它会在活动第一次被创建的时候调用。在这里可以进行一些简单的初始化操作,比如加载活动对应的布局,绑定事件等,
* 它对应的下一个回掉方法总是onStart()
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate!!!");
setContentView(R.layout.activity_main);
// 获取控件
btnNormal = (Button) findViewById(R.id.btnNormal);
btnDialog = (Button) findViewById(R.id.btnDialog);
// 添加启动普通模式Activity按钮侦听事件
btnNormal.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent normalIntent = new Intent(MainActivity.this,
NormalActivity.class);
MainActivity.this.startActivity(normalIntent);
}
});
// 添加启动对话框模式Activity按钮侦听事件
btnDialog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent normalIntent = new Intent(MainActivity.this,
DialogActivity.class);
MainActivity.this.startActivity(normalIntent);
}
});
}
/**
* 这个方法会在一个活动由不可见变为可见之前调用。 如果对应的活动是进入前台,下一个回掉方法是onResume();
* 如果活动进入被遮蔽状态,下一个回掉方法是onStop()
*/
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart!!!");
}
/**
* 这个方法在活动就绪,准备跟用户进行交互之前调用。 此时活动一定处在返回栈的栈顶,并且处于运行状态。 下一个回掉方法总是onPause()
*/
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume!!!");
}
/**
* 这个方法在系统准备启动或者恢复另一个活动的时候调用。 一般会在这个方法中将一些消耗CPU的资源释放,以及保存一些关键的数据。
* 要注意的是这个方法执行速度要快,不然会影响到下一个活动的使用。 如果活动进入前台,则下一个回掉方法是onResume();
* 如果活动被遮蔽,下一个方法是onStop()
*/
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause!!!");
}
/**
* 这个方法在活动完全不可见的时候调用。 如果活动以后还能跟用户交互,下一个回掉方法是onRestart();
* 如果活动即将销毁,下一个回掉方法是onDestory();
* 如果启动的新活动是对话框模式的,那么opPause()会得到执行,而onStop()不会
*/
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop!!!");
}
/**
* 这个方法在活动被销毁之前调用。 后面就没有回掉方法了。
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy!!!");
}
/**
* 这个方法在活动由停止状态变为运行状态之前调用。 下一个回掉方法总是onStart()
*/
@Override
protected void onRestart() {
super.onRestart();
Log.e(TAG, "onRestart!!!");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
相关注释已经在代码里面体现,这里不再一一解释,让我们来运行一下程序查看日志输出效果(注意:这里的每次截图都有把上一次的日志先清空):
1、可以发现,MainActivity第一次被创建的时候,我们看到如下界面,只是两个简单的按钮,分别用于启动普通模式的Activity跟对话框模式的Activity:
onCreate() 、onStart()、 onResume()等三个方法依次被执行,看看后台日志:
2、清空日志,点击第一个按钮启动普通Activity,我们看到NormalActivity完全遮盖了MainActivity:
onPause() 、onStop()依次被执行,看看后台日志:
3、清空日志,点击返回键,回到主界面:
由于在这之前MainActivity进入了停止状态,所以onRestart()会先执行、之后依次是onStart()、 onResume(),看看后台日志:
4、清空日志,点击第二个按钮,我们看到对话框界面:
因为是对话框,MainActivity没有被完全遮盖,只有onPause()被执行,此时的MainActivity进入了暂停状态,看看后台日志:
5、清空日志,点击返回键,又回到了主界面,只有onResume()被执行,看看后台日志:
6、清空日志,点击返回键退出程序,onPause()、onStop()、onDestory()依次得到了执行,看看后台日志:
相信经过以上一系列的过程,大家对Activity的生命周期的了解又加深了吧,在此附上官方图片一张:
我还小,但是我愿意成长,小罗,加油!!!