和其他程序不一样的是,activity不是使用main()函数开始程序,Activity实例调用不同的回调函数对应它的生命周期的不同阶段。这里是安装一个顺序去启动一个activity,并且按照一个顺序去关闭activity。
在activity的生命中,系统安装顺序调用生命周期函数的过程类似一个金字塔。生命周期的每个阶段就想金字塔的每一层。系统启动一个新的activity,调用一个个回调函数,就像一步步的到达金字塔顶端。这个顶端就是activity处于前台状态的时候,用户这时可以和它交互。
当用户点击图标启动程序的时候,系统会调用你声明为"launcher"(或者"main")的activity中的onCreate()函数。这个activity就是你的程序界面的主入口。
提示: 当你使用SDK工具创建工程时,默认已经包含一个activity类,并且清单文件中已经声明了这个过滤。
大部分程序都会包含多个不同的activity,允许用户执行不同的行为。不过你以什么方式创建一个activity实例,你都需要先执行onCreate()函数。
警告: 使用SDK_INT组织老的系统去执行新API支持的方法,否则老版本会产生一个运行错误。
activity生命周期第一回调是onCreate(),最后一个回调就是onDestroy()。系统会在activity发出结束信号的时候调用这个函数,然后你的activity实例就会完全被移除系统内存。
提示: 系统会在onPause()和onStopped()函数执行后执行onDestroy(),但是有一种例外:当你在onCreate()方法中调用finish()函数时。有些情况会这样,比如当你的activity临时决定运行其他activity时,你可以再onCreate()方法中调用finish()方法去销毁这个activity。这种情况下,系统会立刻调用onDestroy()而不调用其他生命周期函数。
这节课提供一个生命周期方法的概述,展示了怎么操作第一个回调函数去创建一个新的activity实例。
理解生命周期回调函数
在activity的生命中,系统安装顺序调用生命周期函数的过程类似一个金字塔。生命周期的每个阶段就想金字塔的每一层。系统启动一个新的activity,调用一个个回调函数,就像一步步的到达金字塔顶端。这个顶端就是activity处于前台状态的时候,用户这时可以和它交互。
当用户离开activity的时候,系统调用另外一些回调函数,让activity状态回到金字塔的底部。有时候activity只是走下金字塔的一部分,然后在那里等待(就想用户切换到了其他程序),activity可以从这里重新回到顶端(用户返回activity),处于前台运行状态。
![](https://img-my.csdn.net/uploads/201208/03/1344006971_8743.png)
基于你的activity的复杂度,你可能不必要实现所有的回调函数。不管怎样,理解它们,并且按照用户期望的行为方式实现它们是很重要的。为了确保你的程序保持良好,合理的实现activity生命周期函数有很多方法:
- 如果用户接电话或者切换到其他程序时,你的程序不能崩溃。
- 当用户不使用它时不要浪费宝贵的系统资源。
- 当用户暂时离开程序的时候,不要丢失用户的进度。
- 旋转屏幕的时候不要崩溃和丢失用户进度。
从上面的图我们可以看出,一个activity会在不同的状态间转换。不过只有3个状态的静态的。一段时间中,activity只能处于3个状态中的一个:
Resumed
Paused这个就是activity处于前台时的状态。
Stopped处于这个状态,activity是被其他activity是部分掩盖着的 - 这个其他activity可能是半透明的,或者是没有完全覆盖整个屏幕的。这个状态下,activity不能接受用户的输入,也不能执行任何代码。
其他状态(Created和Started)是短暂的,系统只是快速的经过这些状态到底其他状态。比如,系统调用完onCreate()函数后,很快就调用onStart(),接着很快又调用onResume()。这个状态下,activity是不可见的,它在系统后台运行着。当stopped的时候,activity实例和他的信息状态像成员变量一样被保留,也不能执行任何代码。
这些就是生命周期的基础知识,下面我们将要学习一些特定的生命周期行为。
指定你程序的启动Activity
当用户点击图标启动程序的时候,系统会调用你声明为"launcher"(或者"main")的activity中的onCreate()函数。这个activity就是你的程序界面的主入口。
你可以在AndroidManifest.xml中定义哪个activity是主activity。
主activity必须在清单文件中使用<intent-filter>包含MAIN行为和LAUNCHER分类。比如:
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
提示: 当你使用SDK工具创建工程时,默认已经包含一个activity类,并且清单文件中已经声明了这个过滤。
如果一个程序中没有定义任何的MAIN行为或者LAUNCHER分类,那么你的程序图标不会出现在屏幕的程序列表中。
创建一个实例
大部分程序都会包含多个不同的activity,允许用户执行不同的行为。不过你以什么方式创建一个activity实例,你都需要先执行onCreate()函数。
你必须在onCreate()函数中实现程序的启动逻辑,在整个生命周期中,整个函数只会执行一次。比如,你必须在onCreate()函数中定义你用户界面,实例化一些类的作用域变量。
比如,下面的onCreate()代码执行了activity的一些基本设置,声明用户接口(在XML文件中定义),定义成员变量,配置UI。
TextView mTextView; //成员变量
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置用户界面布局
// 这个布局文件定义在 res/layout/main_activity.xml 文件中
setContentView(R.layout.activity_main);
// 初始化成员变量,一会我们能够操作它
mTextView = (TextView) findViewById(R.id.text_message);
// 确保你能在蜂巢或者更高版本中才能使用ActionBar API
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// 确保程序图标在工具栏中不表现成一个按钮
ActionBar actionBar = getActionBar();
actionBar.setHomeButtonEnabled(false);
}
}
警告: 使用SDK_INT组织老的系统去执行新API支持的方法,否则老版本会产生一个运行错误。
当执行完onCreate()函数后,系统马上连续执行onStart()和onResume()函数。你的activity永远不会处于Created或者Started状态。理论上说,在调用onStart()的时候activity已经处于可见状态了,但是onSumed()马上就会接着执行,并保持状态在Resumed,直到一些事情的发生改变它的状态,比如接电话,启动其他activity,变换屏幕方向。
在下面另外的课程中,你会看到其他启动的方式,onStart()和onResume()方法分别是让activity从Paused或者Stopped状态恢复Resumed状态。
提示:onCreate()函数包含一个参数叫savedInstanceState,我们在会在 重建一个activity 这个教程中讨论。
![](https://img-my.csdn.net/uploads/201208/03/1344007053_2768.png)
销毁Activity
activity生命周期第一回调是onCreate(),最后一个回调就是onDestroy()。系统会在activity发出结束信号的时候调用这个函数,然后你的activity实例就会完全被移除系统内存。
很多程序不需要实现这个函数,因为activity会被本地类销毁,你的activity也必须在onPause()和onStop()中执行大多数清理。如果你在onCreate()中启动了后台线程或者是启动了其他运行比较长的程序,而且没有适当的关闭,那么就有内存泄露的潜在可能,所以你必须在onDestroy()函数中杀掉他们。
@Override
public void onDestroy() {
super.onDestroy(); // 通常先调用父类方法
// 停止方法回溯
android.os.Debug.stopMethodTracing();
}
提示: 系统会在onPause()和onStopped()函数执行后执行onDestroy(),但是有一种例外:当你在onCreate()方法中调用finish()函数时。有些情况会这样,比如当你的activity临时决定运行其他activity时,你可以再onCreate()方法中调用finish()方法去销毁这个activity。这种情况下,系统会立刻调用onDestroy()而不调用其他生命周期函数。