前言
你要记得这些人,是这些温暖使你成为善良的。
Activity的生命周期演示
归纳起来,Activity大致会经过如下4种状态。
- 运行状态:当前Activity位于前台,用户可见,可以获得焦点。
- 暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
- 停止状态:该Activity不可见,失去焦点。
- 销毁状态:该Activity结束,或Activity所在的进程被结束。
下图显示了Activity的生命周期及相关回调方法。
从图中可以看出,在Activity的生命周期中,如下方法会被系统回调。
- onCreate(Bundle savedStatus):创建Activity时被回调。该方法只会被调用一次。
- onStart():启动Activity时被回调。
- onRestart():重新启动Activity时被回调。
- onResume():恢复Activity时被回调。在onStart()方法后一定会回调onResume()。
- onPause():暂停Activity时被回调。
- onStop():停止Activity时被回调。
- onDestroy():销毁Activity时被回调,该方法只会被调用一次。
接下来用代码来说明Activity这7个回调方法是何时被调用的。
代码示例
效果
当程序启动时将会自动启动并执行Activity,此时在LogCat窗口可以看到如下输出。
当单击该程序界面上的跳转Activity的按钮时,第二个Activity进入前台,虽然第一个Activity不能获得焦点,但依然“部分可见”,此时刻Activity进入“暂停状态”。如下图
在当前状态下,按下模拟器右边的返回键,Activity再次进入运行状态。
当点击模拟器右边的回到主界面的按键时,Activtiy将进入停止状态。
在模拟器程序列表再次找到该程序并启动它时。
当单击程序中的退出按钮时。
Activtiy的加载模式
Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity。那么Activity的加载模式就负责管理实例化、加载Activity的方式,并可以控制Activity与Task之间的加载关系。下面就来详细介绍它的四种加载模式。
standard模式
标准模式,这是默认的加载模式。每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种模式不会启动新的Task,新Activity将被添加到原有的Task中。
代码示例
public class StandardActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
this.setContentView(layout);
//创建一个TextView来显示该Activity和它所在的TaskID
TextView tv = new TextView(this);
tv.setText("Activity为:" + this.toString() + "\n" + ",Task ID为:" + this.getTaskId());
Button button = new Button(this);
button.setText("启动");
layout.addView(tv);
layout.addView(button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(StandardActivity.this,StandardActivity.class);
startActivity(intent);
}
});
}
}
运行该程序,多次单击程序界面上的“启动”按钮,程序将会不断启动新的StandardActivity实例(不同Activity实例的hashCode值有差异),但它们所在的Task ID总是相同的。
singleTop模式
这种模式与standard模式基本相似,但有一点不同:当将要启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activtiy的实例,而是直接复用已有的Activity实例。
如果将上面实例中StandardActivity的加载模式改为singleTop,(配置Activity时可指定android:launchMode属性)。那么无论用户单击多少次按钮,界面上的程序都不会有变化。
如果将要启动的目标Activity没有位于Task栈顶,此时系统会重新创建目标Activity的实例,并将它加载到Task栈顶——此时与standard模式完全相同。
singleTask模式
采用这种加载模式的Actvity在同一个Task内只有一个实例,当系统采用singleTask模式,启动目标Activity时,可分为如下三种情况。
- 如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。
- 如果将要启动的目标Actvity已经位于Task栈顶,此时与singleTop模式的行为相同。
- 如果将要启动的目标Activity已经存在、但没有位于Task栈顶,系统将会把位于该Activity上面的所有Activtiy移除Task栈,从而使得目标Activtiy转入栈顶。