前言
在现在的VR行业中,大多数都是基于Android系统,但是曾经使用频率很高的组件ACTIVITY现在在VR中基本不用,因为VR眼镜的显示大多数使用的是Unity3D 来做的3D 页面。Activity更多的是做一些测试页面。尽管这样我们还是需要简单的看看这个组件,刚入行的小萌新一定要看这个组件。本文中只是简单粗暴的例举了Activity中的一些概念,不熟悉的读者需要自己多去写,多熟悉。基础一定要打牢,这样在后面的工作中才能事半功倍。
一、如何理解Activity
Activity是Android四大组件中使用频率最高的组件,他实际上是一个和用户交互的接口。
二、Activity生命周期
(1)Activity启动
onCreate()
onStart()
onResume()
(2)点击home键返回到桌面
onPause()
onStop()
再次回到原Activity
onRestart()
onStart()
onResume()
(3)退出当前到Activity
onPause()
onStop()
onDestroy()
2.Activity的生命周期函数执行的时机情况如下:
- Activity的启动通常是通过Intent来完成的,启动一个Activity首先要执行的回调函数是onCreate(),在onCreate()中,通常会执行绑定布局,绑定控件(findViewById()),初始化等工作
- 接着会执行onStart()函数,执行之后Activity已经可见了,但是还没有出现在前台,无法与用户进行交互。这时候通常Activity已经在后台准备好了,执行onResume()函数就可以出现在前台和用户交互了。
- 然后就是执行onResume(),然后Activity就可以出现在前台和用户进行交互了
- 如果用户启动了一个新的Activity或者是返回上一个Activity,则Activity会执行onPause()和onStop()函数,执行完onStop()后,Activity就处于了后台
- 当Activity执行完onDestory()方法后,Activity的生命就走向了终结,这是当前Activity最后一次回调生命周期函数,在这个函数中可以做一些资源释放,广播接收器注销的工作等回收工作
- 当用户在其他的Activity或者桌面再切回当前Activity时,当前的Activity就会先执行onRestart()函数,然后执行onStart()函数,最后执行onResume90函数进入到运行态。
三、Activity的状态
Activity有四种状态,分别是Active,Paused,Stopped,Killed他们的意思分别为:
(1)Active
Activity处于运行状态,也就是获取了焦点,可以和用户进行交互,用户可以通过点击,滑动等操作和界面进行互动
(2)Paused
Activity处于暂停状态,也就是失去了焦点,此时Activity并没有被销毁,内存里面的成员变量,状态信息等依然存在,并且这个Activity也有可能还能看见(对用户可见),只是焦点没有在Activity的身上,用户无法和它交互,例如在Activity上方弹了一个对话框,或者是有一个透明的Activity获取了焦点,都会导致当前的Activity处于Paused状态
(3)Stopped
Stopped的状态和Paused的状态相似,他没有被销毁,并且内存中的成员变量等信息仍然存在。在Stopped状态下的Activity是完全不可见的。
(4)killed
Activity已经被销毁了,比如用户点击back键返回上一个界面,或者跳转到其他页面的时候调用了finish()方法,都会使当前的Activity被销毁
四、Activity在异常情况下的生命周期
**哪些场景会使Activity处于异常情况呢?如下:
场景一:资源相关的系统配置发生改变导致Activity被杀死并重新创建,例如如切换深色主题。
Activity被销毁时,回调用onPause,onStop,onDestroy 同时由于Activity是异常终止的,所以系统会调用onSaveInstanceState来保存当前Activity的状态。当Activity被重建时,系统会调用onRestoreInstanceState(),并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法,所以我们可以通过onRestoreInstanceState和onCreate()方法来判断Activity是不是被重建了,若是,我们就可以取出之前的数据并恢复 与此同时,在onSaveInstanceState和onRestoreInstanceState方法中,系统会自动为我们保存当前Activity的视图结构,并且在Activity重建时恢复这些数据:比如文本框中输入的数据,ListView的滚动位置等
场景二:资源不足导致低优先级的Activity被杀死
这里的优先级指的是一个Activity对于用户的重要程度,比如:正在和用户交互的Activity 肯定是最重要的,Activity 的优先级如下: 最高:与用户正在进行交互的Activity,即前台Activity 中等:可见但是非前台Activity,比如一个弹出对话框的Activity,可见但是非前台运行。 最低:完全存在于后台的Activity,比如:执行了onStop();
五、特殊情况下的生命周期分析---横竖屏切换
与横竖屏生命周期函数有关调用的属性是“Android:configChanges”,关于他的属性值设置如下:
orientation:消除横竖屏影响
keyboardHidden:消除键盘影响
screenSize:消除屏幕大小的影响
情况一:当我们设置Activity的Android:configChanges”,属性为orientation或者是orientation|keyboardHidden或者不设置这个属性的时候,Activity的生命周期会走如下流程:
刚启动Activity的时候:
onCreate()
onStart()
onResume()
由竖屏切换到横屏时:
onPause()
onSaveInstanceState()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
由横屏切换到竖屏
onPause()
onSaveInstanceState()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
当我们设置Activity的Android:configChanges”,属性为orientation|keyboardHidden|screenSize或者为orientation|screenSize的时候,Activity的生命周期会走如下流程: 刚启动Activity的时候,会走:
onCreate()
onStart()
onResume()
但是切换横竖屏时不会调用任何的周期函数,但是必须要注意的是:设置了Activity的Android:configChanges”,属性为orientation|keyboardHidden|screenSize或者为orientation|screenSize的时候,切换横竖屏会调用onConfigurationChanged(),不会回调各个生命周期函数
最后附加两个问题:
1.那啥时候Activity单独走onPause()而不走onStop()呢?
当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时,他只会走onPasue,因为系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。所以被覆盖的Activity并不会执行onStop()方法。
2.啥时候Activity的onDestroy不执行?
当用户后台强杀应用时,当前回退栈中只有一个activity实例时这时候强杀是会执行onDestroy方法的,当回退栈中存在多个Activity实例时,栈里面的第一个没有销毁的Activity会执行onDestroy,其他的activity不会执行。
总结
本文主要讲解了Activity的一些概念知识和生命周期的知识,对刚入行的读者起一个抛砖引玉的作用,读者还需在实践中多去写代码,体验不同情况下的代码逻辑。