美文网首页
简析Activity的生命周期

简析Activity的生命周期

作者: 爱吃菜的汪 | 来源:发表于2018-05-10 16:04 被阅读0次

欢迎来我的个人博客坐坐 --> 传送门

Activity作为四大组件之一,出现的频率相当高,我们在Android的各个地方基本都能看见它的踪影。之前学习安卓的时候只是知道Activity的生命周期是什么,有哪几个,但具体的详细的东西却不知道,在看过大量的博客之后,才掌握了Activity的生命周期,本文是我对其生命周期的认识的简单总结。

Activity的状态

Android使用任务栈来管理活动的,一个任务就是一组存放在栈里的活动集合,这个栈也被称为返回栈,系统总是会显示处于栈顶的Activity,当按下Back键或者finish()销毁一个活动时,处于栈顶的活动就会出栈。

每个活动在其生命周期中最多可能会有四种状态:

运行状态

当一个Activity位于返回栈的栈顶时,这个Activity就处于运行状态。此时Activity处于可见状态,可与用户进行交互。系统最不愿意回收的就是这种运行状态的活动,因为这会带来非常差的用户体验。

暂停状态

当一个Activity不再位于栈顶,但依然可见时,这个Activity就进入了暂停状态。此时Activity可见,但无法与用户进行交互。例如,当应用弹处一个对话框后,对话框下面的页面依然部分可见,但点击其上的Button等控件时就不会有任何反应了。处于暂停状态的Activity依然是存活的,系统也不愿意去回收这种状态的活动,只有在内存极低的情况下,系统才会考虑去回收这种Activity。

停止状态

当一个Activity被另一个Activity完全覆盖时,被覆盖的Activity就会进入停止状态,此时它不再可见,但是跟暂停状态一样,保持着其所有状态信息及其成员变量。但是这并不是完全可靠的,当其他地方需要内存时,处于停止状态的Activity就有可能会被系统回收。

销毁状态

当一个Activity从返回栈中移除之后就变成了销毁状态。系统会最倾向于回收处于这种状态的Activity,从而保证手机内存充足。

Activity的生存期

周期,即活动从开始到结束所经历的各种状态。

生命周期即Activity从开始到结束所经历的各个状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的状态就叫做生命周期。

先上一张图


Activity-cn.png

图片来自网络

相信学习安卓的人对这幅图都很熟悉,这是安卓Activity的生命周期活动图,详细而直观得表现了Activity各生命周期间的关系。

Activity类中定义了 7 个回调方法,覆盖了活动生命周期的每一个环节。下面就来介绍一下这七个方法。

1,onCreate()

​ create表示创建,这是Activity生命周期的第一个方法,也是我们在Android开发中接触的最多的生命周期方法,它会在活动第一次被创建的时候调用。我们创建活动的时候一般都需要重写这个方法,在其中进行一些初始化的操作,比如使用setContentView加载布局,对一些控件和变量进行初始化等 。此时Activity还在后台,不可见

2,onStart()

​ start表示开始,当这个方法被回调的时候,表示活动已经由不可见变为了可见,但是还没出现在前台 ,因此与用户无法交互

3,onResume()

​ resume表示继续,这个方法在活动准备好与用户进行交互的时候调用。当此方法回调的时候,说明了Activity一定处于返回栈的栈顶,并且处于活动状态。onResume方法与onStart的相同点是两者都表示Activity可见,只不过onStart回调时Activity还是后台无法与用户交互,而onResume则在前台已显示,而且可与用户交互

4,onPause()

​ pause表示暂停,在当前Activity被遮挡时调用。当前Activity要跳到另一个Activity或应用正常退出时都会执行这个方法,此时当前Activity在前台并可见 。还有就是当前Activity被其他Activity覆盖其上但仍然可见时,例如弹出对话框,系统会调用此方法,暂停当前Activity的执行,完成后返回onResume。此时Activity与用户无法交互

5,onStop()

​ stop表示停止,一般在onPause方法执行完成后直接执行,表示Activity即将停止或者完全被覆盖(停止状态),此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。

6,onRestart()

​ restart表示重新启动,这个方法在活动由停止状态变为运行状态之前调用,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。

