Android查缺补漏--Activity生命周期和启动模式

一、生命周期

  • onCreate():启动Activity时,首次创建Activity时回调。
  • onRestart():再次启动Activity时回调。
  • onStart():首次启动Activity时在onCreate()之后被回调,再次启动时在onRestart()之后被回调。此时Activity已经可见但还没出现到前台不能与用户交互。
  • onResume():在onStart()之后被回调,此时Activity已经完全可见并且可以与用户交互。
  • onPause():当用户返回或者跳转到下一个Activity时会回调此方法,表示正在停止当前Activity,但此时Activity依然可见,通常紧接着会回调onStop()。
  • onStop():表示Activity即将停止。
  • onDestroy():表示Activity被销毁。

值得注意的地方:

  1. onStart和onResume咋看起来差不多,但有一些细微的差别,onStart表示Activity虽然此时已经可见但并没有完全显示到前台,onResume表示此时已经完全显示到前台了,并可以与用户交互了,onPause和onStop区别类似于此。
  2. 当ActivityA启动ActivityB时,他们的生命周期方法执行顺序如下: A.onPause->B.onCreate->B.onStart->B.onResume->A.onStop

日志如下:

12-05 17:18:24.666 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onPause: 
12-05 17:18:24.674 778-778/cn.codingblock.androidadvancestudy I/BActivity: onCreate: 
12-05 17:18:24.687 778-778/cn.codingblock.androidadvancestudy I/BActivity: onStart: 
12-05 17:18:24.688 778-778/cn.codingblock.androidadvancestudy I/BActivity: onResume: 
12-05 17:18:25.006 778-778/cn.codingblock.androidadvancestudy I/MainActivity: onStop: 

1、普通情况下的Activity生命周期方法执行顺序:

  • 启动一个Activity:onCreate()->onStart()->onResume();
  • 当在当前Activity中跳转到下一个页面时(或者被用户切换到后台时),当前的Activity会被暂停:onPause()->onStop();
  • 然后再返回这个Activity时:onRestart()->onStart()->onResume();
  • Activity退出时:onPause()->onStop()->onDestroy()。

2、横竖屏切换时Activity生命周期方法执行顺序:

  • onPause()->onSaveInstanceState()->onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState()->onResume()。

在横竖屏切换时Activity会先被销毁,然后再重新创建,在销毁时onPause()被调用之后会调用onSaveInstanceState(Bundle bundle),此时我们就有机会将一些需要恢复的信息写入onSaveInstanceState()的Bundle参数中,在Activity被重建时,调用onStart()之后会调用onRestoreInstanceState(Bundle bundle),此时我们就可以在onRestoreInstanceState()用来恢复一些必要的信息,而它的参数就是我们在onSaveInstanceState写入的参数。

3、系统内存不足导致低优先级的Activity被回收时的生命周期方法执行顺序

此种情况和第二种横竖屏切换时的情况查不多,也会执行onSaveInstanceState()和onRestoreInstanceState()。

二、四种启动模式

  • standard:默认的启动方式,Activity可以被多次实例化,即同一个栈中可以存在多个Activity实例。

如果用ApplicationContext去启动standard模式的Activity的时候会报错,这是因为此模式的Activity默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并有没有任务栈。解决办法就是在用ApplicationContext启动Activity时指定FLAG_ACTIVITY_NEW_TASK即可,这样在启动Activity时就会为它创建一个新栈。

  • singleTop:栈顶复用模式。以singleTop模式启动的Activity如果已经有一个示例存在==栈顶==,那么再启动这个Activity时就会重用这个示例,并调用onNewIntent()方法。如果不在栈顶,则会创建新的示例,效果如standard一致。
  • singleTask:栈内复用模式。此模式只允许一个栈中只存在一个该Activity的实例,启动此模式的Activity时,如果栈中没有该Activity的实例,则会创建新的实例。如果栈中已经存在该实例了,系统会销毁在其之上的所有Activity,最终让该Activity实例置于栈顶,并回调onNewIntent()方法。
  • singleInstance:单实例模式。该模式的Activity只在一个独立的任务栈中开启,并且这个新的任务栈中有且只有这一个实例。当再次启动该Activity实例时,会重用已存在的任务和实例(并调用onNewIntent)。而该Activity启动的其他Activity会自动运行与另一个任务栈中。

singleInstance和singleTask的区别:

  • singleInstance在同一个时刻,在系统中只会存在一个实例,而singleTask模式的Activity可以有多个实例,只要这些实例在不同的任务栈中即可。
  • 比如应用A启动了一个singleInstance的Activity,而应用B也启动了这个Activity,那么会重用已经启动的实例。

最后想说的是,本系列文章为博主对Android知识进行再次梳理,查缺补漏的学习过程,一方面是对自己遗忘的东西加以复习重新掌握,另一方面相信在重新学习的过程中定会有巨大的新收获,如果你也有跟我同样的想法,不妨关注我一起学习,互相探讨,共同进步!

参考文献:

  • 《Android开发艺术探索》
  • 《Android开发进阶从小工到专家》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货园

Android谈谈封装那些事--BaseActivity和BaseFragment(一)

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53...

1183
来自专栏Android中高级开发

Android开发之漫漫长途 XV——RecyclerView

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1062
来自专栏向治洪

aidl使用采坑记

什么是AIDL? AIDL是 Android Interface definition language的缩写,它是一种Android内部进程通信接口的描述语言...

21310
来自专栏开发之途

Handler、Looper与MessageQueue源码解析

945
来自专栏CodingBlock

小白也能看懂的插件化DroidPlugin原理(三)-- 如何拦截startActivity方法

前言:在前两篇文章中分别介绍了动态代理、反射机制和Hook机制,如果对这些还不太了解的童鞋建议先去参考一下前两篇文章。经过了前面两篇文章的铺垫,终于可以玩点真...

2506
来自专栏刘望舒

Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)

前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程这篇文章,它是基于Android 7.0的,当我开始阅读Android 8.0源码时发现应...

24410
来自专栏Android-薛之涛

Android - 懒加载

如果我们的项目中使用了ViewPager+Framgment实现底部Tab可点可滑,那么我们都知道ViewPager有预加载功能,通过viewpager.set...

772
来自专栏7号代码

深入学习Activity的生命周期和启动模式

说到Activity的生命周期,相信很多人都熟悉,但是深入了解后,发现还是有很多需要注意的细节。这里将生命周期分为两种情况,一种是典型情况下的生命周期,一种是异...

491
来自专栏分享达人秀

四大组件的纽带——Intent

前面学习Activity时己经多次使用了 Intent,当一个Activity需要启动另一个Activity时, 程序并没有直接告诉系统要启动哪个Act...

2065
来自专栏Android干货

Android 购物车功能的实现

3545

扫码关注云+社区