Activity的生命周期

作者: olaH | 来源:发表于2017-12-24 14:27 被阅读0次

    前言

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

    Activity的生命周期演示

    归纳起来,Activity大致会经过如下4种状态。
    • 运行状态:当前Activity位于前台,用户可见,可以获得焦点。
    • 暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
    • 停止状态:该Activity不可见,失去焦点。
    • 销毁状态:该Activity结束,或Activity所在的进程被结束。
    下图显示了Activity的生命周期及相关回调方法。
    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
    当单击程序中的退出按钮时。
    activity6.PNG

    Activtiy的加载模式

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

    standard模式

    标准模式,这是默认的加载模式。每次通过这种模式来启动目标Activity时,Android总会为目标Activity创建一个新的实例,并将该Activity添加到当前Task栈中——这种模式不会启动新的Task,新Activity将被添加到原有的Task中。
    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的生命周期

        本文链接:https://www.haomeiwen.com/subject/xyhhgxtx.html