7,onDestroy()

​ destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。


2216fJGDb7.png

通过上面的了解我们发现其实Activity中的方法除了 onRestart 都是两两对应的,这张图更好的帮助我们记忆各方法的特点。

项目演示

这里我们写了一个很小的程序来演示。PlayActivity为起始页,其和 SecondActivity 用作配合演示,这里不再贴其代码。

mark

演示代码

public class MainActivity extends AppCompatActivity {

    private Button mbtn1;
    private Button mbtn2;
    private AlertDialog.Builder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("Info","onCreate() is invoked!");


        mbtn1 = findViewById(R.id.btn);
        mbtn2 = findViewById(R.id.finish);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent( MainActivity.this , SecondActivity.class);
                startActivity(intent);
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("Info","onStart() is invoked!");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("Info","onResume() is invoked!");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e("Info","onPause() is invoked!");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e("Info","onStop() is invoked!");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("Info","onRestart() is invoked!");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("Info","onDestroy() is invoked!");
    }
}

演示结果

当从PlayActivity跳转至新建MainActivity时:

05-09 14:21:31.587 25282-25282/com.example.caseactivity I/Info: onCreate() is invoked!
05-09 14:21:31.589 25282-25282/com.example.caseactivity I/Info: onStart() is invoked!
05-09 14:21:31.591 25282-25282/com.example.caseactivity E/Info: onResume() is invoked!

当从MainActivity跳转至新建SecondActivity时:

05-09 14:22:40.259 25282-25282/com.example.caseactivity E/Info: onPause() is invoked!
05-09 14:22:40.469 25282-25282/com.example.caseactivity E/Info: onStop() is invoked!

当从SecondActivity返回至MainActivity时:

05-09 14:23:24.068 25282-25282/com.example.caseactivity E/Info: onRestart() is invoked!
05-09 14:23:24.069 25282-25282/com.example.caseactivity I/Info: onStart() is invoked!
05-09 14:23:24.070 25282-25282/com.example.caseactivity E/Info: onResume() is invoked!

当MainActivity按Button运行finish() 以及按手机返回键返回至PlayActivity时:

05-09 14:23:50.352 25282-25282/com.example.caseactivity E/Info: onPause() is invoked!
05-09 14:23:50.543 25282-25282/com.example.caseactivity E/Info: onStop() is invoked!
05-09 14:23:50.543 25282-25282/com.example.caseactivity E/Info: onDestroy() is invoked!

当在MainActivity时,按手机Home键返回至手机桌面时:

05-09 14:25:19.606 25282-25282/com.example.caseactivity E/Info: onPause() is invoked!
05-09 14:25:19.640 25282-25282/com.example.caseactivity E/Info: onStop() is invoked!

当使用手机任务管理器将应用再次打开时:

05-09 14:25:48.552 25282-25282/com.example.caseactivity E/Info: onRestart() is invoked!
05-09 14:25:48.554 25282-25282/com.example.caseactivity I/Info: onStart() is invoked!
05-09 14:25:48.555 25282-25282/com.example.caseactivity E/Info: onResume() is invoked!

小结

根据Log的结果,可以很清晰的了解到Activity的变化:

  • 当Activity启动创建时,依次会调用onCreate()、onStart()、onResume()
  • 而当Activity退居后台时(变得不可见,即被新的Activity完全覆盖,或者点击Home回到桌面),onPause()和onStop()会依次被调用。
  • 当Activity重新显示(被覆盖后又回到原Activity时,或者从桌面再回到原Activity)时,onRestart()、onStart()、onResume()会依次被调用。
  • 当Activity退出销毁时(点击back键或者运行finish()方法后),onPause()、onStop()、onDestroy()会依次被调用

到此Activity的整个生命周期方法回调完成。现在我们再回头看看之前的流程图,应该是相当清晰了吧。嗯,这就是Activity整个典型的生命周期过程。

关于Activity的简析到此结束。后面随着继续学习,我会再总结其他异常情况下Activity的生命周期。

参考资料:《第一行代码》以及相关博客文章。
欢迎来我的个人博客坐坐 --> 传送门

相关文章

网友评论

      本文标题:简析Activity的生命周期

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