Activity的生命周期

前言

你要记得这些人,是这些温暖使你成为善良的。

Activity的生命周期演示

归纳起来,Activity大致会经过如下4种状态。
  • 运行状态:当前Activity位于前台,用户可见,可以获得焦点。
  • 暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
  • 停止状态:该Activity不可见,失去焦点。
  • 销毁状态:该Activity结束,或Activity所在的进程被结束。
下图显示了Activity的生命周期及相关回调方法。
Activity的生命周期_第1张图片
activity.png
从图中可以看出,在Activity的生命周期中,如下方法会被系统回调。
  • onCreate(Bundle savedStatus):创建Activity时被回调。该方法只会被调用一次。
  • onStart():启动Activity时被回调。
  • onRestart():重新启动Activity时被回调。
  • onResume():恢复Activity时被回调。在onStart()方法后一定会回调onResume()。
  • onPause():暂停Activity时被回调。
  • onStop():停止Activity时被回调。
  • onDestroy():销毁Activity时被回调,该方法只会被调用一次。
接下来用代码来说明Activity这7个回调方法是何时被调用的。

代码示例


效果

当程序启动时将会自动启动并执行Activity,此时在LogCat窗口可以看到如下输出。
activity1.PNG
当单击该程序界面上的跳转Activity的按钮时,第二个Activity进入前台,虽然第一个Activity不能获得焦点,但依然“部分可见”,此时刻Activity进入“暂停状态”。如下图
activity2.PNG
在当前状态下,按下模拟器右边的返回键,Activity再次进入运行状态。
activity3.PNG
当点击模拟器右边的回到主界面的按键时,Activtiy将进入停止状态。
activity4.PNG
在模拟器程序列表再次找到该程序并启动它时。
activity5.PNG
当单击程序中的退出按钮时。
Activity的生命周期_第2张图片
activity6.PNG

Activtiy的加载模式

Android采用Task来管理多个Activity,当我们启动一个应用时,Android就会为之创建一个Task,然后启动这个应用的入口Activity。那么Activity的加载模式就负责管理实例化、加载Activity的方式,并可以控制Activity与Task之间的加载关系。下面就来详细介绍它的四种加载模式。

standard模式

标准模式,这是默认的加载模式。每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种模式不会启动新的Task,新Activity将被添加到原有的Task中。
Activity的生命周期_第3张图片
standard1.png

代码示例

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转入栈顶。

你可能感兴趣的:(Activity的生命周期)