前言
Activty是安卓四大组件中最为常用的组件,通常也是安卓开发者最先接触的安卓组件。安卓开发的工作也主要是围绕Activity展开的。因此掌握Activity就显得尤为重要。
对于学习最好是带着问题去研究分析,通过一步步解答疑问可以加深理解。
对于本文要解答的问题主要有以下几个:
- 什么是Activty,Activty的作用是什么?
- Activity的生存状态是怎样的?
- Activity的生命周期是怎样的?
- Activity的启动模式有哪几种,各有什么特点?
什么是Activity?
Activity 对于用户而言就是手机屏幕大小的一块展示数据的界面,这个界面可以接受用户的点击滑动长按等操作,并且对不同的操作做出相应的响应。
Activity对于开发者而言是最常使用的组件。Activity是程序开发者与用户之间沟通的桥梁,想成为一名优秀安卓开发人员就必不可少的要深入的了解Activity。
Activity状态
Activity也是一步步创建出来的,那么开发者怎么才能将自己设计的界面展示给用户呢?Activity是什么时候被创建,又是什么时候被系统回收的呢?这个问题就是Activity的生命周期问题。
首先,根据Acticvity的创建过程中的不同步骤可以将Activity的状态分为以下四种状态:
1) Active/Running 运行状态
此状态是用户接触最多的状态,Activity处于可见状态并且可以与用户进行交互,即用户点击界面时Activity可以响应用户的操作。
2) Paused 状态
当Activity失去了焦点时,被一个非全屏的Activity或者透明的Activity遮挡时,此时被遮挡的Activity仍然是保持一定的可见性,但是不能响应用户交互的操作。
3) Stopped状态
当一个Activity完全被遮挡时,此Activity就会进入到Stopped状态。处于Stopped状态的Activity已经不再可见,但是此时Activity所占有的资源是依然存在的。
4) Killed状态
Activity被销毁后被系统回收此时Activity不再占有任何资源,等同于其从未存在过。
Activity的生命周期
Activity的不同状态对应了Activity的不同生命周期。Activity提供了控制其状态的生命周期方法,生命周期方法如下图:
图片来源网络
1) onCreate()
onCreate()是创建Activity最先执行的生命周期方法,onCreate()的执行是为了创建一个窗口,一般在开发过程中在onCreate()中设置窗口的风格以及窗口的布局文件。此时窗口只是完成了创建过程,并没有显示出来。
2) onStart()
Activity创建过程中的一个过渡周期,一般在执行完onCreate()之后马上执行onStart()方法。大部分开发过程中没有在onStart()方法中进行操作。
3) onResume()
当执行完onStart()方法后会立即执行onResume()方法,此时Activity已经可见,执行完onResume()后Activty进入Active/Running状态。
4) onPause()
当Activity被遮挡时会调用此方法。例如,弹出一些提示对话框时,对话框后面的Activity就处于Paused状态。若被遮挡的Activity又重新可见(例如,当对话框消失,被遮挡的Activity又可以与用户交互) 这种操作流程会执行onResume()方法。
5) onStop()
onStop()方法与onStart()处于一种对应关系,此时Activity已经不可见,但是仍然处于后台运行,其仍然占有分配的资源。
6) onDestroy()
onDestroy()方法执行意味着Activity的销毁。此时系统要回收掉Activity占有的资源。例如用户已经退出了某款APP,则手机系统就会回收该APP运行时占有的资源。
Activity任务栈
系统是如何管理Activity的呢?每次点击返回键,就会销毁当前的界面回到之前浏览的界面,这种效果是通过Activity任务栈实现的。任务栈可以简单理解为一个装有Activity的栈。当启动一个新的Activity时会将当前的Activity入栈。例如:
A启动B界面则A入栈,此时B位于栈顶。栈结构为A->B。若B启动C则B入栈。此时栈结构为A->B->C,此时C位于栈顶。若用户点击返回销毁C则ActivityC出栈,此时B再次可见,位于栈顶。
注:若系统资源充足则不会回收任务栈顶以外的Activity,则当B重新可见时会执行onResume()方法。若系统资源不充足,非任务栈顶的Activity可能被GC回收,则当Activity重新出栈时要重新创建。
Activity的启动模式
理解了任务栈的工作原理,下面可以进一步谈谈Activity的启动模式。
为什么需要启动模式?
想象一下,当我们连续启动同一个Activity时,系统会将同一个Activity的实例多次放入任务栈中,你就会发现每次点击返回看见的都是同一个界面,导致APP的用户体验变差。为了解决这种问题,安卓提供了四种启动模式控制Activity。
1) standard 默认模式
默认的启动模式,每次创建Activity都会新建一个实例并放入任务栈中。
standard.png
2) singleTop 栈顶复用模式
若待创建的Activity已经位于栈顶则不会再次创建新的Activity实例,此时回调onNewIntent()方法获取请求信息。若待创建Activity没有位于栈顶,仍会创建新的实例。例如:
singleTop.png
singleTop.png
3) singleTask 栈内复用模式
检测当前任务栈是否存在要启动的Activity,如果有则将其置于栈顶,并将其上面的Activity都出栈。如果没有则创建新的Activity。
singleTask.pngsingleTask.png
singleTask.png
4) singleInstance
单独的生存在一个任务栈中。该任务栈只能有一个Activity的实例。
如何使用启动模式?
学习了Activity的启动模式之后,那么如何设置呢?一般设置方法有两种:
方式1:在AndroidMenifest.xml文件中设置:
<activity
android:name=".SingleTaskActivity"
android:launchMode="singleTask" >
</activity>
方式2:通过为Intent添加标识来设置:
(1) FLAG_ACTIVITY_NEW_TASK
使用一个新的Task来启动一个Activity,但启动的每个Activity都讲在一个新的Task中。
(2) FLAG_ACTIVITY_SINGLE_TOP
与指定android:launchMode=“singleTop”效果相同。
(3) FLAG_ACTIVITY_CLEAR_TOP
与指定android:launchMode=“singleTask”效果相同。
(4) FLAG_ACTIVITY_NO_HISTORY
Activity使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了,不会保留在Activity栈中。
Activity异常生命周期
以上所说的都是Activity正常情况下的生命周期,但是移动APP的用户场景复杂,就难免存在Activity异常的情况。异常情况大致有以下两种:
一:资源相关的系统配置发生改变导致Activity被杀死并重新创建
当系统配置发生改变(比如:横竖屏切换)后,Activity会被销毁,其onPause、onStop、onDestory均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。
系统配置的改变会引起Activity的重建,那么有什么办法避免重建呢?
安卓系统提供可了配置Activity的configChanges属性的方法来控制Activity的生命周期。
二:资源内存不足导致低优先级的Activity被杀死
Activity按照优先级可以分为以下三个级别:
(1)前台Activity,正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity,比如Activity中弹了个对话框,导致Activity可见但是位于后台无法和用户直接交互。
(3)后台Activity,已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存资源不足时,系统会先回收低优先级的进程,并在后续通过onSaveInstanceState()和onRestoreInstanceState()来存储和恢复数据。若开发者希望自己的进程不会轻易被系统回收,需要保证进程的优先级。
结语
通过以上的简单介绍希望可以帮助读者更好的理解Activity。由于本人能力有限,如有差错希望读者及时指出。看完请喜欢支持一下,您的支持就是我的动力。
网友评论