Android之Activity生命周期探索
Task & Back Stack
Android中的Activity全都归属于Task管理,Task是多个Activity的集合,这些Activity按照启动顺序排队存入一个栈(Back Stack)。
Android默认会为每个App维持一个Task来存放该App所有的Activity,默认Task的name为该App的packagename。
可以在AndroidManifest.xml中申明Activity的taskAffinity属性来自定义Task,但不建议使用,因为如果其他App也申请了相同的Task,有可能启动到我们的Activity带来安全问题。
Activity生命周期回调方法
onCreate():在Activity第一次创建的时候调用,在这个回调方法中完成Activity的初始化操作,比如加载布局,初始化控件,绑定监听事件等;
onStart():在Activity由不可见到可见的时候调用;
onResume():在Activity准备好和用户交互的时候调用,此时的Activity一定唯一Back Stack栈顶,并且处于running运行状态;
onPause():在系统准备去启动或者恢复另一个Activity的时候调用;
onStop():在Activity完全不可见的时候调用;
onDestroy():在Activity被销毁之前调用,之后Activity的状态将变为销毁状态;
onRestart():在Activity由停止状态变为运行状态之前调用,Activity重启时调用;
代码下Activity生命周期展示
//创建到销毁的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onDestroy()
//从启动到后台,再到前台的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onStop() ——> onRestart() ——> onStart() ——> onResume()
//从启动到失去焦点,再到获取到焦点的生命周期
onCreate() ——> onStart() ——> onResume() ——> onPause() ——> onResume()
//停止状态(Stopped)Activity被完全遮挡,但保留所有状态和成员信息
Activity的内部调用过程
打开一个新的Activity实例的时候系统依次调用onCreate()、onStart()、onResume()然后开始running运行状态;
running的时候Activity被覆盖系统调用onPause()方法,接下来它有三个选择;
1.用户返回到该Activity就调用onResume()方法重新running运行状态;
2.用户回到桌面或者打开其他Activity就会调用onStop()进入停止状态;
3.系统内存不足或者拥有更高权限的应用需要内存,该Activity的进程可能会被系统回收,想要重新打开就必须重新创建。如果用户返回到onStop()状态Activity,系统会调用onRestart()、onStart()、onResume()然后重新running运行,在Activity结束或者被系统杀死之前会调用onDestroy()方法释放掉所有占用的资源。
Activity的四种状态
活动状态(Active/Running)Activity处于界面最顶端,获取焦点;
暂停状态(Paused)Activity失去焦点,但对用户可见;
停止状态(Stopped)Activity被完全遮挡,但保留所有状态和成员信息;
非活动状态(Killed)Activity被停止;
Activity生命周期的嵌套循环
1.完整生存期:在onCreate()调用和onDestroy()调用之间发生;
2.可见生存期:在onStart()调用和onStop()调用之间发生,系统会在Activity的整个生命周期内多次调用onStart()和onStop(),因为Activity可能会在显示和隐藏之间不断地来回切换;
3.前台生存期:在onResume()调用和onPause()调用之间发生,因为这个状态可能会经常发生转换,为了避免切换迟缓引起的用户等待,这两个方法中的代码应该相当的轻量化;
Activity生命周期交互设计思想
1.多个Activity的生命周期交互
//启动MainActivity
MainActivity:onCreate() ——> onStart() ——> onResume()
//通过MainActivity启动SecondActivity
MainActivity:onPause()
SecondActivity:onCreate() ——> onStart() ——> onResume()
MainActivity:onStop()
//在SecondActivity点击Back键返回MainActivity
SecondActivity:onPause()
MainActivity:onRestart() ——> onStart() ——> onResume()
SecondActivity:onStop ——> onDestroy()
2.为什么要先暂停当前显示的Activity?
为什么MainActivity启动SecondActivity先使用MainActivity的onPause()方法然后再去打开SecondActivity呢?
为什么不在SecondActivity启动完成后再调用MainActivity的onPause()方法呢?
这样设计的原因是为了防止当MainActivity进行着一些功能的时候不对其所在的Activity进行暂停就进入下一个Activity进行操作,很可能因为功能重叠造成很糟糕的用户体验。所以我们在一个Activity进入到另外一个Activity之前要先调用前一个Activity的onPause()方法将这个Activity所有活动暂停后再去执行下一个Activity。
3.为什么要先执行要打开Activity的onCreate()、onStart()、onResume()方法?
这个Google为我们做的一个保护的机制,假设我们在启动SecondActivity的时候出现一些异常信息被crush掉了。如果我们在第一个Activity的onPause()方法之后直接调用onStop方法,那么这个Activity就变成不可见。那么现在这个时候第一个Activity处于不可见状态,第二个Activity被crush掉了,整个应用程序就处于黑屏的状态。
所以Google为了针对这种情况设计的是MainActivity启动SecondActivity先将MainActivity暂停onPause了后启动SecondActivity的生命周期,当SecondActivity完全启动后再调用MainActivity的onStop方法将它置于后台,那么这个时候显示的就是SecondActivity。
Crash:因为程序或者各种原因而导致的程序意外退出,俗称"闪退";