1.简介
2.生命周期
2.1 生命状态概述
Activity是一个很重要、很复杂的组件,他的启动不像我们平时直接new一个对象就完事了,他需要经历一系列的初始化。例如"刚创建状态",“后台状态”,“可见状态”等等。当我们在界面之间进行切换的时候,activity也会在多种状态之间进行切换,例如可见或者不可见状态、前台或者后台状态。当Activity在不同的状态之间切换时,会回调不同的生命周期方法。我们可以重写这一些方法,当进入不同的状态的时候,执行对应的逻辑。
生命周期的一个重要作用就是让activity在不同状态之间切换的时候,可以执行对应的逻辑。我们在界面A使用了相机资源,当我们切换到下个界面B的时候,那么界面A就必须释放相机资源,这样才不会导致界面B无法使用相机;而当我们切回界面A的时候,又希望界面A继续保持拥有相机资源的状态;那么我们就需要在界面不可见的时候释放相机资源,而在界面恢复的时候再次获取相机资源。每个Activity一般情况下可以认为是一个界面或者说,一个屏幕。当我们在界面之间进行导航切换的时候,其实就是在切换Activity。当界面在不同状态之间进行切换的时候,也就是Activity状态的切换,就会回调activity相关的方法。例如当界面不可见的时候会回调onStop方法,恢复的时候会回调onReStart方法等。
2.2 主要生命周期
首先我们先看到最重要的七个生命周期,这七个生命周期是严格意义上的生命周期,他符合状态切换这个关键定义。
1
-
onCreate:当Activity创建实例完成,并调用attach方法赋值PhoneWindow、ContextImpl等属性之后,调用此方法。该方法在整个Activity生命周期内只会调用一次。调用该方法后Activity进入ON_CREATE状态。
该方法是我们使用最频繁的一个回调方法。
我们需要在这个方法中初始化基础组件和视图。如viewmodel,textview。同时必须在该方法中调用setContentView来给activity设置布局。
这个方法接收一个参数,该参数保留之前状态的数据。如果是第一次启动,则该参数为空。该参数来自onSaveInstanceState存储的数据。只有当activity暂时销毁并且预期一定会被重新创建的时候才会被回调,如屏幕旋转、后台应用被销毁等
2
-
onStart:当Activity准备进入前台时会调用此方法。调用后Activity会进入ON_START状态。
前台并不意味着Activity可见,只是表示activity处于活跃状态
前台activity一般只有一个,所以这也意味着其他的activity都进入后台了。这里的前后台需要结合activity返回栈来理解
这个方法一般用于从别的activity切回来本activity的时候调用。
3
-
onResume:当Activity准备与用户交互的时候调用。调用之后Activity进入ON_RESUME状态。
这个方法一直被认为是activity一定可见,且准备好与用户交互的状态。但事实并不一直是这样。如果在onReume方法中弹出popupWindow你会收获一个异常:token is null,表示界面尚没有被添加到屏幕上。
但是,这种情况只出现在第一次启动activity的时候。当activity启动后decorview就已经拥有token了,再次在onReume方法中弹出popupWindow就不会出现问题了。
因此,在onResume调用的时候activity是否可见要区分是否是第一次创建activity。
onStart方法是后台与前台的区分,而这个方法是是否可交互的区分。使用场景最多是在当弹出别的activity的窗口时,原activity就会进入ON_PAUSE状态,但是仍然可见;当再次回到原activity的时候,就会回调onResume方法了。
4
-
onPau