onCreate()——onDestory()
onStart()——onStuop()
onResume()——onPause()
再加上一个官方文档中写的onRestart()
生命周期就是重写这些方法,在相应的方法(状态)里执行相应的操作就可以了
<1>onCreate和onDestory——onCreate这个方法会在Activity启动的时候被调用
在这个启动的阶段,也就是在这个方法的内部,你可以去做一些初始化的动作
就是前面我们说到的初始化控件,初始化事件之类的
在这个方法里,也应该通过setContentView这个方法来设置Activity加载的UI内容
使用findViewById来找到这个UI里的各控件
——onDestory中一般执行一些释放资源的操作,同样要注意不要在这里面保存数据,因为这个步骤有可能被跳过,保存数据不安全
<2>onStart和onStop
onStart()是可见的,onStop()不可见
——onStart方法中一般较少设置事件
——onStop方法有些情况下可能不会被执行,比如说切换到另一个界面,但是另一个界面是透明的,所以原界面还是能被看见的,这时候就只会onPause()而不会onStop();还有可能当前系统的内存不足以运行当前的Activity的时候,就会调用onPause()方法而不调用onStop()方法
所以在onStop()方法中不要进行一些保存数据的操作,可能会不安全
<3>onResume和onPause
——onResume方法中一般用于放一些开始动画
——onPuse方法中一般进行保存正在编辑的数据,停止动画等操作
<4>
onStart()可见,但是没有焦点,没有获取到焦点,不可以进行操作
onResume()可见,并且获取到了焦点,可以进行操作,可以交互
onPause(),可见,但失去了焦点,暂停,不可操作
onStop()已经不可见了
一般情况下,onStart和onResume成对出现,onPause和onStop成对出现,例如从主界面跳转到另外一个界面
应该是主界面首先onPause(),onStop(),然后切换回主界面时onStart(),onResume()
但在某些情况下,例如第二个界面是透明的,那么我们虽然切换到了第二个界面,我们还是可以看见主界面的内容,只是不能进行操作
这种情况下主界面切换时就只会onPause(),切换回来时onResume()
<5>横竖屏切换时Activity生命周期的变化
当手机屏幕横竖屏进行切换时,会产生以下操作
onPause()
onStop()
onDestory()
onCreate()
onStart()
onResume()
也就是说Activity会先销毁掉,然后再重新创建
例如,我们一开始在播放器看视频,途中手机切换一下横竖屏,这个时候就相当于创建了一个新的Activity对象,这个对象的值如果不做处理的话,是相对于一个全新的界面,是不同于横竖屏切换之前的状态的
——如何解决横竖屏切换带来的问题呢?
1,禁止旋转,锁定屏幕的方向(常用于游戏开发)
在配置文件Manifest.xml中配置,把要设定为横屏或竖屏锁定的界面Activity中加入一条语句
android:screenOrientation=“ ”(填入portrait就是竖屏,landscape就是横屏)
2,设定界面对配置不敏感(常用于视频播放器开发)
在配置文件Manifest.xml中配置
configChanges后面的这三个选项通常一起使用,意思就是隐藏键盘,屏幕尺寸变化,屏幕方向
——这两种方式都保证了在旋转屏幕的过程中不会销毁原有对象,不需要重走一遍生命周期
在开发中,需要遇到横竖屏切换的场景有:
1,游戏开发,游戏时会用到横屏
2,视频播放器
3,其他使用场景
<6>Activity启动模式
Activity一共有四种启动模式
我们在自己编写界面的时候,自己编写的xxxActivity其实都是直接或间接地继承自Activity,而Activity由系统创建启动的时候,由四种模式,分别是:
1,standard——标准模式
2,singleTop——单一栈顶模式
3,singleTask——单任务模式
4,singleInstance——单例模式
我们要设置Activity的启动模式,具体操作就是在配置清单Manifest.xml里的activity声明中配置加载模式(LaunchMode)即可
(1)Standard模式;
最基本的启动模式,每一次点击就会在任务栈中新加入一个任务,新打开一个界面
点击了多少下任务按钮,就会新建多少个新界面
在返回的时候,也需要按相应次数的返回按钮才能退出程序
使用场景——一般都是用这个模式,如果不进行配置,默认也是这种模式
(2)SingleTop模式:
如果任务栈的栈顶已经是当前要执行的任务了,那么就不会再创建新的任务
使用场景——如果想保证某个任务只有一个,不被创建多个,就可以用这种模式
例如应用的通知推送,如果已经有推送了,就不会一直重复再推送
(3)SingleTask模式:
如果我们要创建的任务不存在任务栈中,那么就会新建这个任务,并且放在栈顶
如果我们要创建的任务存在与任务栈中,就会把这个任务以上的任务全部从任务栈中移除,使它置于栈顶
使用场景——当要打开的任务所占资源比较大的时候
(4)SingleInstance模式:
前三种启动模式,都是在同一个任务栈中的,但SingleInstance比较特殊,它是独立一个任务栈的,在第一次打开的时候会单独创建一个栈来存放这个任务
它独占一个栈,再次点击的时候不会再创建,只是把这个任务栈直接提前到别的任务栈的前面
使用场景——在整个系统中只有唯一一个实例的情况,可以使用这种模式,例如谷歌翻译只需要打开一个,但是它可以在任何别的界面中调取,调取的时候不用重新打开新的谷歌翻译界面,而是把这个任务栈提前就好了